linux在2.5系列的内核中,开始采用一种叫做O(1)调度程序的新调度程序。
调度程序总是选择时间片未用尽而且优先级高的进程运行。
linux实现一种基于动态优先级的调度方法。
linux内核提供了两组独立的优先级范围。
第一种是nice值,范围是从-20到19,默认值是0.nice值越大优先级越低,nice值越小优先级越高,另外nice值也用来决定分配给进程的时间片的长短,nice值为-20的进程获得的时间片最长,nice值为19的进程获得的时间片最短。
第二个范围是实时优先级,任何实时进程的优先级都高于普通的进程。
新的调度算法实现了一下目标:
(1)充分实现O(1)调度。
(2)全面实现SMP的可扩展性。每个处理器都有自己的锁和自己的可执行队列。
(3)强化SMP的亲和力。尽量将相关一组任务分配给一个CPU进行连续的执行。只有在需要平衡任务队列的大小时才在CPU之间移动进程。
(4)加强交互性能。即使在系统处于相当负荷的情况下,也能保证系统的响应,并立即调度交互式进程。
(5)保证公平。在合理设定的时间范围内,没有进程会处于饥饿状态,同样的,也没有进程能够显示公平地得到大量时间片。
(6)虽然最常见的优化情况是系统中只有1-2个可运行进程,但是优化也完全有能力扩展到具有多处理器且每个处理器上运行多个进程的系统中
调度程序中最基本的数据结构式运行队列(runqueue),可执行队列是给定处理器上的可执行进程的链表,每个处理器一个。每个可投入运行的进程都唯一的归属一个可执行队列。
cpu_rq(processor)宏用于返回给定处理器可执行队列的指针。
每个运行队列都有两个优先级数组,一个活跃的和一个过期的。
内核无论是从中断处理程序还是在系统调用后返回,都会检查need_reached标志,如果它被设置了,那么,内核会选择一个其他进程投入运行。
阅读(855) | 评论(0) | 转发(0) |