2009/8

Ulrich Drepper 要来中国

大牛Ulrich Drepper下下周将要来北京,届时会给我们内部作讲座,非常期待!!除此之外,他白天会和我们一起工作,晚上会出席一些LUG的活动。8-)

和牛人们交流经常有醍醐灌顶的感觉。能现场临听牛人的讲座,肯定会胜读十年书啊~~!不知道Ingo什么时候会来中国。:-/

你想知道的 vfork(2) 的全部

最近vfork(2)的问题一再被问到,这里做一个总结,以求终止关于它的疑问。:-)

1. 为啥会有vfork(2)这个东西?

man page中说得很清楚:

However, in the bad old days a fork(2) would require making a complete copy
of the caller’s data space, often needlessly, since usually immediately afterwards an
exec(3) is done. Thus, for greater efficiency, BSD introduced the vfork() system call…
所以其实就是历史原因。从这里我们也可以看出,既然Linux的fork(2)实现使用了COW,所以现在再使用vfork(2)是没太大必要的。后面还提到:
This system call will be eliminated when
proper system sharing mechanisms are implemented. Users should not
depend on the memory sharing semantics of vfork() as it will, in that
case, be made synonymous to fork(2).
2. 为什么使用vfork(2)的限制有那么多?
the behavior is undefined if the process created by vfork()
either modifies any data other than a variable of type pid_t used to
store the return value from vfork(), or returns from the function in
which vfork() was called, or calls any other function before success-
fully calling _exit(2) or one of the exec(3) family of functions.
首先,为什么我只能在其后调用execve(2)和_exit(2)?看内核源代码,vfork(2)其实是通过completion实现的,在do_fork()时wait_for_completion(),而只有在do_execve()和do_exit()时才complete()(mm_release()),所以这就决定了你除了调用这两个系统调用外调用别的都是错的。

其次,为什么我不能从当前的函数中返回?很简单,因为vfork()的实现用的是CLONE_VM,它决定了父子进程之间是完全共享内存的(而不是COW)。所以如果子进程对堆栈内容做了修改,对父进程也会有影响。

一个随之而来的问题是:既然它们共享内存,那为什么子进程执行execve(2)就不会覆盖父进程呢?因为虽然CLONE_VM让do_fork()跳过了复制mm_struct,但是do_execve()在bprm_mm_init()时又创建了一个新的mm_struct。

3. 什么时候我应该使用vfork(2)而不是fork(2)?

90%以上的情况下你不应该这么做。假设父子进程哪个先运行很可能是一个不好的设计,你应该重新设计一下你的程序,或者考虑用其它方法实现。

即将到来的一本书

Linux程序员有福气了!据内部消息透漏,明年上半年我们将会见到又一本砖头厚度的编程书!:)

呵呵,这本书目前甚至还没名字,只知道是关于Linux系统编程的,我真没开玩笑,确实如此,其作者Michael Kerrisk(Linux man page的维护者)提前透漏了这一消息。因为我给man page提交过补丁的缘故,所以也收到他的邮件了。

Michael花了几年的时间写的这本书,共有64章,大约1500页!书的内容简介可以在这里看到,64章目录可以在这里看到。各个章节的目录也可以在其博客的其它文章中找到。从他列出的目录来看,这本书覆盖面是非常全面的,IPC,Socket,Pthread等等,连Robert Love的那个《Linux System Programming》都比不上这个。感觉此书和我曾经推荐过的那本《Unix Systems Programming: Communication, Concurrency, and Threads》有些相似,不过比它还要详细,更重要的是这本书是完全关于Linux的。

此书的目标是既要是一本教程式的入门书,又要是一本手册式的参考书,要做到这点着实不容易。

我们天天读man page(注:并不是所有的man page都是由Michael提供的,不少是安装一个软件时安装上的,这里当然不包括那些),从中我们可以深刻体会到里面用词的精炼性。如果此书的措辞也可以达到那种水平,那无疑将会是另一个大的看点。

另,既然这本书还没有出版,如果你有什么主意或者建议,都可以直接给Michael发邮件告诉他。

期待此书!

信春哥,好处多

最近春哥很火啊,俺也来凑个热闹,楼下可以继续……


春哥的键盘没有退格键,因为春哥从来没有输错的时候。

春哥只要瞥一眼你的桌面就知道你最近上过哪些成人网站。

春哥从来不用vim/emacs,因为cat对他来说就是一个相当够用的编辑器了。

春哥编程序从来不需要编译器,因为春哥用的是机器语言,写出来保存后可以直接运行,而且从来不用调试。

春哥可以从你的/dev/null中发现并破解你的root密码,所以任何Unix系统对春哥来说毫无安全可言。

春哥的计算机从来不需要重启,因为春哥的系统(Chun Ge OS)不会出任何问题,而这个系统据说是春哥用抽一支烟的功夫用机器语言写成的。

自从有了春哥,软件工程彻底完蛋了。

世界上最准确的电子时钟也不如春哥心中的时钟准确,所以NTP其实最终都是到春哥那里去同步的。

春哥都是一个比特一个比特地来完成网络数据传输的,但即便如此,世界上最快的计算机也仍然跟不上春哥的传送速度。

IBM深蓝计算机和春哥下国际象棋,在春哥让了它128步的情况下它仍然输了,哦,对了,春哥只有一个“国王”。

眼皮底下的东西最容易被忽视

事实证明,越是在我们眼皮底下的东西越容易被我们忽视。

月亮我们天天晚上见,碰到日食的时候白天也能见,可就是它,让我们至今仍有很多东西琢磨不透,对于它的来历至今没有一个准确的说法。

人,我们都是,可就是对于我们自己,我们的了解竟然那么少,我们连人类自己是怎么来的都不知道;我们天天在思考,可我们的思考是怎么形成的我们也没搞清楚,我们造出的计算机再先进也不如我们自己的大脑;我们晚上经常做梦,可对于梦,我们至今了解甚少。

神话,我们小时候人人都听过,可有谁会在长大之后还当真?没有,接受教育之后科学告诉我们不应该当真。可是,你有没有想过,如果科学错了神话对了呢?

本书的作者就是从这些“太常见以至于被忽略”的东西上着手写这本书,从科学无法解释的事实,到神话,再到人类自己,一步一步颠覆你对现代科学观点的已有认识。我想作者写此书的目的并不是让你就去相信月亮背后有外星人,而是给你展示一种思考的方式:如何从现有理论无法解释的现象中得出自己的理论去推翻已有的理论。这需要有很大的勇气。

科学中最珍贵的精神就是怀疑,因为只有不断的怀疑才能使科学一步步前进。而如果我们也把这种怀疑的态度应用于科学本身呢?那科学还会依然接受它吗?当我们现代人把现代科学像宗教一样信奉时,这个问题难免会给我们带来尴尬。

现代科技越来越发达,人类难免会产生骄傲自大的心理,骄傲的人类无法去承认自己的科学基础是错的。可试想如果真的有一天,你当宗教一样信奉的科学,你坚信100%正确的真理,被颠覆时(比如更先进的外星文明被发现),你会有何种感受?

读读这本书吧,它能告诉你我们有多么无知!

内核开发 slides 更新

应广大饿狼邀请,今天在公司发起了一个Lunch&Learn,我做了一个关于内核开发的讲座,基本上就是对差不多两年前在西邮时同样一个讲座的更新。有兴趣的可以在下面下载到:

http://wangcong.org/down/kernel-rh.pdf

整理 slides 的过程发现在这近两年的时间中内核开发流程本身也发生了不小的变化,尤其是出了一个linux-next,所以那一部分改动最大。其它部分也因听众的水平做了修改。

以后准备Lunch&Learn中做的讲座有:git,C,haskell…… 相应的 slides 也都会在讲完之后放出。