[笔记]《Linux内核设计与实现》第四章进程调度

来源:互联网 发布:在vb中chr是什么意思 编辑:程序博客网 时间:2024/05/20 14:16
目前正在通读《Linux内核设计与实现》一书,本文是对第四章<进程调度>的总结。
进程调度的原因不难理解,有限数目的CPU、数目众多的应用,就必须有个类似交警的角色来进行平衡和调度。
进程调度的基本思路是啥?对进程进行分级、分优先级。
进程分为两级:实时进程 vs 普通进程,
相应地,优先级也分为两大类:实时优先级和普通优先级。
相应地,调度策略也分为三大类:SCHED_FIFO、SCHED_RR和SCHED_NORMAL。其中前两个属于实时调度策略。

下面分别讲一下:
1.进程调度的一些概念:
1.1 强占(preemption),在抢占式的多任务模式下,由调度程序来决定什么时候停止一个进程的运行,以便其他进程能够得到执行机会。这个强制的挂起动作就叫做抢占。
1.2 时间片(timeslice),实际上是分配给每个可运行进程的处理器时间段。任何长时间片都会导致系统交互表现欠佳。很多操作系统中都特别重视这一点,默认的时间片很短,如10ms。Linux的CFS调度器没有直接分配时间片到进程,而是将处理器的使用比划分给了进程,而且这个使用比还受到nice值的影响。
1.3 让步(yielding),进程主动挂起自己的操作称为让步。
1.4 CFS:完全公平调度算法,是Linux2.6.23之后针对普通进程采用的调度算法,在Linux中称为SCHED_NORMAL。CFS不是完美的公平,只是几乎完美的多任务。它确保给每个进程公平的处理器使用比。
1.5 目标延迟:CFS为完美多任务中的无限小调度周期的近似值设立了一个目标。

2.调度策略
2.1.实时优先级:
实时优先级范围从0到MAX_RT_PRIO减一。默认情况下,MAX_RT_PRIO为100。所以,默认的实时优先级范围是从0到99。
实时调度策略又分为:
 SCHED_FIFO :处于可运行状态的SCHED_FIFO级的进程会比任何SCHED_NORMAL级的进程都先得到调度。它不基于时间片,可以一直执行下去。除非自己受阻或者显式地释放处理器为止;
              只有更高优先级的SCHED_FIFO或者SCHED_RR进程才能抢占SCHED_FIFO进程。同优先级的SCHED_FIFO级的进程之间会轮流调度。
 SCHED_RR :带有时间片的SCHED_FIFO。在耗尽事先分配给它的时间后就不能再继续执行了。
实时调度器管理实时调度策略
CFS调度器管理普通的调度策略
2.2.nice值
nice值适用于SCHED_NORMAL级进程
范围是-20到+19,默认值为0;nice值越大优先级越低,优先级低则意味着获得更少的处理器时间。
nice值是所有Unix系统中的标准化的概念--但不同的Unix系统由于调度算法不同,因此nice值的运用方式有所差异。如Mac OS X,进程的nice值代表分配给进程的时间片的绝对值;而Linux系统中,nice值则代表时间片的比例;
nice值->服务器使用比-运行时间
2.3虚拟实时
vruntime,记录一个程序到底运行了多长时间以及它还应该再运行多久。以ns为单位,其值被所有可运行进程总数加权,和定时器节拍不再相关(每次系统时钟节拍发生时,不再跟随减少一个节拍周期)。
update_curr(),由系统定时器周期性调用,更新vruntime的值
2.4.nice值到实时优先级的映射
共享了实时优先级的取值空间,其值从MAX_RT_PRIO到(MAX_RT_PRIO+40),也就是说,在默认情况下,nice值从-20到19直接对应的是从100到139的实时优先级范围。

3.调度时机
调度器的入口是schedule();
调起schedule()并不一定产生抢占。

3.2抢占时机
在多数操作系统中,是否要将一个进程立刻投入运行(也就是抢占当前进程),是完全由进程优先级和是否有时间片决定的。
在Linux的CFS调度器中,抢占时机取决于新的可运行程序消耗了多少处理器使用比,如果消耗的使用比比当前进程小,则发生抢占。
6.进程调度用到的数据队列
6.1.等待队列  进程休眠  两种状态:TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE
6.2.可执行红黑树  rbtree,自平衡二叉搜索树。进程优先级最高的,其vruntime(虚拟运行时间)最小,排在树的最左叶子节点。
6.3.过期队列
0 0
原创粉丝点击