2012年5月28日星期一

Linux下传送文件描述符的几个问题

这两日仍抽空忙于项目的设计开发,遇到了两个关于Linux下传送文件描述符的问题,记录如下:

1. Linux不支持类似SystemV的流管道传递文件描述符(即非FIFO/tcp socket等),只支持通过UnixSocket方式。目前只有类似Solaris的系统支持前者。

   不得已,修改了arch中相关代码,单独打开了一对UnixSocket专用于文件描述符传送。

2. 64位系统下,接受文件描述符侧进程在recvmsg调用返回后结构struct msghdr变量中msg_controllen大小较结构struct cmsghdr变量中cmsg_len大4个字节;在32位系统下两者相等。

    在64位系统只传送1个文件描述符的情况下,前者大小为24字节而后者20字节。若按照APUE中代码的判断规则则是失败的,按照UNP中则可以通过。(Ubuntu 64/32)

尤其是后一问题,折腾了许久才发现32位与64位的不同,目前参考UNP修改了判断语句以规避此问题,后续有时间的话还需要对原因进一步探讨。

2012年5月26日星期六

腹诽3

1. 如今地域歧视,地域攻击的现象已经非常严重了,网络论坛上板砖横飞,有不小的一部分就是这些。甚而影响到生活中,如择婿,择友,择工等。这应当是古已有之的陋习,算作中国的劣根性之一吧。《古今谭概》里记有这么一个崇明人(上海崇明岛)反驳太仓人(江苏):”崇明人固不才,然非我;太仓人固多才,然非汝。何得相欺!“ 。这句话可做大部分地域歧视攻击的反驳之语。
2. 有试图扮人生导师的,教导我们说“如果一个人只是质疑并不建设的话,那就只会走向扭曲”, 却不知苏格拉底的主要工作就是整天在街头诘问他人,留下的遗作还是柏拉图整理的言论。(且不说结论有些来得莫名其妙)
3. 记录一下“SICK”这个词,和前段时间欧债危机是的“PIGS”有异曲同工之妙。不同的是国内媒体是不可能大肆宣传的。
4. 想起当初高中时候被物理黄金时代的一些如爱因斯坦,波尔,海森堡这些人物所激,还有志于物理这一行的,却因种种选择了"程序猿“,不胜唏嘘。
5. 17世纪的基督教中有一种命定说:人即使行了足够的善行,没有神恩之助绝不足以获得拯救“,主要理由是“基督为拯救全人类而死,若只是夸张善行以获得救赎,则使基督为拯救人类而死变得似乎是多余的了”。帕斯卡(即物理中的用于压强单位命名之人,同时亦为一著名哲学家)极度支持这种说法,相反教皇教廷却刻意压制这种理论。压制是通过下发圣谕进行的,有趣的是其并未刻意反驳禁止命定的学说,而且其中有这样一条”任何人说基督是为了所有的全人类而死,是一种半柏拉杰派的异端“。
6. 帕斯卡的名言:人不过是一根芦苇,自然界中最脆弱的东西,但他是一根有思想的芦苇。
7. 看了近来大火的《舌尖上的中国》,联想起一个问题:若所有的大小”公仆“们都看了这纪录片,却也非幸事。
8. 边听久石让的音乐,边写代码,算作一小小快事。

2012年5月24日星期四

仰视皇天白日速

最近从零开始写一个创业项目的后台代码,十余天的功夫竟已吭哧吭哧写了上万行代码,可谓“高产”了。同时遇到的并纠结的实际技术问题还是不少,例如mysql无异步C API,NFS存放图片,HTTP服务,protobuf,缓存,关键词搜索等问题,都需要时间一一解决。 不过好在尚有“先见之明”,前年底就开始独力写了一个已用到生产项目中的arch框架,为此次项目省事不少。
这段时间也随手总结加强了几条在后台C/C++开发上的经验/教训:
1. 尽量用进程协作方式,而非多线程
2. 设计实现中,考虑对栈对象友好的方式而非堆对象
3. 异步协议,而非同步协议
4. 尽量避免对象池的应用,用优化的malloc实现代替,如tcmalloc,jemalloc等。(Boost的对象池在大量小对象(10w级)性能糟糕)
5. 通用的功能考虑拆分到独立进程中实现,其它组件通过协议/进程间调用来访问。
6. std::list的size方法不是常量时间,随list长度增加(这倒是以前没想到过的)
7. 默认的G++编译器4.0之后已经提供了部分tr1实现,如hashmap->unordered_map等。
凑足七条,算作“呜呼七歌兮悄终曲”吧。

后记:
1. 这两天读了几篇李商隐和杜诗,愈读愈发觉得积聚了不少沉郁之气。
2. 联想到当下及数月之后,竟隐有“筵席渐散”之感。

2012年5月21日星期一

尼龙,鱼玄机与薛涛

今日继续看一本介绍路易十四时代的书,读到一处介绍一个当时有名的女贵妇,甚至吸引了国王路易十四的沙龙主持者尼龙时,联想到的第一个中国类似的人物是唐代的鱼玄机,出身乐籍,交际广泛。不过却是早夭,不得善终。

回头又想起唐代的另一个女诗人薛涛,应该是更类此人。薛涛亦是出身乐籍,也和当时名流颇多唱酬应和,年高七八十才辞世。《红楼梦》中有几节提到“薛涛笺”,典故即是出自此人。

唐代还有几个类似的人物,唐末宋初似乎还有个花蕊夫人比较有名,不过过了宋代李清照之后,女性中便很少有这类才华横溢的人物出现了,在元明清几乎是绝迹的,这当和逐渐禁锢的社会思想有关。

不过,又想到《红楼梦》中描写的却是另外一番景象。难道竟是明清之时,易安居士之流皆不出深闺?

2012年5月20日星期日

风干的豹尸

昨日重又翻看了半日的海明威的短篇集,忽而想起了杰克.伦敦,一个和海明威有些类似的作家。两人终身示人以硬汉形象,最终都因不为世人知的原因自行了断了自己的生命。
为何自杀?论者纷纭,探幽者众。不过据自己观察,海明威是把答案放到了《老人与海》,《乞力马扎罗的雪》,还有另外一篇记斗牛士之死的短篇等作品中。杰克.伦敦则在半自传《马丁.伊登》里回答。
雄奇者自绝于世俗,或可言以激烈的方式超脱于俗世。
附记:
摘抄《乞力马扎罗的雪》的开头如下,一个非常出色的开头,尚还没有像《双城记》的开头那样被用至滥俗:
"乞力马扎罗是一座海拔19710英尺的长年积雪的高山,据说它是非洲最高的一座山。马基人称西高峰为'鄂阿奇-鄂阿伊',意为上帝的庙殿。在西高峰的近旁,有一具已经风干冻僵的豹子尸体。豹子到这样高寒的地方来寻找什么,没有人作过解释。"

2012年5月19日星期六

“活剥”《诗经》一句

前两天不知怎么突然想起“既见君子,云胡不喜”一句,默诵数遍,倒是有些意味。
默诵既多,兼被当天Twitter的“反动”信息浸染了一次,遂活剥生吞成“既为愤青,云胡不忿”。看起来似乎颇符一般愤青心态,兼志吾心。
最后,仍然想不起为何无由来想起《诗经》中的这一句话,颇觉奇怪。
——附注:昨天特意Google了下,发现知道此句当是从《神雕》一书中得来,而非《诗经》原文。想起此句之因仍是模糊难定。

2012年5月1日星期二

一种代替dynamic_cast的模版RTTI实现

在arch框架中,存在这样一种场景:一个IO Channel上顺序注册了一组handler,分别处理不同类型的事件消息,则当某个事件消息到达时,需要依次判断handler是否能处理该类型的消息。(参考自Jboss-Netty的设计)。这类操作是在网络服务是进行,执行次数最多,因此需要考虑一个高效的实现。
最初的实现是模仿Netty中Java的实现,用dynamic_cast判断(Java中是InstanceOf判断),但用dynamic_cast总觉得不太优雅,性能可能也存在问题(参考附注)。
最近有些空闲时间,重新思考了下这个问题,用了另外一种方法代替dynamic_cast实现
1. 注册handler接口方法用模版方法代替,将该携带类型信息的handler注册到一个和该类型相关的模版类中,如红色框部分。当然,在handler析构时需要去注册    image
image
2. 和该类型相关的模版类用静态set保存注册信息;
image
3. 判断事件类型与handler相关联信息,则可调用该模版类的静态方法。时间复杂度为set的实现决定。这里用tr1::unordered_set保存指针,时间复杂度为O(1)。 从理论上应当比用dynamic_cast快的多。(测试发现新方案较dynamic_cast实现快60%以上)
附注:
1. Google的编程规范强烈建议不要在产品代码中使用dynamic_cast。
2. 据一份评测报告显示,一次dynamic_cast可能消耗数十微秒,这个评测待验证。数十微秒显然太慢了。