操作系统学习笔记004

进程的调度

CPU从多个处于就绪状态的进程中选择一个进程来执行,称为进程的调度,而为了提高CPU的使用效率,则需要一定的调度策略,这种策略就称为调度算法。

进程调度的处理方法也同样适用于线程调度。当内核管理线程的时候,调度经常是按线程级别的,与线程所属的进程基本或根本没有关联。

为了选取正确的进程运行,调度程序还要考虑CPU的利用率,因为进程切换的代价是比较高的。首先用户态必须切换到内核态;然后要保存当前进程的状态,包括在进程表中存储寄存器值以便以后重新装

载。在许多系统中,内存映像(例如,页表内的内存访问位)也必须保存;接着,通过运行调度算法选定一个新进程;之后,应该将新进程的内存映像重新装入MMU;最后新进程开始运行。除此之外,进程切换还要使整个内存高速缓存失效,强迫缓存从内存中动态重新装入两次(进入内核一次,离开内核一次)。总之,如果每秒钟切换进程的次数太多,会耗费大量CPU时间。

1、调度介绍

1.1、进程的行为:

计算密集型:进程花费了绝大多数时间在计算上
典型的计算密集型进程具有较长时间的CPU集中使用和较小频度的I/O等待。

IO密集型:进程在等待IO上花费了大多数时间。
I/O密集型进程具有较短时间的CPU集中使用和频繁的I/O等待。

随着CPU变得越来越快,更多的进程倾向为I/O密集型。这种现象之所以发生是因为CPU的改进比磁盘的改进快得多,其结果是,未来对I/O密集型进程的调度处理似乎更为重要。这里的基本思想是,如果需要运行I/O密集型进程,那么就应该让它尽快得到机会,以便发出磁盘请求并保持磁盘始终忙碌。即要让IO密集型的进程尽早的在CPU上运行,从而让磁盘始终保持忙碌。

1.2、调度时机

调度处理的一个关键问题是何时进行调度。
1、调度程序可以合法选择先运行父进程还是先运行子进程。(这两个进程都处于就绪状态。)
2、在一个进程退出时必须做出调度决策。
3、当一个进程阻塞在I/O和信号量上或由于其他原因阻塞时,必须选择另一个进程运行。
4、在一个I/O中断发生时,必须做出调度决策。

非抢占式调度算法和抢占式调度算法:
非抢占式调度算法挑选一个进程,然后让该进程运行直至被阻塞(阻塞在I/O上或等待另一个进程),或者直到该进程自动释放CPU。
(即非抢占式:CPU随机挑选一个进程进行运行,直到该进程运行结束或者该进程被阻塞,CPU才会挑选下一个进程进行运行。)

抢占式调度算法:
抢占式调度算法挑选一个进程,并且让该进程运行某个固定时段的最大值。如果在该时段结束时,该进程仍在运行,它就被挂起,而调度程序挑选另一个进程运行(如果存在一个就绪进程)。

1.3、算法的适应环境

不同的环境需要不同的调度算法。之所以出现这种情形,是因为不同的应用领域(以及不同
的操作系统)有不同的目标。换句话说,在不同的系统中,调度程序的优化是不同的。这里有必要划分出三
种环境:
1)批处理。(在批处理系统中,不会有用户不耐烦地在终端旁等待一个短请求的快捷响应。因此,非抢占式算法,或对每个进程都有长时间周期的抢占式算法,通常都是可接受的。这种处理方式减少了进程的切换从而改善了性能。)

2)交互式。(为了避免一个进程霸占CPU拒绝为其他进程服务,抢占是必需的。如服务器)
3)实时。(抢占有时是不需要的)

1.4、调度算法的目标

对于所有系统:公平、策略强制执行、平衡
批处理系统:吞吐量(每小时最大作业数)、周转时间、CPU利用率
交互式系统:响应时间、均衡性
实时系统:满足截止时间、可预测性

2、批处理系统中的调度

2.1、先到先服务

在所有调度算法中,最简单的是非抢占式的先来先服务(first-come first-severd)算法。使用该算法,进
程按照它们请求CPU的顺序使用CPU。基本上,有一个就绪进程的单一队列。

优点:是易于理解并且便于在程序中运用。缺点:不适⽤于 I/O 繁忙型作业的系统。

2.2、最短作业优先

适用于运行时间可以预知的另一个非抢占式的批处理调度算法。
注意:只有在所有的作业都可同时运行的情形下,最短作业优先算法才是最优化的。
缺点:对长作业不利,容易造成极端情况即长作业不断被往后退,使得长作业长期无法运行。

2.3最短剩余时间优先

最短作业优先的抢占式版本是最短剩余时间优先(shortest remaining time next)算法。使用这个算法,
调度程序总是选择剩余运行时间最短的那个进程运行。
当一个新的作业到达时,其整个时间同当前进程的剩余时间做比较。如果新的进程比当前运行进程需要更少的时间,
当前进程就被挂起,而运行新的进程。这种方式可以使新的短作业获得良好的服务。

3、交互式系统中的调度

在个人计算机、服务器和其他类系统中都是常用的。

3.1轮转调度

一种最简单、最公平且使用最广的算法是轮转调度(round robin)。每个进程被分配一个时间段,称为时间片(quantum),即允许该进程在该时间段中运行。如果在时间片结束时该进程还在运行,则将剥夺CPU并分配给另一个进程。如果该进程在时间片结束前阻塞或结束,则CPU立即进行切换。时间片轮转调度很容易实现,调度程序所要做的就是维护一张可运行进程列表,如图2-41a所示。当一个进程用完它的时间片后,就被移到队列的末尾,如图2-41b所示。

也就是说CPU会按照固定的时间间隔切换下一个进程来运行,CPU也会在当前进程发生阻塞的时候进行切换,换下一个进程进行运行。
在这里插入图片描述
时间片设得太短会导致过多的进程切换,降低了CPU效率;而设得太长又可能引起对短的交互请求的响应时间变长。将时间片设为20ms~50 ms通常是一个比较合理的折中。

因为进程的切换也是需要时间的,如:需要保存当前进程的状态信息等,(进程的切换也叫做上下文切换),因此,如果时间片太短,CPU就会频繁的来回切换,实际上很多时间都被这种来回奔波中给浪费掉了,而时间片过长,就会造成只有阻塞的时候才会发生切换,对于短的交互式响应时间就会变长。

3.2优先级调度

进程与进程的重要程度是不一样的,例如,在打游戏的时候,我们后台可能还有一个负责下载网络资源的进程在运行着,这个时候,我们希望CPU更多的执行游戏进程,而不是后台的下载进程。
优先级调度的思想是:每个进程被赋予一个优先级,允许优先级最高的可运行进程先运行。
优先级的动态更改:
根据进程的动态变化调整优先级,⽐如如果进程运⾏时间增加,则降低其优先级,如果进程等待时间(就绪队列的等待时间)增加,则升⾼其优先级,也就是随着时间的推移增加等待进程的优先级。
有些进程为I/O密集型,其多数时间用来等待I/O结束。当这样的进程需要CPU时,应立即分配给它CPU,以便启动下一个I/O请求,这样就可以在另一个进程计算的同时执行I/O操作。

为什么要让IO密集型进程先执行?
看图(手残党画图):
在这里插入图片描述

可以看到,如果先选择IO密集型进程进行执行,进程在执行操作磁盘的指令时,发生阻塞(它需要来自磁盘的数据才能继续进行下一步操作),此时CPU发生进程切换,磁盘也开始运行(要知道IO操作相对于CPU执行指令来说是很慢的),CPU执行下一个进程,此时第二个进程在执行的同时,磁盘也在运行。即在执行第二个进程的同时,也在进行IO操作。反之如果先执行计算密集型,磁盘的空闲时间将会大大的增加(首先,计算密集型(极端来看,假设它完全不需要IO操作),进程的整个时间片内,磁盘都是空闲的。不像先执行IO密集型,上来就阻塞,启动磁盘,CPU切换下一个。)

3.3多级队列

多个队列,每个队列优先级从⾼到低,同时优先级越⾼时间⽚越短。
工作原理:
1.设置多个队列,赋予每个队列不同的优先级,每个队列优先级从⾼到低,同时优先级越⾼时间⽚越短。
2、新的进程会被放⼊到第⼀级队列的末尾,按先来先服务的原则排队等待被调度,如果在第⼀级队列规
定的时间⽚没运⾏完成,则将其转⼊到第⼆级队列的末尾,以此类推,直⾄完成。
3、当较⾼优先级的队列为空,才调度较低优先级的队列中的进程运⾏。如果进程运⾏时,有新进程进⼊
较⾼优先级的队列,则停⽌当前运⾏的进程并将其移⼊到原队列末尾,接着让较⾼优先级的进程运

4、每个队列将会分给不同的时间片(例如:属于最高优先级类的进程运行一个时间片,属于次高优先级类的进程运行2个时间片,再次一级运行4个时间片,以此类推。当一个进程用完分配的时间片后,它被移到下一类。)

例子:
作为一个例子,考虑有一个进程需要连续计算100个时间片。它最初被分配1个时间片,然后被换出。下次它将获得2个时间片,接下来分别是4、8、16、32和64。当然最后一次它只使用64个时间片中的37个便可以结束工作。该进程需要7次交换(包括最初的装入),而如果采用纯粹的轮转算法则需要100次交换。而且,随着进程优先级的不断降低,它的运行频度逐渐放慢,从而为短的交互进程让出CPU。

其他的调度算法:最短进程优先、保证调度、彩票调度、公平分享调度

4、实时系统中的调度

什么是实时系统?
实时系统是一种时间起着主导作用的系统。典型地,外部的一种或多种物理设备给了计算机一个刺激,
而计算机必须在一个确定的时间范围内恰当地做出反应。例如,在CD播放器中的计算机获得从驱动器而来
的位流,然后必须在非常短的时间间隔内将位流转换为音乐。

实时系统的分类:
硬实时(hard real time):必须满足绝对的截止时间。
软实时(soft real time):不希望偶尔错失截止时间,但是可以容忍。
特点:实时性能都是通过把程序划分为一组进程而实现的,其中每个进程的行为是可预测和提前掌握的。这些进程一般寿命较
短,并且极快地就运行完成。在检测到一个外部信号时,调度程序的任务就是按照满足所有截止时间的要求调度进程。

线程的调度

当若干进程都有多个线程时,就存在两个层次的并行:进程和线程。在这样的系统中调度处理有本质差别,这取决于所支持的是用户级线程还是内核级线程(或两者都支持)。

用户级线程:
由于内核并不知道有线程存在,所以内核还是和以前一样地操作,选取一个进程,假设为A,并给予A以时间片控制。A中的线程调度程序决定哪个线程运行,假设为A1。由于多道线程并不存在时钟中断,所以这个线程可以按其意愿任意运行多长时间。如果该线程用完了进程的全部时间片,内核就会选择另一个进程运行。

也就是说内核只负责进程的调度,而进程内部的用户线程,则由其调度程序来进行调度,当进程的时间片用完了,CPU会选取下一个进程进行运行,进程内部的线程自然也就跟着一块退出了CPU。在进程A终于又一次运行时,线程A1会接着运行。该线程会继续耗费A进程的所有时间,直到它完成工作。这种线程的调度由进程的程序自己负责。

实时系统使用的调度算法可以是上面介绍的算法中的任意一种。从实用考虑,轮转调度和优先级调度更为常用。惟一的局限是,缺乏一个时钟将运行过长的线程加以中断。

内核级线程:
内核选择一个特定的线程运行。它不用考虑该线程属于哪个进程,不过如果有必要的话,它可以这样做。对被选择的线程赋予一个时间片,而且如果超过了时间片,就会强制挂起该线程。

区别:
1、用户级线程的线程切换需要少量的机器指令,而内核级线程需要完整的上下文切换,修改内存映像,使高速缓存失效,这导致了若干数量级的延迟。另一方面,在使用内核级线程时,一旦线程阻塞在I/O上就不需要像在用户级线程中那样将整个进程挂起。
2、从进程A的一个线程切换到进程B的一个线程,其代价高于运行进程A的第2个线程,因为这涉及到两个不同的进程的切换。
3、用户级线程可以使用专为应用程序定制的线程调度程序。而在内核级线程中,内核从来不了解每个线程的作用(虽然它们被赋予了不同的优先级)。
4、应用定制的线程调度程序能够比内核更好地满足应用的需要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值