学OS的时候经常讲到处理机(即CPU)的调度也即任务的调度,现如今与linux的内核代码联系起来。
理解处理机调度要回答3个问题:
1> 调度的时机
2> 调度的策略
3> 调度的实现
高级调度: 为任务建立PCB,装入内存
中级调度: 为提高吞吐量和利用率,将任务临时换出内存(swap)
低级调度: 进程调度,为进程分配CPU
考虑的因素:
公平 资源利用率 响应时间 周转时间 吞吐量
调度的策略:
FIFO, 时间片轮转, 优先权调度(可抢占/不可抢占), 多级反馈带优先级的时间片轮转, 实时调度
进程的状态
RUNNING (ready or running on CPU)
BLOCKED (interruptable or uninterruptable)
STOPPED
进程调度的时机
1. 进程退出(正常退出或者因错退出)
2. 进程blocked(等待资源,调用信号量等都是设置为interruptable 或 uninterruptable, 然后主动调用schedule。进程被唤醒时只更新running队列,不进行调度)
3. 时间片到(实质也是中断程序返回时调用schedule)
4. 新创建高优先级进程(本质为系统调用返回)
5. 进程调用sleep睡眠(设置为TASK_UNINTERRUPTIBLE,然后schedule)
从中断、异常以及系统调用返回时调用ret_from_sys_call,会检测调度标识决定是否要调度。因为内核态和用户态之间的切换需要开销,所以返回前把可以做的都做掉。
任务结构中对应调度的字段为:
need_resched:如果schedule()函数需要在下次唤醒,则设置本字段。
counter:到下次运行调度时间片剩余的时间嘀哒,由定时器递减。当这个字段的值小于或者等于零时,它被重置为零,同时设置p->need_resched。由于这个可以被进程自身修改,有时也称之为“动态优先级”。
priority:进程的静态优先级,仅能被系统调用如nice函数,POSIX.1b
rt_priority:实时优先权。
policy:
什么时候设置need_resched呢?一个主要地方是在时钟中断中。时钟中断中会调用update_process_times,会设置进程的need_sched标识。时钟中断不会调用schedule,而是中断返回的时候统一调用。