20191320-2021-2022-1-diocs 学习笔记8

第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
", 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

原文地址:https://www.cnblogs.com/Ressurection-20191320/p/15508684.html