==HZ的概念:
一般是等于100,即10ms一次;
是系统定时器,中断触发。作用有:更新系统实际时间; 检查进程时间片(抢占的need_resched设置);更新cpu消耗和时间统计等;
==实时时钟(RTC)和系统定时器:
RTC是用微电池保存时间;唯一作用是在系统启动设置xtime.
系统定时器是为产生固定频率中断,即HZ.
==jeffies:
系统启动后的tick数, jiffies / HZ = 当前经过秒数;32位满后会回绕到0;
==gettimeofday:
内核里面是do_gettimeofday: 1. 从xtime变量读到秒 2. 然后附加上ns的处理(与arch相关)
==定时器的实现:
通过软中断;在timer硬中断后,会call run_local_timers唤起软中断,raise_softirq(TIMER_SOFTIRQ),从而执行超时的定时器.
==udelay, mdelay的实现:
因为常常比10ms小,所以用时钟中断不是好办法;是用忙等待来算的,即用循环次数 / cpu频率; 此过程中,一直占有cpu直到时间片用完
cat /proc/cpuinfo能看到loops_per_jiffy
==schedule_timeout():由于有调度,只能在进程上下文,并且不能加锁(否则可能会死锁)
1. 先睡眠当前任务,set_current_state(task_interruptible)
2. 再创建一个timer定时器,在定时器到期后,wakeup当前进程