日期:2014-05-16 浏览次数:20788 次
深入理解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上已运行了多长时间,如果已经超过了