Archive for 十一月, 2007

Evil of Memory Leak

本篇含技术内容,不喜者勿入。

这是一个关于内存泄漏的凄惨故事。内存泄漏,乃是C/C++ Programmer最恐惧的Bug之一;来不知其来,去往往也不知其去,潜伏在层层花括号深处,当你发现它的时候,往往已经是程序崩溃之时。我几天前还被一个诡异的memory bug困扰了一晚,此bug举止异于常bug,在调试时单步执行没有任何问题,但一运行就出一些稀奇古怪的结果。以至于我都无法定位bug的位置,最后不得不借助于石器时代的printf调试大法,在可能出错的位置加上一摞一摞的printf才找到bug的可能位置。就算我已经定位到某一行代码,在我盯着屏幕看了半天,看得眼前快要出现幻觉,还是想不通bug从何而来。果然,从哪里来,到哪里去,是个终极关怀级别的问题。这一块代码和内存分配有关,无奈之下只好重写一遍,用了个稍微不同的逻辑。然后bug消失,程序再次和谐。

我个人喜欢用C写东西,尽管已经有无数与memory leak搏斗的经验,每次仍然免不了犯这类错误,经验虽然不停增长,错误好像未见减少。所以有时候觉得Java, C#这样的带Garbage Collection的语言也不错,但昨天看了一篇文章,讲述了一个C#中的内存泄漏怎样导致200万美金旁落的悲惨故事。涉及到这么大的支票,我们的兴趣总会提高一些。

文章作者是Princeton大学电子工程系的学生,他(当然还有一堆牛人)参加了一项汽车自动驾驶比赛,奖金是2个million。他们控制汽车的程序是用C#写的,有1万行代码。在比赛的最后关头,汽车老是开一会就失去响应,然后要么一头撞到障碍物(例如灌木丛),或者就茫然地在大地上行走直到没油。分析起来,问题出在代码的障碍物探测模块,它负责寻找汽车前进道路上的障碍。当然,如果车已经开过去了,那么刚才路上的障碍信息就没用了,所以会被垃圾回收器处理掉。最后的Bug是,这些对象,理应被丢弃掉的废物,根本没有被回收。一开始只见内存占用像滚雪球一样越来越大,开了一会汽车就歇了。可想而知,2百万肯定是黄了,最郁闷的是都这样了还不知道为什么垃圾回收器就是不干活,正宗的死不瞑目。

比赛完了,牛人们坐下来开会总结经验教训。其中某牛从网上下了个ANTS Profier,分析了他们代码的内存使用,终于看到了问题所在。前面说过这是一个C#式的内存泄漏,并不是说垃圾回收器出了问题,没有处理该回收的内存。虽然微软很不招人喜欢,但要相信它还不至于犯这种错误。垃圾回收器判断一个对象是否该被回收,是根据它能否被当前代码所引用。如果代码里已经不能访问到这个对象,那么它自然是垃圾。出问题的程序里,虽然程序员已经清除了到这些废物对象的引用,但这些对象作为事件的订阅者(subscriber,基本上是C#程序员的黑话),还在被其他活跃对象默默地引用。最后的结果自然是内存耗尽。所以那篇回顾文章的作者在标题里就痛心疾首地喊:”If Only We’d Used ANTS Profiler Earlier…”,言下之意,还在为那几乎到手的200万美金心疼。

这个故事告诉我们一个道理:垃圾回收机制虽然很方便,但它实际上是把一个问题变成了另外一个问题(手动释放内存到去掉所有引用)。相对来说,发生错误的可能性减少了,“去掉所有引用”这句话是我在这里说说的,听起来有些别扭,实际上在代码中是一件比较自然的事,不需要特别操心。但是一旦出错,也更加难以察觉——因为我们几乎不可能跟踪垃圾收集器的动作。所谓一饮一啄,天下没有免费的午餐。

阅读(641 次)

Comments (2)

推荐一篇博文

因为我老是在blog写一些半桶水的技术文,大家的感觉可能是这个家伙无趣得很。今天决定推荐一篇博文,顺便给maoz同学拉拉票(虽然我这儿的访问量实在趋近于零)。maoz同学参加了Feedsky主办的博客大赛,有点像环法,每天都要写一篇命题作文(或者应该叫话题作文),坚持不懈一个月,你就完成比赛了。至于能不能拿到那台作为奖品的手提,鉴于有像和菜头那样的巨无霸参赛,我对maoz同学不表乐观。说实话看到这篇文章还是通过和菜头的blog。写了半天,不见庐山真面目,赶紧给一个链接:

关于父亲

下面是投票链接:投票点此

插播广告完毕。

对于这篇文章,我不知道该做些什么评论。也许就用鲁迅的话,直面惨淡的人生。maoz同学,据我所知(如果我没弄错的话),是属于产量极少的高智商人类,而且,强调一下,是个非常有趣好玩的人。说到这儿插几句,其实以前就看过maoz的blog,但没想到这个挺有意思的blog的主人居然是我的旧识,虽然也有许多年未见了(这句话可能不准确),我对maoz同学的印象也基本停留在N年以前,但想来现在应该也差不太远(希望如此)。但这篇文章,确实不像出自一个比我还小一岁的女孩子之手。

最近似乎几个国产Web 2.0网站都挺热闹,feedsky在办博客大赛,豆瓣的注册用户忽然就到了1000000个。中国的网络,真的是在夹缝里生存,从一开始就营养不良,到现在都不知营养良为何物了,但看到这些成绩,还是值得高兴一下。

阅读(791 次)

Comments (1)

龙书第二版

说到龙书(Dragon Book),喜欢玩编译器和程序语言的老大们肯定是人手一册,在编译器技术这一块的教科书中地位几乎有如圣经。说到这儿又要鄙视一下国产的什么编译原理教材,简直是不知所云,抄都抄得这么潦草。

计算机领域的经典著作,常常会有些“小名”或俗名,如无人不知的TAOCP,C语言圣经K&R,算法入门宝典CLR。TAOCP是书名的缩写,此书堪称最有名的算法书籍,我估计也是被完整阅读次数最少的计算机书籍,之一都省掉了。K&R和CLR都是作者名字的开头第一个字母。龙书算是比较有个性的,这个外号来自其封面。1977年,Alfred V. Aho和Jeffrey D. Ullman写了一本Principles of Compiler Design,封面是一位骑士枪挑一头绿色恐龙,因此得名龙书。到了1986年,此书升级换代,书名变成了Compilers: Principles, Techniques and Tools,沿用至今,作者增加了Ravi Sethi。封面依然是一位骑士和一头恐龙,只不过恐龙变成了红色,骑士则坐在了电脑前。仔细看的话,发现龙身上纹身“Complexity of Compiler Design”,骑士全副武装,盔甲上书“Data Flow Analysis”,夹着一把写着”LALR Parser Generator”的宝剑,盾牌上则写着”Syntax Directed Translation”。

一晃过了20年,龙书终于出了新版。封面当然是骑士斗恶龙。作者又加了一位,篇幅猛增了200多页,变化十分巨大。除了一些古典内容如词法分析,语法分析,语法制导翻译,中间代码生成没怎么动,后面的运行环境,代码优化部分可谓焕然一新。从Run-time Environment这一部分就可以看出程序语言这些年来的变化:Java,.NET,Python,Ruby…自动内存管理已经不是什么新鲜事,所以龙书里开了近半章的篇幅给垃圾收集。内存管理是个大题目,完全铺开来一本书都不够,从目录上看,龙书已经包括了现在主流的一些技术,估计作者安排这一块内容时也死了不少脑细胞。变化最大的当属代码优化,原来只有一章,现在一下子撑成了四章,洋洋洒洒近400页,可以单独成一本书了,较之第一版,作者似乎不满足于做一本入门教材,要一揽子把从入门到高级全包了。

其他内容上的变化,暂时只能从目录上看一下。Flow Analysis增加了一些较新的算法,比如Region-Based Analysis。优化部分花了不少力气讲Parallel Machine,现在看来也是大势所趋。

书肯定是不可能仔细看了;也不知道什么时候会有中文版;这么一本1000页的大砖头翻成中文后也不知道厚成什么样。我个人的一点观察,最近几年动态语言与函数式语言开始逐渐成为主流,用马克思的话,一个函数式编程的幽灵开始在C++/C#/Java中徘徊。现在的编译技术,似乎应该包括Dynamic Typing, JIT等等,特别是种种针对动态语言的优化(比如方法缓存)。作为一本教材,不可能面面俱到,更不能跟风,编者总有自己的原则和取舍,大概龙书的四位作者认为这些东西还不值得进入大学的编译技术课程。但我觉得现在正是一个计算环境变革的前夜;或者说变革已经在进行时了。这样的话,也许下一个版本,不用再让我们等20年。

说到这儿,又要损一下中国这帮写教科书的人。为了避免打击面过广,不失一般性,限定于计算机行业。老外写书,一版二版三版,真是与时俱进。当年Dirichlet写了一本数论讲义,每次重版他的学生Dedekind都会在后面添个附录反映一下最新的研究进展,到最后附录比正文还厚得多。在我国,就少见这种延续性。人家真是把教材当作一项事业来做的。中国最有名的计算机书估计是谭老师的C语言,去年貌似也出了个新版,除了换个封面,里面新瓶装旧酒,继续误人子弟。对谭老师C语言书的声讨网上已经进行多年,我也没有重复的必要。只是想到这些状况,不能不有点觉得外国月亮有点圆。

本来想把电子版放上来,但尺寸实在吓人(近50M),我估计赛族上对这个感兴趣的人也不会太多,如果想要电子版的话,私人联系吧。当然直接google也可以。

下面是三版龙书封面展览:
db_2.jpgdb_3.jpg

db_1.jpg

阅读(1172 次)

Comments (9)

GTM eBook Download

发现一个非常好的电子书下载点,专门收集GTM系列的书。这些书我一本都没看过,但在书店里经常瞻仰。我不知道这样做是不是有版权问题,但是站长的努力还是值得一赞的。自己也下了一堆,我怀疑我到底会不会去看这些数学书,硬盘上已经堆积了无数的电子书了。

地址在这里

阅读(764 次)

Comments (9)

冒个泡

好久没更新了。后天要考sub,这一周疯狂做题看书,试图在遥远的记忆深处找回对力热电光的点点滴滴……可恨的是米国人考试范围铺的太开,从18世纪经典力学到20世纪粒子物理一网打尽。粒子物理虽然堪称科普大户,对物理学后备力量的培养(也包括民科)作出巨大贡献,但真到看到一堆堆的衰变,介子,超子,中微子我还是一阵晕眩,想这回不幸遭遇知识盲点,上了大学后就渐渐对亚原子世界失去兴趣了,现在打交道的范围估计也仅限于低能电子而已。

还好有google,Wiki上基本粒子条目内容详尽,附有精美图片一张。总算弄清了一堆轻子,一堆夸克,和一堆玻色子。基本粒子还是太多了,轻子2×6=12个,夸克是两种电荷,三种色荷,六种味,五毒俱全,一共有36种。胶子是双色态,原则上有9种,但是独立的只有8种。中间玻色子一共3个,算上光子,共有12+36+8+4=56,比一副扑克牌里的扑克还多两。那神秘的Higgs玻色子也不知道在什么地方躲着,所以这个数目似乎还有增长的趋势……

至于由夸克组成的强子,更是花样翻新,名目繁多,希腊字母都快不够用了,可能再过个几十年粒子命名就要用UTF8编码……希望是越来越少,计划生育,而不是人口膨胀,组织臃肿。更头疼的是守恒律,电荷守恒自然是最基本的,此外还有重子数,轻子数,奇异数,本来这些内容在考试中也占不了多大比例,但好奇心上来就想弄个明白,算是恶补了一回基本粒子知识,增加了一些吹牛的资本。在看了这么一大堆东西以后,我认为这些更接近于植物学。

最后查到了一个标准模型的Lagrangian,彻底崩溃。实在太长,放一个pdf供大家一乐:

TooLooooooooooongLagrangian

除了复习,值得一提的就是上网和人掐架,发泄解题失败的郁闷。鉴于这件事已经和平解决(真的?),并且当事人也是Scinese的老大,我就不细说了。

阅读(690 次)

Comments (1)