我想修改动态更改进程优先级的linux内核代码。
我有Ubuntu 10.10,我下载了linux 2.6.37。我发现在2.6.37版本中没有动态改变过程优先级的概念。 [在CentOS中有一个recalc_task_prio()函数可以动态更改进程优先级]。
我想知道是否有人知道任何其他ubuntu内核版本支持动态更改进程优先级的功能(如果任务是cpu绑定并消耗大量cpu,则基于惩罚进程优先级)?
我主要是指这个链接 - http://www.ibm.com/developerworks/linux/library/l-scheduler/
先谢谢,
答案 0 :(得分:3)
在Linux v2.6.23中,集成了一个新的CFS调度程序,它更少依赖于HZ
,而更多地依赖于纳秒的执行时间。
所有进程都存储在red-black tree中,使得 O(1)便宜,以找到要执行的最左边(因而也是最值得)的任务。系统会定期(task_tick()
)检查是否有另一个进程可能更值得"并抢占正在运行的任务。 (当然,任务可以自己产生(yield_task()
)并且新运行的任务可以抢占正在运行的任务(check_preempt_curr()
)。进程运行的时间被计入并且它重新开始插入树 O(log(N))以在RB树中找到它的新位置。
因此,等待IO的任务占用很少的时间,并且不会在树中移动很远 - 这对应于优先级提升。不会在IO事件上休眠的任务在被优先级较高的任务抢占之前会占用相对较多的CPU时间。
有关详细信息,请务必阅读Documentation/scheduler/
文档和kernel/sched*
实施文件。
如果是我的家庭作业项目来摆弄调度员(以前在过去常见),我会认真考虑添加一个新的实时调度类,如SCHED_FIFO
或SCHED_RR
(取决于哪一个更接近正在讨论的调度程序设计)并摆弄任务的优先级。对于介绍性的OS课程来说,这可能有点陡峭 - 较旧的Linux或较旧的BSD内核可能更容易使用。