定时器及时钟服务
硬件定时器
定时器:时钟源和可编程计数器组成的硬件设备。
时钟源:通常是一个晶体振荡器,产生周期性电信号。
使用倒计时值对计数器进行编程,每个时钟信号减1,当计数减为0时,计数器向CPU生成一个定时器中断,重复倒计时。
个人计算器定时器
- 实时时钟
- 可编程间隔定时器
- 多核CPU中的本地定时器
- 高分辨率定时器
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模式)间隔定时器。
临界区
两种类型的实体来执行中断,分别是任务和中断处理程序,它们可能会争夺系统中的同一(共享)数据对象。此时该数据对象为临界区,必须对它进行保护,以确保它一次只能由一个执行实体访问。
苏格拉底挑战: