2006年四月月 发布的文章

为什么布鲁诺薪水不如阿诺德?

工作的时候喜欢听歌曲,当很投入的时候,实际上歌曲是’左耳进右耳冒’。今天正写着代码呢,突然耳畔响起一段相当标准的普通话音,切换到MP3播放器已看,原来是GF加到MP3列表中的一段普通话考试的练习音,很简短的一段故事,细致品味后却值得每个工作的人反思!

在网上搜了一下,这段话摘自’没有任何借口’一书,这本书早就想看,可就是没排出时间,感觉这个故事很是有现实意义,所以这里摘录下来,就权当收藏了吧,也顺便利用故事的引子来作为这篇Blog的标题。

故事全文如下:
阿诺德和布鲁诺同时受雇一家店铺,拿着同样的薪水。可是一段时间后,阿诺德青云直上,而布鲁诺却仍在原地踏步。

布鲁诺很不满意老板的不公正待遇。终于有一天,他到老板那儿发牢骚了。老板一边耐心地听着他的抱怨,一过在心里盘算着怎样向他解释清楚他和阿诺德之间的差别。

布鲁诺,老板说话了,您去集市一趟,看看今天早上有什么卖的东西。

布鲁诺从集市上回来向老板汇报说,今早集市上只有一个农民拉了一车土豆在卖。

有多少?老板问。
布鲁诺赶快戴上帽子又跑到集市上,然后回来告诉老板说一共有40袋土豆。

价格多少?
布鲁诺第三次跑到集市上问来了价格。

好吧,老板对他说,现在你坐在椅子上别说话,看看别人怎么说。

阿诺德很快就从集市上回来了,向老板汇报说,到现在为止只有一个农民在卖土豆,一共40袋,价格是多少;土豆质量不错,他带回来一个让老板看看。这个农民一个钟头以后还会运来几箱西红柿,据他看价格非常公道。昨天他们铺子的西红柿卖得很快,库存已经不多了。他想这么便宜的西红柿老板肯定会要进一些的,所以他不仅带回一个西红柿做样品,而且把那个农民也带来了,他现在正在外面等回话呢。

此时老板转向布鲁诺,说:现在你知道为什么阿诺德的薪水比你高了吧?

Blog已成为交友中心?

之所以写这样的一个话题,是因为最近一段时间经常收到一些陌生人的邮件,邮件的内容大致相似,一般都是看到我的Blog后,觉得我的Blog经营的还不错,和我这个做技术的有共同语言,想结识一下。能结识这些朋友自己自然感到很高兴,这也可以说是对我的Blog的一种肯定!

晚上在网上随意’游荡’,看到’Laobai‘的一篇文章’blog已成为媒体?‘,这篇文章讲述了Laobai对于blog的新认识。自己也同时反思了一下,对于名人或者名博,blog也许就像’Laobai’说得那样成为了媒体,成为了知名企业的’代言’人;而对于我们这样的平民博客,我渐渐地觉得Blog是否已经成为一个交友中心了?Blog写得时间长了,其实会渐渐的形成一种风格,而我觉得恰恰是这种风格吸引着很多网络上’志同道合’的朋友。以我为例,’Herfool‘觉得我的blog有一定的技术含量而愿意和我结识,Herfool本人也是做技术的,而且方向还很时髦 — Web搜索;’Ada丛‘则是’喜欢我的Bus’,才想在’Wealink’与我link的;甚至有一些朋友通过Blog了解你,并给你提供很多工作上的机会,Dreamhead在这以前曾经不止一次和我谈起。

其实目前很多BSP都和一些社交服务提供商有着合作,比如BlogbusWealink,它们探索着如何利用Blog作为社交圈的一个重要元素,我想这也是Blog作为一个交友中心功能的真实体现吧!很愿意通过自己的Blog结识到众多的朋友,你们也让我更有信心经营好我的这块’一亩三分地’^_^

开始'亡羊补牢'

就在昨天,就在我们的项目要结项的时候,一个影响力不亚于’广岛原子弹’的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的文化,目前我们采用的这种架构还是比较臃肿的。

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

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




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

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

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


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

比特币:


以太币:


如果您喜欢通过微信App浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:



本站Powered by Digital Ocean VPS。

选择Digital Ocean VPS主机,即可获得10美元现金充值,可免费使用两个月哟!

著名主机提供商Linode 10$优惠码:linode10,在这里注册即可免费获得。

阿里云推荐码:1WFZ0V立享9折!

View Tony Bai's profile on LinkedIn


文章

评论

  • 正在加载...

分类

标签

归档











更多