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

posted on 2013-05-11 02:42  疯子123  阅读(298)  评论(0编辑  收藏  举报

导航