预览加载中,请您耐心等待几秒...
1/5
2/5
3/5
4/5
5/5

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

linux时钟浅析 时钟的作用尽管与CPU指令执行没有什么直接关系,时钟对于操作系统来说还是有着很重要的意义:1、记录系统时间。很多应用程序需要知道日期和时间、由日期和时间构成的时间戳也会被打在文件上面、等等;2、统计功能。如top之类的用户程序可以查看一段时间内的系统负载、以及各个进程占用CPU的时间、等等;3、定时功能。很多用户程序会使用到定时器,比如sleep一段时间后做某件事情、比如给select设置一个超时时间、等等;关于时钟硬件为了实现这些功能,计算机硬件需要提供相应的时钟电路。这些电路大致上分两类:1、RTC(实时时钟),记录着当前的日期和时间(记录的是自1970-01-01起经历的秒数),并且自动随时间增长。这种硬件是由电池独立供电的,因为它要保持日期时间的更新,不能因为计算机的断电而停止工作。linux内核只在启动时从RTC获取当前时间,用于设置系统时间。在系统时间被修改时,linux内核会相应地更新RTC。而系统时间的自动增长则不依赖于RTC,依赖的是另一种时钟电路。2、时钟振荡器,可以周期性地发出中断。这种硬件是可编程的,linux内核在启动时可设置它发出中断的周期,一般是1ms。于是每隔1ms,CPU将收到一个时钟中断,这个时间间隔称作一个tick(节拍)。利用这种周期性的中断,linux内核在处理时钟中断的中断处理程序(参见《HYPERLINK"http://hi.baidu.com/_kouu/blog/item/cf25572a651023f3e6cd403b.html"\t"_blank"linux内核中断处理浅析》)中,实现了系统时间的自动增长、各种统计和定时器功能。CPU每ms都要处理一次时钟中断,并且还要在中断处理程序中完成很多功能,那它还有时间干别的事吗?考虑一个主频为200MHz的RISC结构的CPU,假设每个CPU周期能处理一条指令,那么1ms的时间这个CPU能执行约20万条指令。假设时钟中断处理程序能在1万条指令之内完成(一般情况下1万条指令应该足够了),CPU还是有大部分的时间能干其他事的。关于时钟中断在单处理器系统中,每个tick只发生一次时钟中断。在对应的中断处理程序中完成更新系统时间、统计、定时器、等全部功能;而在多处理器系统下,时钟中断实际上是分成两个部分:1、全局时钟中断,系统中每个tick只发生一次。对应的中断处理程序用于更新系统时间和统计系统负载;2、本地时钟中断,系统中每个tick在每个CPU上发生一次。对应的中断处理程序用于统计对应CPU和运行于该CPU上的进程的时间,以及触发对应CPU上的定时器;于是,在多处理器系统下,每个tick,每个CPU要处理一次本地时钟中断;另外,其中一个CPU还要处理一次全局时钟中断。更新系统时间在linux内核中,全局变量jiffies_64用于记录系统启动以来所经历的tick数。每次进入时钟中断处理程序(多处理器系统下对应的是全局时钟中断)都会更新jiffies_64的值,正常情况下,每次总是给jiffies_64加1。而时钟中断存在丢失的可能。内核中的某些临界区是不能被中断的,所以进入临界区前需要屏蔽中断。当中断屏蔽取消的时候,硬件只能告诉内核是否曾经发生了时钟中断、却不知道已经发生过多少次。于是,在极端情况下,中断屏蔽时间可能超过1个tick,从而导致时钟中断丢失。如果计算机上的时钟振荡器有很高的精度,linux内核可以读振荡器中的计数器,通过比较上一次读的值与当前值,以确定中断是否丢失。如果发现中断丢失,则本次中断处理程序会给jiffies_64增加相应的计数。但是如果振荡器硬件不允许(不提供计数器、或者计数器不允许读、或者精度不够),内核也没法知道时钟中断是否丢失了。(不过丢失就丢失吧,也没什么大不了的。)内核中的全局变量xtime用于记录当前时间(自1970-01-01起经历的秒数、本秒中经历的纳秒数)。xtime的初始值就是内核启动时从RTC读出的。在时钟中断处理程序更新jiffies_64的值后,便更新xtime的值。通过比较jiffies_64的当前值与上一次的值(上面说到,差值可能大于1),决定xtime应该更新多少。系统调用gettimeofday(对应库函数time和gettimeofday)就是用来读xtime变量的,从而让用户程序获取系统时间。统计系统负载在时钟中断处理程序(多处理器系统下对应的是全局时钟)完成对上述jiffies_64和xtime的更新之后,接下来就会对系统负载进行统计。所谓系统负载,是指系统中各个CPU的可执行队列中包含的进程数目。值为0表示对应CPU上没有可执行的进程,CPU空闲;值为1表示对应CPU被一个进程独占,CPU占用率为100%;值大于1表示对应CPU被