进程调度
面试的时候被问到进程调度,当时不清楚,场面一度十分尴尬,下来之后自己又复习了一下。
多任务
1.多任务操作系统就是能同时并发的执行多个进程的操作系统。
2.多任务操作系统使多个进程处于阻塞或者睡眠状态,实际不被投入执行,这些任务尽管位于内存,但是并不处于可运行状态。
3.多任务系统分类:
(1) 非抢占式多任务
(2) 抢占式多任务
- linux提供了抢占式的多任务模式。在此模式下,由调度程序来决定什么时候停止一个进程的运行,以便其他进程能够得到执行机会。这个强制的挂起动作叫做抢占。进程被抢占之前能够运行的时间是预先设置好的,叫进程的时间片。时间片实际上就是分配给每个可运行进程的处理器时间段。
- 在非抢占式多任务模式下,除非进程自己主动停止运行,否则它会一直执行。进程主动挂起自己的操作称为让步。但这种机制有很多缺点:调度程序无法为每个进程执行多长时间做出统一规定,所以进程独占的处理器时间可能会超过用户的预料:更糟的是,一个绝不做出让步的悬挂进程就能使系统崩溃。
linux的进程调度
- O(1)调度器拥有数以十计的多处理器的环境,但缺少交互进程。
- 反转楼梯最后期限调度算法,吸取队列理论,公平调度。又被称为完美公平调度算法(CFS)。
策略
- 决定调度程序在何时让进程运行
I/O消耗型和处理器消耗型的进程
1.进程可以分为:
(1)I/O消耗型:进程的大部分时间用来提交I/O请求或者等待I/O请求,经常处于可运行状态但是运行时间很短,等待更多的请求时最后总会阻塞。
(2) 处理器消耗型:把时间大多用在执行代码上,除非被抢占,否则通常都会不停地运行。因为他们没有太多的I/O需求。不属于I/O驱动类型。
2.调度策略:尽量降低它们的调度频率,延长其运行时间。
- 调度策略通常要在两个矛盾的目标中间寻求平衡:
(1)进程调度迅速(响应时间短)
(2) 最大系统利用率(高吞吐量) - linux倾向于有限调度I/O消耗型进程。
进程优先级
1.调度算法种最基本的一类就是基于优先级的调度,这是一种根据进程的价值和其对处理器时间的需求来对进程分级的想法。
- 调度程序总是选择时间片未用尽而且优先级较高的进程运行。
- linux采用了两种不同的优先级范围:
(1)nice
范围[-20,19],默认值为0;nice值越大,优先级越低;
linux系统中nice值代表时间片的比例,可以通过ps -el命令查看系统中进程列表,结果中标记NI的一列及时进程对应得nice值。
(2)实时优先级
其值可以配置,默认变化范围是[0,99];值越高优先级越高
4.任何实时进程的优先级都高于普通的进程,也就是说实时优先级和nice优先级处于互不相交的两个范畴。 - 通过命令ps -eo state,uid,pid,ppid,rtprio,time,comm.查看系统中的进程列表以及对应的实时优先级(位于RTPRIO列下),其中如果进程对应显示“-”,则说明它不是实时进程。
时间片
1.时间片表示进程在被抢占前所能持续运行运行的时间。
2.I/O消耗型进程不需要很长的时间片,而处理器消耗型进程希望时间片越长越好。
3.linux的CFS调度器没有直接分配时间片到进程,而是将处理器的使用比化分给进程。这样一来,进程锁获得的处理器时间和系统密切相关。这个比例受nice值影响,nice值作为权重来调整所使用的处理器时间使用比。
4.linux系统是抢占式的,是否要将一个进程立刻投入运行(也就是抢占当前进程),是完全由进程的优先级和是否有时间片来决定。
5.CFS调度器:抢占时机取决于新的可执行程序消耗了多少处理器使用比,如果消耗的使用比当前进程小:新程序立刻投入运行,抢占当前进程,否则推迟。
调度策略的活动
1.文字编译程序显然是I/O消耗型的,因为它大部分时间都在等待用户的键盘输入(无论用户的输入速度有多快,都不可能赶上处理的速度)用户总是希望按下键系统就能马上响应。
2.视频编码程序是处理器消耗型的。
3.CFS总是会毫不犹豫地让文本编辑器在需要时被投入运行,而让视频处理程序只能在剩下的时刻运行。
linux调度算法
调度器类
- linux调度器是以模块方式提供,目的是允许不同类型的进程可以有针对性地选择调度算法。这种模块化结构被称为调度器类,它允许多种不同的可动态添加的调度算法并存,调度属于自己范畴的进程。
2.基础的调度器代码定义在kernel/sched.c文件中
3.每个调度器有一个优先级,会按照优先级顺序遍历调度类,选择优先级最高的调度器类。
4.完全公平调度CFS是针对一个普通进程的调度类。
操作系统的常见的进程调度算法
1.先来先服务:在所有调度算法中,最简单的是非抢占式的FCFS算法
在所有的调度算法中,最简单的是非抢占式的FCS算法。
算法原理:进程按照他们请求CPU的顺序使用CPU,就像你买东西去排队,谁第一个排,谁就先被执行,在它执行的过程中,不会中断它。当其他人也想进入内存被执行,就要排队等着,如果在执行过程中出现一些事,他现在不想排队了,下一个排队的就补上。此时如果他又想排队了,只能站到队列尾去。
算法优点:易于理解且简单,只需要一个队列(FIFO),且相当公平。
算法缺点:比较有利于长进程,而不利于短进程,有利于CPU繁忙的进程,而不利于I/O繁忙的进程。
2.最短作业优先
短作业优先又称为“短进程优先”SPN; 这是对FCFS算法的改进,其目标是减少平均周转时间。
算法原理:对预计执行时间短的进程优先分派处理机。通常后来的短进程不抢占正在执行的进程。
算法优点:相比FCFS算法,该算法可改善平均周转时间和平均带权周转时间,缩短进程的等待时间,提高系统的吞吐量。
算法缺点:对长进程非常不利,可能长时间得不到执行,且未能依据进程的紧迫程度来划分执行的优先级,以及难以准确估计进程的执行时间,从而影响调度性能。
3.时间片轮转(RR)调度算法
RR调度算法与FCFS调度算法在选择进程上类似,但在调度的时机选择上不同。RR调度算法定义了一个时间单元,称为时间片。一个时间片通常在1~100ms之间。当正在运行的进程用完时间片后,即使此进程还要运行,操作系统也不让它继续运行,而是从就绪队列依次选择下一个处于就绪态的进程执行,而被剥夺CPU使用的进程返回到就绪队列的末尾,等待再次被调度。时间片的大小可以调整,如果时间片大到让一个进程足以完成其全部工作,这种算法就退化为FCFS调度算法;若时间片设置得很小,那么处理及在进程之间上下文切换工作过于频繁,使得真正用于用户程序的时间减小。时间片可以静态设置好,也可以根据系统当前负载状况和运行情况动态调整,时间大小的动态调整需要考虑就绪态进程个数、进程上下文开销、系统吞吐量、系统响应时间等多方面因素。
**4.高响应比优先调度算法(HRRF):HRRF调度算法是介于先来先服务算法与最短进程优先算法之间的一种折中算法。先来先服务算法只考虑进程的等待时间而忽视了进程的执行时间,而最短进程优先调度算法只考虑用户估计的进程的执行时间而忽视了就绪进程的等待时间。HRRF调度算法二者兼顾,既考虑进程的执时间,为此定义了响应比(Rp)这个指标:
Rp = (等待时间+预计执行时间)/执行时间=响应时间/执行时间
上述表达式假设等待时间与预计执行时间智和等于响应时间。HRRF调度算法将选择Rp最大值的进程执行,这样既照顾了短进程又不使长进程的等待时间过长,改进了调度性能。但HRRF调度算法需要每次计算各个进程的响应比Rp,这会带来较大的时间开销(特别是在就绪进程个数比较多的情况下)。
5.多级反馈队列调度算法
在采用多级反馈队列调度算法的执行逻辑流程如下:
设置多个就绪队列,并未各个队列赋予不同的优先级。第一个队列的优先级较高,第二队次之,其余队列优先级依次降低。仅当第1~i-1个队列为空时,操作系统调度器才会调度第i个队列中的进程运行。赋予各个队列中进程执行时间片的大小也各不相同。在优先级越高的队列中,每个进程的执行时间片就越小或越大。
当一个就绪进程需要链入就绪队列时,操作系统首先将它放入第一队列的末尾,按FCFS的原则排队等待调度。若轮到该进程执行且在一个时间片结束尚未完成,则操作系统调度器便将该进程转入第二队列的末尾,再童言按先来先服务原则等待调度执行。如此下去,当一个长进程从第一个队列降到最后一个队列后,在最后一个队列中,可使用FCFS或RR调度算法来运行处于队列中的进程。
如果处理机正在第i(i>1)队列中为某进程服务时,又有新进程进入第k(k<i)的队列,则新进程将抢占正在运行进程的处理机,即由调度程序把正在执行进程放回第i队列末尾,重新将处理机分配给处于第k队列的新进程。
从MLFQ调度算法可以看出长进程无法长期占用处理机,且系统的响应时间会缩短,吞吐量也不错(前提是没有频繁的短进程)。所以MLFQ调度算法是一种合适不同类型应用特征的综合进程调度算法。
6.最高优先级优先调度算法
进程的优先级用于表示进程的重要性及运行的优先性。一个进程的优先级可分为两种:静态优先级和动态优先级。
静态优先级是在创建进程时确定的。一旦确定后,在整个进程运行期间不再改变。静态优先级一般由用户依据包括进程的类型、进程所使用的资源、进程的估计运行时间等因素来设置。一般而言,若进程需要的资源越多、估计运行的时间越长,则进程的优先级越低;反之,对于I/O bounded的进程可以把优先级设置得高。
动态优先级是指在进程运行过程中,根据进程执行情况的变化来调整优先级。动态优先级一般根据进程占有CPU时间的长短、进程等待CPU时间的长短等因素确定。占有处理机的时间越长,则优先级越低,等待时间越长,优先级越高。那么进程调度器将根据静态优先级和动态优先级的总和现在优先级最高的就绪进程执行。