学习笔记8

发布时间 2023-11-01 18:20:17作者: 周意凯

第5章 定时器及时钟服务

本章讨论了定时器和定时器服务;介绍了硬件定时器的原理和基于Intel x86 的PC中的硬件定时器;讲解了CPU操作和中断处理;描述了Linux中与定时器相关的系统调用、库函数和定时器服务命令;探讨了进程间隔定时器、定时器生成的信号。

硬件定时器

定时器是由时钟源和可编程计数器组成的硬件设备。时钟源通常是一个晶体震荡器,会产生周期性电信号,以精确的频率驱动计数器。

使用一个倒计时值对计数器进行编程,每个时钟信号减1。当计数减为0时,计数器向CPU生成一个定时器中断,将计数值重新加载到计数器中,并重复计时。

计数器周期称为定时器刻度,是系统的基本计时单元。

个人计算机定时器

基于Intel x86的个人计算机有数个定时器

(1)实时时钟

(2)可编程间隔定时器

(3)多核CPU中的本地定时器

(4)高分辨率定时器

CPU操作

每个CPU都有一个程序计时器(PC),也称为指令指针(IP),以及一个标志或状态寄存器(SR)、一个堆栈指针(SP)和几个通用寄存器,当PC指向内存中要执行的下一条指令时,SR包含CPU的当前状态,如操作模式、中断掩码和条件码,SP指向当前堆栈栈顶。堆栈是CPU用于特殊操作的一个内存区域。CPU操作可通过无限循环进行建模。

while (power-on) {
(1). fetch instruction: load *PC as instruction, increment PC to point to the next instruction in memory;
(2). decode instruction: interpret the instruction's operation code and generate operands;
(3). execute instruction: perform operation on operands, write results to memory if needed; execution may use the stack, implicitly change PC,
etc.
(4) • check for pending interrupts; may handle interrupts;
}

中断处理

外部设备(如定时器)的中断被馈送到中断控制器的预定义输人行 (Intel 1990;Wang 2015),按优先级对中断输人排序,并将具有最高优先级的中断作为中断请求(IRQ)路由到CPU。在每条指令执行结束时,如果 CPU 未处于接受中断的状态,即在 CPU 的状态寄存器中屏蔽了中断,它将忽略中断请求,使其处于挂起状态,并继续执行下一条指令。如果 CPU 处于接受中断状态,即中断未被屏蔽,那么CPU 将会转移它正常的执行顺序来进行中断处理。对于每个中断,可以编程中断控制器以生成一个唯一编号,叫作中断向量,标识中断谣。在获取中断向量号后,CPU 用它作为内存中中断向量表 (AMD64 2011)中的条目素引,条目包含一个指向中断处理程序人口地址的指针来实际处理中断。当中断处理结束时,CPU恢复指令的正常执行。

时钟服务函数

时钟服务函数可通过系统调用、库函数和用户级命令调用。

gettimeofday-settimeofday

struct timeval{
    time_t tv_sec;            //secend
    suseconds_t tv_usec;      //microseconds
};

int gettimeofday(struct timeval *tv,struct timezone *tz);    //获取系统时间。第二个参数timezone已过期,应设置为NULL

int settimeofday(struct timeval *tv, const struct timezone *tz);  //设置系统时间

间隔定时器

 

 

课堂笔记

复习:state,read readdir closedir opendir

考点:程序中创建进程与执行

execpv():

函数原型:

int execvp(const char *file, char *const argv[]);

system:execute a shell command

fork():