日期:2014-05-16  浏览次数:20788 次

深入理解Linux内核--定时测量(阅读笔记)(原创)

深入理解Linux内核--定时测量(阅读笔记)(原创)

?

由 王宇 原创并发布

?

第六章定时测量

??? 很多计算机化的活动都是由定时测量(timing measurement)来驱动的,这常常对用户是不可见的。

??? Linux内核必须完成两种主要的定时测量 ,我们可以对此加以区分:

??? ??? 保存当前的时间和日期 ,以便能通过time()、ftime()和gettimeofday()系统调用把它们返回给用户程序,也可以由内核本身把当前时间作为文件和网络包的时间戳。

??? ??? 维持定时器 ,这种机制能够告诉内核或用户程序某一时间间隔已经过去

??? 定时测量是由基于固定频率振荡器和计数器的几个硬件电路完成的。???

1、时钟和定时器电路


??? [1]实时时钟(RTC)

??? ??? 所有的PC都包含一个叫实时时钟 (Renl Time Clock RTC)的时钟,它是独立于CPU和所有其他芯片的

??? ??? 即使当PC被切断电源,RTC还继续工作,因为它靠一个小电池或蓄电池供电。COMS RAM和RTC被集成在一个芯片上。

??? ??? RTC能在IRQ8上发出周期性的中断,频率在2-8192Hz之间。也可以对RTC进行编程以使当RTC到达某个特定的值时激活IRQ8线,也就是作为一个闹钟来工作。

??? ??? Linux只用RTC来获取时间和日期, 不过通过对/dev/rtc设备文件进行操作,也允许进程对RTC编程。内核通过0x70和0x71I/O端口访问RTC。系统管理员通过执行Unix系统时钟程序可以设置时钟。

??? [2]时间戳计数器(TSC)

??? ??? 所有的80x86微处理器都包含一条CLK输入引线,它接收外部振荡器的时钟信号。

??? ??? 与可编程间隔定时器传递来的时间测量相比,Linux利用这个寄存器可以获得更精确的时间测量

??? [3]可编程间隔定时器(PIT)

??? ??? 可编程间隔定时器(Programmable Interval Timer PIT).PIT的作用类似于微波炉的闹钟,即让用户意识到烹调的时间间隔已经过了。所不同的是,这个设备不是通过振铃,而是发出一个特殊的中断,叫做时钟中断(timerinterupt)来通知内核又一个时间间隔过去了。与闹钟的另一个区别是,PIT永远以内核确定的固定频率不停第发出中断

??? ??? Linux给PC的第一个PIT进行编程,是它以(大约)1000Hz的频率向IRQ0发出时钟中断,即每1ms产生一次时钟中断。这个时间间隔叫做一个节拍(tick),它的长度以纳秒为单位存放在tick_nsec变量中。

??? ??? 短的节拍产生较高分辨率的定时器,当这种定时器执行同步I/O多路复用(poll()和select()系统调用)时,有助于多媒体的平滑播放和较快的响应时间

??? ??? 时钟中断的频率取决于硬件体系结构。

??? ??? 在Linux的代码中,有几个宏产生决定时钟中断频率的常量:

??? ??? ??? HZ产生每秒时钟中断的近似个数,也就是时钟中断的频率。在IBM PC上,这个值设置为1000

??? ??? ??? CLOCK_TICK_RATE 产生的值为1193182,这个值是8254芯片的内部振荡器频率

??? ??? ??? LATCH产生CLOCK_TICK_RATE和HZ的比值再四舍五入后的整数值。这个值用来对PIT编程

??? ??? PIT由setup_pit_timer()进行初始化???

??? [4]CPU本地定时器

??? ??? CPU本地定时器是一种能够产生单步中断或周期性中断的设备,它类似于可编程间隔定时器,区别:

??? ??? ??? APIC计数器是32位,而PIC计数器是16位; 因此,可以对本地定时器编程来产生很低频率的中断

??? ??? ??? 本地APIC定时器把中断只发送给自己的处理器,而PIT产生一个全局性中断,系统中的任一CPU都可以对其处理。

??? ??? ??? APIC定时器是基于总线时钟信号的。每隔1,2,4,8,16,32,64或128总线时钟信号到来时对该定时器进行递减可以实现对其编程的目的。相反,PIT有其自己的内部时钟振荡器,可以更灵活地编程。

??? [5]高精度事件定时器(HPET)

??? ??? 高精度事件定时器是由Intel和Microsoft联合开发的一种新型定时器芯片。尽管这种定时器在终端用户机器上还并不普遍,但Linux2.6已经能够支持它们

??? [6]ACPI电源管理定时器

??? ??? ACPI电源管理定时器(或称ACPI PMT)是另一种时钟设备,包含在几乎所有基于ACPI的主板上。它的时钟信号拥有大约为3.58MHz的固定频率。该设备实际上是一个简单的计数器, 它在每个时钟节拍到来时增加一次。为了读取计数器的当前值,内核需要访问某个I/O端口,该I/O端口的地址由BIOS在初始化阶段确定

??? ??? 如果操作系统或者BIOS可以通过动态降低CPU的工作频率或者工作电压来节省电池的电能,那么ACPI电源管理定时器就比TSC更优越。当发生ACPI PMT的频率不会改变。而另一方面,TSC计数器的高频率非常便于测量特别小的时间间隔。

??????? ACPI 控制CPU的频率,从而控制系统的功耗。

2、Linux计时体系结构


??? Linux必定执行与定时相关的操作。例如,

?????? 内核周期性地:

??? ??? 更新自系统启动以来所经过的时间

??? ??? 更新时间和日期

??? ??? 确定当前进程在每个CPU上已运行了多长时间,如果已经超过了