LINUX进程优先级实现
进程调度的目标:
- 高效性:高效意味着在相同的时间下要完成更多的任务。调度程序会被频繁的执行,所以调度程序要尽可能的高效。
- 加强交互性能(interactivity):在系统相当的负载下,也要保证系统的响应时间。
- 保证公平和避免饥渴。
- SMP调度:调度程序必须支持多处理系统。系统必须追踪哪些进程在哪个cpu上运行。确保在同一时间中,一个进程不能再多于1个的cpu上运行。
- 软实时调度(soft real-timescheduling):系统必须有效的调用实时进程。
进程的nice值:
nice值是每个进程的一个属性。它不是进程的优先级,而是一个能影响优静态先级的数字,-20~19之间,默认取中间值0。目前的内核不再存储nice值。取而代之的是static_prio(静态优先级)。nice值用户可见,静态优先级则隐藏在内核中,nice值和静态优先级可通过一定的关系进程转换。所以说nice值只是影响了静态优先级。而对于普通进程来说,动态优先级是基于静态优先级算出来的:
prio(动态优先级)=static_prio(静态优先级)= MAX_RT_PRIO + nice + 20
例子:ps -el 命令执行结果:NI列显示的每个进程的nice值,PRI是进程的优先级。
非实时进程优先级:
1、静态优先级:static priority:之所以称为静态优先级是因为它不会随着时间而改变,内核不会修改它,只能通过系统调用nice去修改(实时进程没有静态优先级,非实时进程有静态优先级)。
2、动态优先级:其值影响任务的调度顺序。在进程描述符中用prio表示,通常所说的优先级指的是动态优先级。在[0,MAX_PRIO-1] 之间取值(MAX_PRIO 定义为 140),其中 [0,MAX_RT_PRIO-1] (MAX_RT_PRIO 定义为100)属于实时进程范围,[MAX_RT_PRIO,MX_PRIO-1]属于非实时进程。数值越大,表示进程优先级越小。
prio = static_prio static_prio = MAX_RT_PRIO + 20 + nice(nice的缺省值是0,范围[-20, 19])
实时进程优先级:
实时优先级分为SCHED_FIFO,SCHED_RR两类,有软实时硬实时之分,FIFO/RR 都有动态优先级,没有静态优先级。内核提供的修改优先级的函数,一般是修改rt_priority的值。rt_priority的取值范围[1,99]。
prio =
MAX_RT_PRIO – 1 – rt_priority 其中MAX_RT_PRIO = 100