Unix/Linux系统编程学习笔记-8
笔记
第五章 定时器及时钟服务
硬件定时器
定时器是由时钟源和可编程计数器组成的硬件设备。
- 时钟源通常是一个晶体振荡器,会产生周期性电信号,以精确的频率驱动计数器。使用一个倒计时值对计数器进行编程,每个时钟信号减1.当计数减为0时,计时器向CPU生成一个定时器中断,将计数值重新加载到计数器中,并重复倒计时。计数器周期称为定时器刻度,是系统的基本计时单位。
个人计算机定时器
实时时钟(RTC):个人计算机关机时,也能连续运行,用于试试提供时间和日期信息。
可编程间隔定时器(PIT):是与CPU分离的硬件定时器,可编程,提供以毫秒位单位的定时器刻度。
多核CPU中的本地定时器:多核CPU的每个核都有自己的本地计时器,由CPU时钟驱动。
高分辨率定时器:时间戳定时器(TSC)由系统时钟驱动,可提供纳秒级的定时器分辨率。
CPU操作
每个CPU都有一个程序计数器(PC),也称为指令指针(IP),以及一个标志或状态寄存器(SR)、一个堆栈指针(SP)和几个通用寄存器。
- PC——>内存中要执行的下一条指令时,SR包含CPU的当前状态,如操作模式、中断掩码和条件码,SP指向当前堆栈栈顶。
由于无效地址、非法指令、越权等原因,可能会出现一个错误状态,称为异常或陷阱。
中断是I/O设备或协处理器发送给CPU的外部信号,请求CPU服务。
中断处理
- 外部设备(如定时器)的中断被馈送到中断控制器的预定义输入行,按优先级对中断输入排序,并将具有最高优先级的中的作为中断请求(IRQ)路由到CPU。
- 对于每个中断,可以编程中断控制器以生成一个唯一编号——中断向量。
时钟服务函数
- 时钟服务可通过系统调用、库函数和用户级命令调用。
gettimeofday-settimeofday
- Linux内核的系统调用
- gettimeofday()获取系统时间
- settimeofday()设置系统时间
time系统调用
- time_t time(time_t*t)以秒为单位返回当前时间。如果参数t不是NULL,还会将时间存储在t指向的内存中。time系统调用具有一定的局限性,只提供以秒为单位的分辨率,而不是以微秒为单位。
times系统调用
- clock_t times(struct tms *buf)可用于获取某进程的具体执行时间。它将进程时间存储在struct tms buf中,以时钟计时单元报告所有时间。
time和date命令
- date:打印或设置系统日期和时间
- time:报告进程在用户模式和系统模式下的执行时间和总时间
- hwclock:查询并设置硬件时钟(RTC),也可以通过BIOS来完成
间隔定时器
Linux为每个进程提供了三种不同类型的间隔计时器,可用作进程计时的虚拟时钟。间隔定时器由setitimer()系统调用创建。getitimer()系统调用返回间隔定时器的状态。
int getitimer(int which, struct ittimerval *curr_value);
int setitimer(int which, const struct itimerval *new_value,
struct itimerval *old_value);
各间隔定时器在参数which指定的不同时间域中工作。
REAL模式间隔定时器
- VIRTUAL和PROF模式下的间隔计时器仅在执行进程时才有效。这类定时器的信息可保存在各进程的PROC结构体中。(硬件)定时器中断处理程序只需要访问当前运行进程的PROC结构体,就可以减少定时器计时,在定时结束时重新加载定时器计时,并向进程生成一个信号。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~