Linux系统及程序的启动速度
这篇文章写了有段时间了,不过没有在这里贴过。现在拿出来和大家分享一下。如果有理解错误的地方,还望指正。 Linux(包括其上运行的应用程序)的启动速度相比Windows要慢,这是个不争的事实。不过未来这种状况必将会发生变化。 lwn.net 上有两篇文章与此话题有关。 首先,要明确的一点是,导致这种状况的根本原因与内核关系不大。两个主要原因,一个是用户层程序启动时往往会做很多无谓的动作,可以从strace的结果里体会到;一个是ELF(现代*nix系统所采用的可执行文件和共享库文件格式)格式的二进制程序在符号解析时要耗费不少时间。lwn.net上的这两篇文章就分别针对这两个问题。 第一篇是 http://lwn.net/Articles/192214/ 第二篇是 http://lwn.net/Articles/192624/ 第一篇是Dave Jones在渥太华Linux研讨会(Ottawa Linux Symposium)的一个演讲,这个pdf的第441页 http://www.linuxsymposium.org/2006/linuxsymposium_procv1.pdf 就有这篇文章,题目是"Why user space sucks"。Dave观察了他的Fedora系统的启动过程,结果发现整个过程调用了stat() 79000次,打开过27000个文件和运行了1382个程序。但实际上不一定需要这么多动作。他还具体分析了很多程序的表现,比如gamin(fam ——file alteration monitor——的后继者),Xorg,CUPS,HAL等等。虽然Dave没有提出具体的解决方案,但是自此以后这个问题必定会引起人们的重视。 第二篇题目是Optimizing linker load times。文章开头提到目前很多发行版都在想尽办法提高系统启动速度,目前已有一些途径,比如预读取(readahead),启动重排序(boot reordering),还有并行执行init脚本。还有一个途径就是文章的主题,提高连接器动态连接的速度,主要是符号解析的速度。符号解析的目的,是把在程序里未定义的函数名解析为运行时该函数的内存地址。解析的过程就是查hash表,按惯常做法表里hash值相同的符号(就是未定义的函数名)组成链表。文章提到目前已经有的一个