笔记

第五章 定时器及时钟服务

硬件定时器

定时器是由时钟源和可编程计数器组成的硬件设备。

  • 时钟源通常是一个晶体振荡器,会产生周期性电信号,以精确的频率驱动计数器。使用一个倒计时值对计数器进行编程,每个时钟信号减1.当计数减为0时,计时器向CPU生成一个定时器中断,将计数值重新加载到计数器中,并重复倒计时。计数器周期称为定时器刻度,是系统的基本计时单位。

个人计算机定时器

实时时钟(RTC):个人计算机关机时,也能连续运行,用于试试提供时间和日期信息。

可编程间隔定时器(PIT):是与CPU分离的硬件定时器,可编程,提供以毫秒位单位的定时器刻度。

多核CPU中的本地定时器:多核CPU的每个核都有自己的本地计时器,由CPU时钟驱动。

高分辨率定时器:时间戳定时器(TSC)由系统时钟驱动,可提供纳秒级的定时器分辨率。

CPU操作

每个CPU都有一个程序计数器(PC),也称为指令指针(IP),以及一个标志或状态寄存器(SR)、一个堆栈指针(SP)和几个通用寄存器。

  • PC——>内存中要执行的下一条指令时,SR包含CPU的当前状态,如操作模式、中断掩码和条件码,SP指向当前堆栈栈顶。

由于无效地址、非法指令、越权等原因,可能会出现一个错误状态,称为异常或陷阱。
中断是I/O设备或协处理器发送给CPU的外部信号,请求CPU服务。

中断处理

  • 外部设备(如定时器)的中断被馈送到中断控制器的预定义输入行,按优先级对中断输入排序,并将具有最高优先级的中的作为中断请求(IRQ)路由到CPU。
  • 对于每个中断,可以编程中断控制器以生成一个唯一编号——中断向量。

时钟服务函数

  • 时钟服务可通过系统调用、库函数和用户级命令调用。

gettimeofday-settimeofday

  • Linux内核的系统调用
  • gettimeofday()获取系统时间
  • settimeofday()设置系统时间

time系统调用

  • time_t time(time_t*t)以秒为单位返回当前时间。如果参数t不是NULL,还会将时间存储在t指向的内存中。time系统调用具有一定的局限性,只提供以秒为单位的分辨率,而不是以微秒为单位。

times系统调用

  • clock_t times(struct tms *buf)可用于获取某进程的具体执行时间。它将进程时间存储在struct tms buf中,以时钟计时单元报告所有时间。

time和date命令

  • date:打印或设置系统日期和时间
  • time:报告进程在用户模式和系统模式下的执行时间和总时间
  • hwclock:查询并设置硬件时钟(RTC),也可以通过BIOS来完成

间隔定时器

Linux为每个进程提供了三种不同类型的间隔计时器,可用作进程计时的虚拟时钟。间隔定时器由setitimer()系统调用创建。getitimer()系统调用返回间隔定时器的状态。

int getitimer(int which, struct ittimerval *curr_value);
int setitimer(int which, const struct itimerval *new_value,
              struct itimerval *old_value);

各间隔定时器在参数which指定的不同时间域中工作。

REAL模式间隔定时器

  • VIRTUAL和PROF模式下的间隔计时器仅在执行进程时才有效。这类定时器的信息可保存在各进程的PROC结构体中。(硬件)定时器中断处理程序只需要访问当前运行进程的PROC结构体,就可以减少定时器计时,在定时结束时重新加载定时器计时,并向进程生成一个信号。

实践代码与截图

gettimeofday系统调用:

代码:

程序计时 python 程序计时器组成部件_多核

运行结果:

程序计时 python 程序计时器组成部件_执行时间_02

settimeofday系统调用:

代码:

程序计时 python 程序计时器组成部件_执行时间_03

运行结果:

程序计时 python 程序计时器组成部件_程序计时 python_04