5.5 时钟

时钟(clock)又称为定时器(timer),由于各种各样的原因决定了它对于任何多道程序设计系统的操作都是至关重要的。时钟负责维护时间,并且防止一个进程垄断CPU,此外还有其他的功能。时钟软件可以采用设备驱动程序的形式,尽管时钟既不像磁盘那样是一个块设备,也不像鼠标那样是一个字符设备。我们对时钟的研究将遵循与前面几节相同的模式:首先考虑时钟硬件,然后考虑时钟软件。

5.5.1 时钟硬件

在计算机里通常使用两种类型的时钟,这两种类型的时钟与人们使用的钟表和手表有相当大的差异。比较简单的时钟被连接到110V或220V的电源线上,这样每个电压周期产生一个中断,频率是50Hz或60Hz。这些时钟过去曾经占据统治地位,但是如今却非常罕见。

另一种类型的时钟由三个部件构成:晶体振荡器、计数器和存储寄存器,如图5-32所示。当把一块石英晶体适当地切割并且安装在一定的压力之下时,它就可以产生非常精确的周期性信号,典型的频率范围是几百兆赫兹,具体的频率值与所选的晶体有关。使用电子器件可以将这一基础信号乘以一个小的整数来获得高达1000MHz甚至更高的频率。在任何一台计算机里通常都可以找到至少一个这样的电路,它给计算机的各种电路提供同步信号。该信号被送到计数器,使其递减计数至0。当计数器变为0时,产生一个CPU中断。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

阅读 ‧ 电子书库
图 5-32 可编程时钟

可编程时钟通常具有几种操作模式。在一次完成模式(one-shot mode)下,当时钟启动时,它把存储寄存器的值复制到计数器中,然后,来自晶体的每一个脉冲使计数器减1。当计数器变为0时,产生一个中断,并停止工作,直到软件再一次显式地启动它。在方波模式(square-wave mode)下,当计数器变为0并且产生中断之后,存储寄存器的值自动复制到计数器中,并且整个过程无限期地再次重复下去。这些周期性的中断称为时钟滴答(clock tick)。

可编程时钟的优点是其中断频率可以由软件控制。如果采用500MHz的晶体,那么计数器将每隔2ns脉动一次。对于(无符号)32位寄存器,中断可以被编程为从2ns时间间隔发生一次到8.6s时间间隔发生一次。可编程时钟芯片通常包含两个或三个独立的可编程时钟,并且还具有许多其他选项(例如,用正计时代替倒计时、屏蔽中断等)。

为了防止计算机的电源被切断时丢失当前时间,大多数计算机具有一个由电池供电的备份时钟,它是由在数字手表中使用的那种类型的低功耗电路实现的。电池时钟可以在系统启动的时候读出。如果不存在备份时钟,软件可能会向用户询问当前日期和时间。对于一个连入网络的系统而言还有一种从远程主机获取当前时间的标准方法。无论是哪种情况,当前时间都要像UNIX所做的那样转换成自1970年1月1日上午12时UTC(Universal Time Coordinated,协调世界时,以前称为格林威治平均时)以来的时钟滴答数,或者转换成自某个其他标准时间以来的时钟滴答数。Windows的时间原点是1980年1月1日。每一次时钟滴答都使实际时间增加一个计数。通常会提供实用程序来手工设置系统时钟和备份时钟,并且使两个时钟保持同步。