第7章 定时器及时钟服务

5.1~5.2 硬件定时器

硬件定时器

定时器是由时钟源和可编程计数器组成的硬件设备。时钟源通常是一个晶体振荡器,会产生周期性电信号,以精确的频率驱动计数器。注意定时器是一个单独的硬件。

个人计算机定时器

基于Intel x86的个人计算机有数个定时器(Bovet和 Cesati 2005)。


  1. 实时时钟(RTC):用小电池供电,记录和提供日期和时间信息。
  2. 可编程间隔定时器(PIT)(Wang2015):可以进行编程,以毫秒为精度。
  3. 多核CPU中的本地定时器(Intel1997;Wang2015):在多核CPU中,每个核都是一个独立的处理器,它有自已的本地定时器,由 CPU时钟驱动。
  4. 高分辨率定时器:大多数电脑都有一个时间戳定时器(TSC),由系统时钟驱动。它的内容可通过64位TSC寄存器读取。由于不同系统主板的时钟频率可能不同,TSC不适合作为实时设备,但它可提供纳秒级的定时器分辨率。一些高端个人计算机可能还配备有专用高速定时器,以提供纳秒级定时器分辨率。

5.3~5.6 相关实际操作

CPU操作

CPU有程序计数器(PC)用于标记当前执行到的指令的位置。标志或状态寄存器(SR)包含CPU的当前状态,堆栈指针(SP)指向堆栈顶。

时钟服务函数


  1. ​gettimeofday()​​:系统调用,获取系统时间。
  2. ​settimeofday()​​:系统调用,设置系统时间。
  3. ​time()​​:系统调用,获取以秒为单位的当前时间。
  4. ​times()​​:系统调用,可以用于获取某进程的具体执行时间。

间隔定时器

Linux中为每个进程都提供了3种不同类型的间隔计时器,用来作进程计时的虚拟时钟。间隔定时器由​​settimer()​​​系统调用创建,由​​gettimer()​​系统调用返回间隔定时器的状态。

实践内容过程、问题解决过程

使用gettimeofday()系统调用

使用gettimeofday()获取当前时间。

代码:

#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <time.h>
int main()
{
struct timeval t;
gettimeofday(&t, NULL);
printf("sec= %ld usec=%d\n", t.tv_sec, t.tv_usec);
printf((char*)ctime(&t.tv_sec));
return 0;
}

20191320-2021-2022-1-diocs 学习笔记8_个人计算机

使用time()获取时间

使用time()可以获取以秒为单位的时间,为1970年1月1日0时到现在为止的秒数。通过time可以实现计算程序中代码段执行消耗的时间秒数,如下。

代码:

#include <stdio.h>
#include <time.h>
time_t start, end;
int main()
{
int i;
start = time(NULL);
printf("start=%ld\n",start);
for(i=0;i<2019132000;i++);
end = time(NULL);
printf("end = %ld\n");
printf("time of for is %ld\n",end-start);
return 0;
}

20191320-2021-2022-1-diocs 学习笔记8_系统调用_02