上次,我们说到Linux进程调度程序并且它如何运行,并暗中交换进程进出运行状态,因而每个进程都得到CPU。今天,我们将对内核如何记录时间进行仔细检查,还有在一瞬间做某事到底意味着什么。
只扼要重述。上次,我们看到每一个进程都分配有一个优先权。随着时间的推移,调度程序依赖进程的响应情况,将提高或者降低这个优先权。
如果任务堵塞,常因等待输入输出(I/O)——例如用户的键盘输入,或者给磁盘驱动器发送数据——随着时间的过去,它的优先权将会增加。这是因为内核考虑让应用程序精巧地运转;每次在等待I/O而阻塞时,进程自愿将控制让给背后的调度程序,给另一个进程运行一会儿。
相反,如果进程是十足强计算——捣弄许多数字而不会因I/O大量停顿——那么,内核将被迫周期性地抢占这个进程,让另一个任务有运行的机会。随着时间的过去,被抢占进程的优先权会下降。
这都有助于维持一个敏感的系统。与用户交互的程序获得更多运行机会,而且保证用户就此有积极的体验。
这一切说明,你可能想要你的计算进程很快结束,因为你真正需要结果。既然这样,如果你是超级用户,通过给进程一个负的nice值也可以改变它的优先权。由调度程序分配的基本优先权减去这个nice值,负值因而增加优先权,因为减去一个负数变成加起来。普通非特权用户只能设置正的nice值,降低其作业的优先权——因此,关键字“nice”就是你正在为别人做一件好事。
Linux也迎合实时任务,它对接收到的事件必须立即响应。为了支持这一点,Linux提供超出正常给予的优先权范围。这些不随时间过去而调整,并且进程终身保持固定。
那么,调度程序怎么知道什么时候是抢占进程的时间?
答案是内核记录每一个进程已经运行多长时间。事实上,它存储三个时间值。第一个是真实时间,与象你我一样的人测量时间一样。下两个将是小得多的值,并且是实际上执行进程花费了的时间数量,也就是已经在CPU上花了多少时间。这两个中的第一个是用户时间计数,而第二个是系统时间计数,或者sys。此sys值测量执行系统调用的时间。
让我们举例说明。
请在命令提示符后输入命令time sleep 5。time命令可以在任何其他命令之前使用。这个命令照常运行,然后显示三个时间值。你肉眼就会看到表示此命令花多长时间运行的真实时间。用户时间实际上为0.000s,因为sleep命令是系统调用。sys时间是一个数值,不过是小数字。这是因为sleep只是阻塞,什么实际工作也不做。因此,内核花少许时间执行它。
那么,你知道了;CPU在运行任何任务时,十有八九,都是迅速地咬一口,除非是特别强的计算,大多数进程的空闲时间比工作时间还多。在这个例子中,CPU花不到十分之一秒运行命令,这个命令却使得它睡了5秒。
这有几个理由报告消息。在一定程度上,用户时间能够帮助识别坏代码。如果你的进程似乎花很长时间运行,则检查CPU把多少时间专用于用户代码,即非系统调用。如果是大量时间,那么,程序可能要进行优化,或者程序可能是在执行真正的强计算。另一方面,如果程序花大量时间运行系统调用,那么,它也许是在反复进行一个特殊的系统调用。可用strace –c再次执行命令进行深入研究,例如strace –c sleep 5。strace的输出结果是程序进行的所有系统调用和每个系统调用花多少时间。
同样,如sleep的例子所示,如果进程花大量时间阻塞——等待输入——那么,这将显示用户和系统时间同真实时间比较起来相对就少。
时间在Linux内核中测量为jiffies(瞬间)。一个jiffy表示内部硬件计时器的一声滴答,这是可编程产生固定频率的中断。建立内核时可设置频率而且频率不变,除非重建内核。
Linux发行版使用的大多数32-位386处理器默认值长期为100Hz——即每秒100次中断——而且该值存储在一个名为HZ的宏中。其他体系结构有不同的HZ默认值。
平常,只有牵涉到实时系统或者多媒体工作的人才会更改HZ的值,而且他们特别愿意把这个值拧得较高,所以滴答声就会更常听到。
这就是为什么jiffy是Linux内核中时间的基础。抢占强CPU进程可能需要等一个jiffy。如果一个进程不愿让出,在下一个时钟滴答之前,则是不可抢占的。在100Hz,一个进程每次可以独占CPU长达10ms(1秒被100次中断除 = 每次中断10ms)。
这是什么意思?
每次时钟滴答,调度程序就有机会把正在运行的进程切换出来,并调入另一个进程。所以,提高中断频率将减少jiffy时间的长度,意味着切换运行的进程更频繁。在实时系统中,例如医院和军事系统,每一个毫秒可能就是至关紧要的。
事实上,调度程序本身也要花时间。所以,实际上有一个权衡;中断频率不能随你的便增加到任何高度,因为最终会击中顶点,在顶点处理中断和调度需要的时间与执行进程的时间同样多,或者更多。在这一点上,个个损失,CPU的效率也变小。
事实上,较高滴答频率一般也会导致较高利用CPU。如果你的计算机是基于服务器的系统,双处理器,还有后备电源供应,那么这就不是问题。然而,如果你的Linux系统运行在膝上型电脑上,常常没有连接电源,那么你将受到不利的影响。这对慢速CPU的嵌入式系统也是如此。
到内核2.6.14为止,在大多数体系结构上,时钟滴答频率已变成可配置。基于386的32位系统现在的默认值是250Hz——即每秒250次滴答——但在建立内核时,给出100、250和1,000Hz作为选项。
慢速处理器或者低电源系统可以选择较小的值,反之,强大的机器或者有多媒体或紧急实时应用需求的机器将受益于较高的值。此值只能在建立内核时设置,内核不重建的话,在任何Linux系统上都不能改变。
要检查系统上HZ的值是什么,就执行命令
cat /boot/config-`uname -r` | grep '^CONFIG_HZ='
这满足你的需要吗?默认值对大多数人来说应该是好的。然而,如果你在一个极端,那么,通过调整此值,可把系统拧成不是消耗较少的电源就是更快起作用。这并不适合每个人;重建Linux内核时要当心。然而,另一方面,与每一个发行版一起供给的主要是普通的Linux内核,所以,它可能适合范围广泛的计算机。通过重建内核,也能利用优化或者移除不必要的驱动程序,竭力维持更大的性能。
一定要核对time和strace命令的帮助手册。能够监控应用程序花费的时间对于了解系统和调试缓慢执行代码是非常有益的。
马上再见,下周一将谈论Linux有什么和B级恐怖片一样。












究竟是什么使Linux滴答地响
翻译:

cccccc 状元 | Blog
高手
06/01/2008