1、硬件时钟提供计时和产生精确是时钟中断。软件时钟(系统时钟),在系统启动时读取硬件时间为起点,根据启动后的滴答数来计算时间,这个滴答数用全局变量jiffies表示,每个时钟周期更新一次。jiffies用于系统调度是每个阶段。
2、软件封装定时器:
(1)老版,最多32个
timer_active 32bit,每一位控制对应定时器的开关
每个定时器,包含expires到期时间,即处理函数
把希望运行的时间转换为jiffies的单位,再加上当前系统时间,得到终结时间expires
struct timer_struct{
unsigned long expires;
void (*fn)(void);
};
(2)新版数目不限,定时器双向链表构成队列,以expires升序
3、进程执行有核心模式(系统调用进入)和用户模式。每种模式都有自己的堆栈,内核维护全局数据结构和每一个进程的一些信息。但是用户空间和内核空间数据不能互访,所以系统调用时需要调用copy_from_user()或copy_to_user()
三种定时器,定时器计数到达则向进程发送SIGVTAKRM信号(定时器里面函数实现):(1)ITIMER_REAL实时计数,总是在计数;(2)ITIMER_VIRTUAL该进程在用户模式下的时间,用户进程里面调用的系统调用执行时间不算;(3)ITIMER_PROC,CPU花在该进程上的总时间,不同于ITIMER_VIRTUAL用户的系统调用执行时间也算用户执行时间计数
4、linux把中断服务程序一分为二,top half必须关中断运行,读取来自设备的数据保存到预定的缓冲区。然后通知bottom half,剩余的工作排队在适当时间完成。多数bottom half对列专用于某些驱动程序。
5、系统时钟数据结构
include/linux/time.h
该结构定义的变量xtime保存了系统当前时间
struct timeval {
time_t tv_sec; /* 从1970.1.1以来的秒数 */
suseconds_t tv_usec;