Linux的时钟机制-一道symantec的面试题 - Symantec面试题目
前面有文章提到在赛门铁克中国研发中心面试时被问到,请描述一下Linux的时钟机制。当时说得比较简单,有些内容也不是记得很清楚了,后来看书以后整理了一下,顺便记录下来。
一般的计算机中包含两个时钟,硬件时钟和软件时钟,硬件时钟也叫RTC(Real Time Clock,实时时钟),或叫CMOS时钟,因为它是通过电池供电来维持日期和时间的。而在Linux中,另有一个软件时钟,也称系统时钟或OS时钟。硬件时间是整个计算机的计时标准,在开机时操作系统取得CMOS时钟的数据来初始化系统时钟。
在Linux中,有两个重要变量来保存时间,一个是jiffies,另一个是xtime,jiffies保存的是系统启动以来的时钟滴答数(clock ticks),而xtime保存的是当前时间,它们的区别是,jiffies在每个时钟中断都更新(即加1),而xtime则是在每个time bottom half执行的时候根据jiffies换算成的时间来刷新。更具体的说,在精度方面,jiffies是10ms的精度,而xtime则精确到微秒。因为jiffies主要用于系统调度的各个时候,所以用整个简单的长整数方便做各种判断,而xtime主要用在系统时间的读取和设置上,使用情况不多。并且也正是因为xtime应用得少,所以在时钟中断的时候为了省时间,把对它的更新放在time_bh里面做。当然这也就意味着这两个保存系统时间的变量并非一直相等,xtime常常是比jiffies慢,只是每次执行时钟中断的bottom half时刷新它,才让它能够和jiffies同步。
那么jiffies或者xtime是如何产生或者更新的呢?简单的说是产生于时钟中断。在IBM PC中,使用一个8253/8254可编程的定时/计数器,它可以产生输出脉冲,这个脉冲信号送入CPU,就将产生一个中断请求信号,这被称为时钟中断。Linux在初始化时会使用一个init_IRQ()函数设定8253芯片的定时周期,对i386体系,这个周期为10ms,这也意味着时钟中断的频率为100,同时我们知道i386体系中INT 0对应的是时钟中断。初始化期间,Linux中有另一个函数time_init()中调用setup_irq(0,&irq0)设置时间中断向量irq 0,而中断服务程序是timer_interrupt()(也称作时钟中断处理例程上半部分)。如果阅读源代码还会发现,timer_interrupt中会调用另一个函数do_timer_interrupt(),而do_timer_interrupt还会调用do_timer更新系统时间。do_timer中所作的工作包括,让全局变量jiffies增加1,并且调用update_process_times来更新进程的时间片以及修改进程的动态优先级,然后执行mark_bh(TIMER_BH)标志TIMER_BH的bottom half队列是可执行的。而像xtime的更新则将在bottom half中执行,此外在bottom half中还将会检查和执行定时服务,这将是另一个话题。
From:http://www.mianjingba.com/mj/show.php?tid=68346