http://blog.csdn.net/muge0913/article/details/7562133
进程调度的目标:
1、高效性:高效意味着在相同的时间下要完成更多的任务。调度程序会被频繁的执行,所以调度程序要尽可能的高效。
2、加强交互性能(interactivity):在系统相当的负载下,也要保证系统的响应时间。
3、保证公平和避免饥渴。
4、SMP调度:调度程序必须支持多处理系统。系统必须追踪哪些进程在哪个cpu上运行。确保在同一时间中,一个进程不能再多于1个的cpu上运行。
5、软实时调度(soft real-timescheduling):系统必须有效的调用实时进程。
linusTorvalds 在CFS融入2.6.23时说:“我认为任何时候调度器都不是完美的 ,正确的并不是非此即彼,选择是一种平衡。在我更换调度器之前我100%确定未来我还会更换它。调度器没有想象的那么重要,它只是内核的一部分。”
进程的nice值:
nice值是每个进程的一个属性。它不是进程的优先级,而是一个能影响优先级的数字。
NI列显示的每个进程的nice值,PRI是进程的优先级。
nice是-20~~19之间的整数,默认取中间值0。
目前的内核不再存储nice值。取而代之的是static_prio(静态优先级)。nice值用户可见,静态优先级则隐藏在内核中,nice值和静态优先级可通过一定的关系进程转换。所以说nice值只是影响了静态优先级。而对于普通进程来说,动态优先级是基于静态优先级算出来的。
优先级:
普通进程有:静态优先级和动态优先级。而实时进程又增加了实时优先级。
注:进程的优先级只是一个整数,它是调度程序选择进程运行的基础。
1、静态优先级:static priority:之所以称为静态优先级是因为它不会随着时间而改变,内核不会修改它,只能通过系统调用nice去修改。静态优先级用进程描述符中的static_prio表示。它与nice的关系如图:
nice与 static_prio 之间的关系如下:
- static_prio= MAX_RT_PRIO + nice + 20
MAX_RT_PRIO值为100,所以静态优先级的范围是 100-139
内核定义了两个宏用来完成这一转换:PRIO_TO_NICE()、NICE_TO_PRIO()。
在kernel/sched.c中:
- /*
- * Convert user-nice values [ -20 ... 0 ... 19]
- * to static priority [ MAX_RT_PRIO..MAX_PRIO-1],
- * and back.
- */
- #defineNICE_TO_PRIO(nice) (MAX_RT_PRIO + (nice)+ 20)
- #definePRIO_TO_NICE(prio) ((prio) - MAX_RT_PRIO- 20)
2、动态优先级:调度程序通过增加或减少进程静态优先级的值来奖励IO小号型进程或惩罚cpu消耗型进程。调整后的优先级称为动态优先级。在进程描述符中用prio表示,通常所说的优先级指的是动态优先级。在 0~MAX_PRIO-1 之间取值(MAX_PRIO 定义为 140),其中 0~MAX_RT_PRIO-1 (MAX_RT_PRIO 定义为100)属于实时进程范围,MAX_RT_PRIO~MX_PRIO-1属于非实时进程。数值越大,表示进程优先级越小。
普通进程的优先级通过一个关于静态优先级和进程交互性函数关系计算得到。随实际任务的实际运行情况得到。实时优先级和它的实时优先级成线性,不随进程的运行而改变。
3、实时优先级:
实时优先级只对实时进程有意义。在进程描述符rt_priority中。取值0~MAX_RT_PRIO-1。
- prio=MAX_RT_PRIO-1 – rt_priority
时间片:
在完全公平调度器CFS融入内核之前,时间片是各种调度器的一个重要的概念。它指定了进程在被抢占之前所能运行的时间。调用器的一个重要目标便是有效的分配时间片,以便提供良好的用户体验。时间片分的过长会导致交互式进程响应不佳。时间片分的过长会导致进程切换带来的消耗。为了解决这个矛盾内核采用了:
1、提高交互进程的优先级,同时分配默认的时间片
2、不需要进程一次性用完时间片,可多次使用。
高的优先级可保证交互进程的频繁调用,长的时间片可保证它们可长时间处于可执行状态