定时器及时钟服务

硬件定时器

定时器:时钟源和可编程计数器组成的硬件设备。
时钟源:通常是一个晶体振荡器,产生周期性电信号。
使用倒计时值对计数器进行编程,每个时钟信号减1,当计数减为0时,计数器向CPU生成一个定时器中断,重复倒计时。

个人计算器定时器

  1. 实时时钟
  2. 可编程间隔定时器
  3. 多核CPU中的本地定时器
  4. 高分辨率定时器

CPU操作和中断处理

程序计数器(PC)获指令指针(IP)
标志或状态寄存器(SR)
堆栈指针(SP)
通用寄存器

中断是I/O设备或协处理器发送给CPU的外部信号,请求CPU服务。

时钟服务函数

gettimeofday-settimeofday

对linux内核的系统调用

struct timeval{
     time_t tv_sec;
     suseconds_t tv_usec;
}

实例:通过gettimeofday()获取系统时间

编译后报错

缺少头文件#include <time.h>
以及将格式字符串中的%d改为%ld
修改后仍报错

查询后发现第二个printf函数传递了一个字符串字面量,这是安全漏洞的一种常见来源。如果字符串由用户输入,则可能会被用于执行任意代码。因此系统报错
用以下函数代替

time_t curtime;
time(&curtime);
printf("%s", ctime(&curtime));
return(0);

编译通过

time系统调用

time_t time(time_t *t)
以秒为单位返回当前时间
示例:输出打印开始时间,结束时间以及从开始到结束的秒数。
代码

运行结果

times系统调用

clock_t time(struct tms *buf);

struct tms(
    clock_t tms_utime;
    clock_t tms_stime;
    clock_t tms_cutime;
    clock_t tms_cstime;

)

Linux中定时器相关的系统调用、库函数和定时器服务命令

进程间隔定时器

Linux为每个进程提供了三种不同的间隔计时器,可用作进程计时的虚拟时钟。

间隔定时器由settimer()系统调用创建,

定时器中断

定时器向Linux进程发出的信号可看作是对基本系统虚拟CPU的中断。

定时器队列

pause t:任务暂停一秒
timer t:任务设置一个间隔为1秒的(REAL模式)间隔定时器。

临界区

两种类型的实体来执行中断,分别是任务和中断处理程序,它们可能会争夺系统中的同一(共享)数据对象。此时该数据对象为临界区,必须对它进行保护,以确保它一次只能由一个执行实体访问。

苏格拉底挑战: