进程调度
进程调度的实质是资源的分配
进程调度算法及其基本原理
(1)时间片轮转调度算法
系统将所有可运行的进程按照先来先服务的原则排成一个队列,每次调度时把CPU分配给队首进程,并令其执行一个时间片。当执行的时间片用完时,系统发出信号通知调度程序,调度程序便根据此信号来停止进程的运行,并将它送回到就绪队列的末尾,等待下一次执行。然后把处理机分配给就绪队列中的新的队首进程,同时也让他执行一个时间片。
(2)优先权调度算法
为了照顾紧迫性进程,系统把处理机分配给运行队列中优先权最高的进程。
1】非抢占式优先权调度算法
系统一旦将CPU分配给优先权最高的进程则该进程一直执行直至时间片用完或者执行完毕。
2】抢占式优先权调度算法
系统中当前运行的进程永远是可运行进程中优先权最高的。系统把CPU分配给优先权最高的进程使之执行,但是只要有一个比他优先级更高的进程出现,调度程序将暂停原来最高优先权进程的执行,而将处理机分配给新出现的优先级最高的进程。LINUX目前采用这种调度算法
(3)多级反馈队列调度
优先权高的进程先执行给定的时间片,相同优先权的进程轮流执行给定的时间片
(4)实时调度
实时系统:对外部请求有求必应,尽快相应。一般采用抢占式调度方式。
时间片:时间片太长感觉系统无法完成并行程序,时间片太短进程切换的消耗有很大,工程上一般为20ms。
LINUX调度的时机:exit() sleep_on()等函数会主动调用调度程序
(1)进程状态转换比如终止、睡眠
(2)当前进程的时间片用完
(3)设备驱动程序运行时
(4)从内核态返回到用户态,因为从内核态返回到用户态,状态的转换要花费一定得时间,因此在返回用户态前将内核态该干的事情干完
进程调度的依据:在task_struct中有几个与调度相关的域
(1)need_resched:调度标识,决定是否调用schedule()函数
(2)counter:进程处于可运行状态时所剩余的时钟节拍数,巧妙的把优先级和时间片结合起来了
(3)nice:进程的基本优先级,他的值决定counter的初值。-20~19之间。负值对应高优先级,正值对应低优先级
(4)policy:调度的类型
1】SCHED_FIFO:先入先出的实时进程
2】SCHED_RR:时间片轮转的实时进程
3】SCHED_OTHER:普通分时进程
(5)rt_priority:实时进程优先级