Ulrich Drepper 讲座

第一次见到大牛Ulrich Drepper,感觉他非常和蔼,在给我们做讲座的过程中感觉他更像一位大学的老师,不管你问什么问题他都会耐心解答,没有一点儿牛人的架子。当然了,比大学老师讲得好多了,那是另一说咯~

这位大牛那是非常能讲,用他自己的话说是他可以讲好几天,早已经习惯了……Orz。而且他讲之前基本上不需要什么准备,有些带 slides 的他是现看现讲,有些没有 slides 的他都是直接张口就说的,出口成章,不用打底稿的~~功力如何可见一斑!他的英语讲得很快,不过还好我基本上都能跟上,大概是因为专业词汇积累得比较多的缘故吧。:)

讲座内容非常丰富,涉及C++,memory, CPU cache, SSE, transactional memory, pthread, glibc等等……说是“一场盛宴”毫不夸张!不少内容我也一时半会儿消化不了。由此可见他绝对是一个软硬通吃的家伙,一直游走在硬件和软件的边缘,对在软件上进行针对硬件的优化搞得出神入化,这绝对是一门艺术,无限敬仰中 ……

在这两天里,听他这些讲座绝对是一种享受!听的过程中我也领悟到一些深层次的东西,因为时间原因我自己也没记录下来,比较可惜……希望以后哪天灵光突现时能想起来吧。至于总结,不是我吝啬,内容实在太多我一时总结不出来,他讲的每个讲座几乎都能写成一篇大的文章来讨论,以后慢慢来。

明后天讲座还会继续有,非常期待后天那个关于编程语言和标准的讲座。

P.S. 只拍了若干张照片,可以在这里看到。

P.P.S. 我知道有些人想要 slides,说实话,现在我也没有,不过他讲的大多数内容都可以在他的主页上找到。有些新的可能还没放上去,我把是否公布这些留给 Ulrich 自己决定。;)

有朋自远方来

这个月月底会有两位朋友从国外来北京。更巧的是这两位赶在同一天来。

Erna会从先从英国到俄罗斯,然后从俄罗斯坐很长很长时间的火车过来(太有才了!)。。。。自从去年在波尔图遇见她已经一年没见了,能在北京再次见面挺不容易的,世界太大啦~!!一直都很羡慕她,去过那么多国家和城市,不知道她的工作为什么允许她有那么多的时间周游世界。:-/ 我也梦想着有那么一天自己能游遍整个世界!

Eugene也在同一天到达,不过这次他会在北京待很长时间,他的假期结束后还很可能会和我们在一起工作一个星期再走。和Eugene在网上认识很久了,可惜一直没能见面,这次终于能碰面了。T_T

“有朋自远方来,不亦乐乎”!

P.S. 哎,十一还没想好去哪,郁闷……首都肯定不能待,要开派对,人不多死才怪~!本来想去邻国转转的,可看到十一出国旅游的有二亿人的新闻之后我立即打消了这个念头!实在不行就回家,然后在山东和江苏转转。

P.P.S. 某派对为了开派对,京城周末都开始限行了,真是应了《潼关怀古》里那句话,“兴,百姓苦;亡,百姓苦。”

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 也都会在讲完之后放出。

命令行下获取page size

用C语言就不说了,很简单。问题是怎么用shell直接得到?我自己想了想,然后又搜了搜,发现了下面这四种方法:

/usr/bin/time -f %Z true

LD_SHOW_AUXV=1 /bin/true | grep PAGESZ

grep ^KernelPageSize /proc/self/smaps

python -c ‘import resource; print resource.getpagesize();’

前两个是google到的,后两个是我自己弄出来的。

我个人觉得最靠谱的是第2个,因为它既不需要依赖python或者perl,而且是从内核获取的。第1个很让人惊讶,因为打死我我也不会想到time这个命令下居然还有获取page size的功能。。。注意,这个time是外置的命令,而非shell内置的那个time。

SB到处有,这里又一个

一般情况下遇到这种SB我是不会理会的,因为很简单,你给那种SB解释任何问题他们都是不会懂的,浪费的时间都够修复一个bug了。

问题是,总会有些SB傻得无药可救,傻就傻吧,傻又不是你的错,可你为什么还非得四处炫耀呢?瞧,这里又来一个。

这人的ID是:lovecreatesbeauty@gmail.c0m,正如你可以在评论中看到的,此人一开始提出的问题是main有问题,恩,显得他很高深,可他不知道的是,我在给别人指main的问题时他还穿开裆裤呢!指也就指吧,没啥,我平静地告诉他那里使用了一个技巧,言外之意就是说main对不对我很清楚。

谁知道这人怎么回复?第一条回复是问我是不是在说判断endian的技巧?扯淡!你自己的留言什么意思你自己不知道?!第二条回复中他似乎意识到自己前一个回复很白痴,于是补了一句Linux内核中没有。放屁!它有才怪呢!它凭什么要有?!貌似他们家的C语言技巧都是出自Linux内核!一个人能傻到这种地步真的挺不容易的!

别慌。他还能继续向我们证明他更傻呢!这个人在链接中给出了这么个地址,稍微有常识的人都看的出来,那是一个patch,那个patch的作者是Changli Gao,我review了这补丁,认为可以接受,然后Linus回复了,回复的意思也很简单,他不喜欢那个patch,他解释说如果用户程序能触发这个问题就说明你那程序是一坨shit。稍微有常识的人都明白这话什么意思:Linus只不过是借虚构的“你那程序”来说明这个问题不应该在内核中修复。而精彩的事情这时发生了!lovecreatesbeauty@gmail.c0m同学成功地把这话联想到了Linus所说的“你那程序”就是我写的程序!太伟大了!真不知道这人上小学时语文怎么学的?!估计他的语文老师看了都会气得跳楼自杀了!唉,语文没学好也就罢了,你找找整个邮件的存档,看看里面到底有没有shit程序啊。问题是他连找到没找就脑残式地下结论了。没找就没找吧,你仔细看看patch不行么?很不幸,他连patch是谁发的到看不出来!所以这个人不光脑残,眼也有问题,那么大大的一行Signed-off-by他看不到!!

一个人究竟能脑残到什么地步?lovecreatesbeauty@gmail.c0m同学就是一个活生生的例子!真是SB后浪推前浪啊~!

lovecreatesbeauty@gmail.c0m同学:我认为批准你这些脑残式的回复纯属浪费时间,所以你的回复以后都会被删除,千万别说什么限制你评论自由!我从不限制正常人的评论自由!你属于脑残,不在此列!另外,回家好好跟你语文老师学学语文,别人家正常人说话你都听不懂,OK?跟你的英语老师好好重学一遍英语,别英语都烂成那个样了还四处炫耀,OK?别觉得你看个C/C++标准你就是个人物了,OK?别觉得你能上c.l.c.你就很拽了,我开始上时你恐怕连C都还没学呢,OK?年轻人,我们都是学得越多越知道自己的不足,你越学越狂妄只能说明你年幼无知,OK?