标签 C 下的文章

开始'亡羊补牢'

就在昨天,就在我们的项目要结项的时候,一个影响力不亚于’广岛原子弹’的bug出炉了,蒙蔽我近一个月的问题终于被澄清了,不过为时已晚,项目即将上线,如果想彻底地解决这个问题,需要对整个系统的实现架构作调整,目前能做的只是’亡羊补牢’了。

这里先简单的说一下问题的原因吧!熟悉Unix编程的人都知道有’共享内存映射’这回事儿,我们的问题恰巧就出在对’共享内存映射’的使用不当上。由于我们使用的底层库采用的是mmap的匿名共享内存映射,所以这里例子中的共享内存映射默认就指使用mmap的映射。我们可以利用下面的一个例子简单说明一下我在项目中遇到的问题,实际上看完这个’精简版’之后你会认为这很简单亚,怎么会让你困惑一个月,的确是这样不假,但是如果加上了繁杂的上下文后,找起来也并不是件容易的事情。

假设我们有这样的4个进程,它们的亲缘关系是这样的:A是爷爷,B、C是兄弟,并同为A的儿子,而D则是孙子,是B的儿子,用图表示如下:
A
| —- B
|         |—-D

| —- C
问题就出在D利用mmap映射到匿名设备上后,将返回的起始地址赋值给一块由A创建,B、C、D都继承并能访问到的共享内存中的指针。C的任务是读写这块由D创建的这块儿共享内存中的数据。明眼人一眼就可以看出,C是访问不到这块D映射的共享内存的,即使C知道那块内存在D中的地址,但是由于C没有映射,在C进程空间中即使访问那个相同的地址,实际上访问的虚拟内存页也是不同的,最终的结果就是dump core。不光是C就连B、A也都无法访问D的那块共享内存,原因这里不详说,任一本质量上乘的有关Unix编程的书都会讲到这一点。

出现这样的问题,自己有推卸不掉的责任,先撇开责任不谈,反思自己在查找bug过程中的行为,我觉得有两个问题是今后需要改正的:
1、始终质疑别人的代码,导致在查找bug的时候戴上了’有色眼镜’,思维也发生了倾斜,把大部分时间和精力都花在查找别人的代码漏洞中,而忽略了对自己代码的细致地分析。不过这个过程到让我学了不少以前未接触的’知识领域’^_^。
2、测试时态度不够端正。其实项目负责人当初就对这块儿的可靠性有质疑,只是他当时也不能具体说明到底哪个地方的使用会出问题,回头看来自己在测试时测试用例不全,也是导致没有及时发现对症问题的一个重要原因,从而失去了走向查找出正确问题所在之道的机会!

问题既然发生了,那么我们如何来解决这个问题呢?我和leader一起想了若干种方法结果都被我们一一否决,最后拿出了一个折衷的方案,该方案虽然不存在上述问题了,但是它也让我们的系统不能完全满足用户的需求。这个方案说来也简单那就是采用’池策略’,而且这个池也是一个扩展性不好的池,也就是说我们在系统初始化的时候就预先映射完毕所有的内存,这样所有的A进程的子进程都会继承A的内存映射关系,从而解决上述问题,不过这样做实际上就给系统加了一个限制,容量上的限制。

在接下来的另一个类似需求的项目中我们还需要使用这样的架构,而且这个延续的项目需要的系统容量更大,在这个系统中我们需要对整体的系统架构进行改动了,否则一旦出问题,就不再是’亡羊’就可以’补牢’的了!

目前部门内所有项目的架构基本上都是基于’共享内存’的,虽然’共享内存’是最快的IPC对象,但是它同样给系统带来进程同步性能低下、亲缘关系错综复杂等弊端,甚至于对于我们目前项目这样的需求都不能很好的支持。程序庞大,动一发而牵全身。当然对架构的改造也不是一朝一夕之事,需要的是魄力、时间和耐心,起码让我们的Unix程序符合K.I.S.S这种最适合Unix的文化,目前我们采用的这种架构还是比较臃肿的。

算法的回归

关于算法的文章我一直想写,但算法是我的软肋,自己难于下笔。首先自己非科班出身,没有进行过系统的算法设计课程训练;再者自己到目前为止还从未独立设计过一个完整的、实用的算法,在平时工作中较少的涉及到算法设计,这不能说不是一个遗憾。也许有人会问:"算法难道还没有过时吗,算法不是属于'Donald E. Knuth'那一代人的事情吗?'。我很难回答这个问题,不过当我今天看到CSDN上的一篇题为'算法是百度工程师的利器'的文章后,我隐约看到了算法的回归!

谈到目前互联网上最热的是什么?100个人有99个会回答:'搜索',剩下的一个的答案是'Google'。没错!技术公司出身的Google和Baidu在成功背后到底是什么在支撑呢?名为技术,实则算法。Google的成功难道不是'page rank'算法的贡献么?Baidu站在行业的顶峰其脚下也少不了优秀的算法设计。从Baidu工程师入司的练习题也可以看出Baidu是何等的重视算法。可以说搜索引擎技术带来了算法的回归。

2006第四期'程序员'杂志推出了一期技术专题,叫'算法的力量',在我的印象中'程序员'杂志好像是第一次推出算法专题。由于没买这期杂志所以这里也不知道其中的细节。谈到算法我们不能不提到算法的学习。Donald E. Knuth的'The Art Of Computer Programming'可以说是举世公认的算法领域的鼻祖之作,以至于很多人把这三卷书买回家恭恭敬敬的'供起来'^_^。从这点也可以看出如果拿这本书作为教程的话,难度可见一斑。我们还是介绍点'通俗'的。首当其冲的就是MIT的'算法导论'开放课程(6046),最新一期的开放课程还有Video可供下载,主讲教师就是'算法导论第二版'的作者之一Charles E.Leiserson。我觉得大师级人物的课与一般讲师不同之处在于其对知识本源的发掘、揭示和解释,有着亲身体会的大师们的见解会让你身临其境印像深刻。当然这门儿课也是一门'大部头'的课,其教材'算法导论第二版'也是一本足以'砸死人'的'大砖头',国内早在2003年就出版了其英文版,出版社应该是高教。记得当时还在读大三,但我去母校的大学书店买书的时候,店员告诉我"这是哈尔滨第一批展示品,本来是不准备卖的,你消息还挺灵通的吗"。就这样我买下了那本大部头,遗憾的是到目前为止它还和刚买来的时候一样新^_^。

正如百度首席架构师所说:"搜索引擎开发中使用的基本算法大部分都在大学课程中涵盖了。对于一个人来说,在学校学习过这个算法,和能够灵活运用是两个概念。只有通过参与较多的项目开发和程序编写,将算法和应用相结合,才能在这方面得到较好的发展。",单单死扣书本上的东西去学习算法是不能设计出好算法的,必须通过一个不断思考、实践、创新和总结的良性循环,你才能发现算法设计的真谛。最近自己也在理论和实践相结合的锻炼自己的算法能力,而尝试ACM练习是一个很好的将理论和实践相结合的方法,大家也不妨试试。

要想在算法领域有所深入,数学基础必不可少,相信很多人都能意识到这一点,前几天Google的一位科学家吴军在'Google黑板报'上贴出了一篇叫'数学之美'的Blog,也谈了数学工具在Google内部技术研究的重要性。其实对计算机知识认识越深的人越能认识到数学无处不在,CSDN编辑孟岩的一篇文章'数学与算法随想'让我们感受到数学语言的魅力!

题外话:在'南合文斗'的'让泪化作相思雨'-歌曲美妙节奏的驱动下,我的思维好像跑在美国的高速公路上,那是相当的快!周末了,一切都要放下放下!^_^

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



Statcounter View My Stats