时间管理在Linux中也是重要的组成部分
PART 1 系统时间
linux内核需要tick来驱动,Hz不能太大也不能太小。jiffies是一个全局时间计数变量,可以被访问。由于存在回绕的可能,故系统提供了一个回绕安全的判断宏。
time_after()
time_before()
time_after_eq()
time_before_eq()
PART2 RTC
RTC用于保存系统时间
PART3 时钟中断
PIC产生时钟中断,时钟中断处理函数主要工作获得jeffies的保护锁
必要时,应答或重新设置系统时钟
周期性的使用墙上时间更新实时是时钟(RTC)
do_timer
do_timer的主要工作
jeffies+1
更新资源消耗统计值,如进程消耗的系统和用户时间
执行到期的动态定时器
schedule_tick()
更新墙上时间
计算平均负载
PART4 定时器
struct time_list{
struct list_head entry;
unsigned long expire;
void (*function)(unsigned long);
.....
};
init_timer();
add_timer();
mod_timer();
del_timer();
del_timer_sync() // 不能在中断上下文中执行
PART5 延时等待
方案 1 忙等待
while(time_before(jeffies,delay)){
};
while(time_before(jeffies,delay)){
cond_resched();
};//不能用于中断上下文
方案2 短延时
udelay()
mdelay()
方案3 schedule_timeout()
代码必需能够睡眠,就是处于进程上下文,且没有持有锁。
demo
{
set_current_state(TASK_INTERUPTBLE);
schedule_timeout();
}