linux中众多进程可以同时执行,是因为采用了时间片轮转方案。每个进程都会分得相应的时间片,当前进程的时间片用完了,CPU就会停止执行当前进程,选择其他合适的进程执行。
那么什么时候判断当前进程的时间片是否用完了呢?这依赖于系统timer,timer周期性的产生时钟中断,在中断处理函数中,会更新当前进程的时间等统计信息,并判断当前进程的时间片是否用完,是否需要切换到其他进程执行。这个工作由update_process_times函数来实现。这里需要注意,update_process_times函数不会做实际的进程切换动作,只会设置是否需要做进程切换的标记,真正的切换在schedule函数中实现。
sched_clock_tick
- update_process_times->account_process_tick
void account_process_tick(struct task_struct *p, int user_tick)
{
cputime_t cputime, scaled, steal;
struct rq *rq = this_rq();
if (vtime_accounting_cpu_enabled())
return;
if (sched_clock_irqtime) {
irqtime_account_process_tick(p, user_tick, rq, 1);
return;
}
// 一个jiffy对应的cpu时间,一个jiffy对应1/HZ秒
cputime = cputime_one_jiffy;
steal = steal_account_process_time(ULONG_MAX);
if (steal >= cputime)
retu