第7章 定时器及时钟服务
5.1~5.2 硬件定时器
硬件定时器
定时器是由时钟源和可编程计数器组成的硬件设备。时钟源通常是一个晶体振荡器,会产生周期性电信号,以精确的频率驱动计数器。注意定时器是一个单独的硬件。
个人计算机定时器
基于Intel x86的个人计算机有数个定时器(Bovet和 Cesati 2005)。
- 实时时钟(RTC):用小电池供电,记录和提供日期和时间信息。
- 可编程间隔定时器(PIT)(Wang2015):可以进行编程,以毫秒为精度。
- 多核CPU中的本地定时器(Intel1997;Wang2015):在多核CPU中,每个核都是一个独立的处理器,它有自已的本地定时器,由 CPU时钟驱动。
- 高分辨率定时器:大多数电脑都有一个时间戳定时器(TSC),由系统时钟驱动。它的内容可通过64位TSC寄存器读取。由于不同系统主板的时钟频率可能不同,TSC不适合作为实时设备,但它可提供纳秒级的定时器分辨率。一些高端个人计算机可能还配备有专用高速定时器,以提供纳秒级定时器分辨率。
5.3~5.6 相关实际操作
CPU操作
CPU有程序计数器(PC)用于标记当前执行到的指令的位置。标志或状态寄存器(SR)包含CPU的当前状态,堆栈指针(SP)指向堆栈顶。
时钟服务函数
gettimeofday()
:系统调用,获取系统时间。settimeofday()
:系统调用,设置系统时间。time()
:系统调用,获取以秒为单位的当前时间。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
", t.tv_sec, t.tv_usec);
printf((char*)ctime(&t.tv_sec));
return 0;
}
使用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
",start);
for(i=0;i<2019132000;i++);
end = time(NULL);
printf("end = %ld
");
printf("time of for is %ld
",end-start);
return 0;
}
代码链接
代码包括一些以前的代码,在码云。链接:https://gitee.com/Ressurection20191320/code/tree/master/IS