概述
进程调度即处理器调度。在多道程序设计环境中,进程数目往往多于处理器数,这将导致多个进程互相争夺处理器。进程调度的任务是控制、协调进程对处理器的竞争,按照一定 的调度算法,使某一就绪进程获得CPU的控制权,转换成运行状态。实际上进程调度完成 一个物理CPU转变成多个虚拟的(或逻辑的)处理器的工作。 需要说明的是由于进程调度的相关内容同样适用线程调度,所以以下只介绍进程调度。
一、概述
1、进程调度的主要功能
功能:记录系统中所有进程的执行状况;根据一定的调度算法,从就绪队列中选出一个进程, 准备把处理器分配给它;把处理器分配给进程。即把选中进程的进程控制块内有关的现场信 息,如程序状态字、通用寄存器等内容送入处理器相应的寄存器中,从而让它占用处理器运行。
2.进程调度的时机
进程调度发生的时机(什么时候会发生进程调度呢?):
(1)正在执行的进程运行完毕。
(2)正在执行的进程由于某种错误而终止。
(3)时间片用完,即有一个进程从运行状态变为就绪状态。
(4)正在执行的进程调用阻塞原语将自己阻塞起来,即一个进程从运行状态进入阻塞状态。
(5)创建了新的进程,即有一个新的进程进入就绪队列。
(6)正在执行的进程调用了唤醒原语操作激活了等待资源的进程,即一个等待状态的进程变为就绪状态。
处理器的调度方式有两种:抢占式和非抢占式(又称为不可抢占式)。所谓可抢占方 式,即就绪队列中一旦有优先级高于当前运行进程优先级的进程存在时,便立即进行调度, 转让处理器。而不可抢占方式,即一旦把处理器分配给一个进程,它就一直占用处理器,直到该进程自己因调用原语操作或等待I/O而进人阻塞状态,或时间片用完时才让出处理器, 重新执行进程调度。
以上6种调度时机中,(5)和(6)两种是在处理器调度方式为可抢占时会引起进程调度的原因,因为此时就绪队列中可能有优选级高于当前运行进程的优先级的进程出现。
二、调度算法设计原则
1.进程行为
几乎所有进程的(磁盘)I/O请求或计算都是交替突发的。例如,处理器运行一段时间 后,发出一个读写文件的系统调用。在完成系统调用之后,处理器又开始计算,直到它需要读写更多的数据为止。当然,某些I/0活动可以看作是计算。例如,当CPU向视频RAM复制数据以更新屏幕时,因为使用了处理器,所以这是计算,而不是I/O。按照这种观点,当 一个进程等待外部设备完成工作而被阻塞的行为属于I/O。
因此,某些进程花费了绝大多数时间在计算上(计算密集型),而其他进程则在等待I/O上花费了绝大 多数时间(I/O密集型)。前者称为计算密集型(Compute-bound),后者称为I/O密集型(I/0-boimd)。典型的计算密集型进程具有较长时间的处理器集中使用和较小频度的I/O等待。I/O密集型进程是I/O类的,因为这种进程在I/O请求之间较少进行计算,并不是因为它们有特别长的I/O请求。在I/O开始后无论处理数据是多还是少,它们都花费同样的时间提出硬件请求读取磁盘块。
随着CPU变得越来越快,更多的进程倾向为I/O密集型。这种现象之所以发生是因为处理器的改进比磁盘的改进快得多,其结果是,未来对I/O密集型进程的调度处理似乎更为重要。其基本思想是,如果需要运行I/O密集型进程,那么就应该让它尽快得到机会,以便发出磁盘请求并保持磁盘始终忙碌。而且,如果进程是I/O密集型的,则需要多运行一些这 类进程以保持处理器的充分利用。
2.系统分类
因为不同的应用领域(以及不同的操作系统)有不同的目标,所以,不同的环境需要不同的调度算法。
通常可以分为三类环境:批处理、交互式和实时系统。
批处理系统在商业领域仍在广泛应用,用来处理薪水册、存货清单、账目收人、账目支 出、利息计算(在银行)、索赔处理(在保险公司)和其他的周期性的进程。在批处理系统 中,不会有用户不耐烦地在终端旁等待一个短请求的快捷响应。因此,非抢占式算法,或对每个进程都有长时间周期的抢占式算法,通常都是可接受的。这种处理方式减少了进程的切换从而改善了性能。这些批处理算法实际上相当普及,并经常可以应用在其他场合,这使得 人们值得去学习它们,甚至是对于那些没有接触过大型机计算的人们。
在交互式用户环境中,为了避免一个进程霸占处理器拒绝为其他进程服务,抢占是必须的。即便没有进程想永远运行,但是,某个进程由于一个程序错误也可能无限期地排斥所有其他进程。为了避免这种现象发生,抢占也是必要的。服务器也归于此类,因为通常它们要 服务多个突发的(远程)用户。
然而在有实时限制的系统中,抢占有时是不需要的,因为进程了解它们可能会长时间得 不到运行,所以通常很快地完成各自的工作并阻塞。实时系统与交互式系统的差别是,实时系统只运行那些用来推进现有应用的程序,而交互式系统是通用的,它可以运行任意的非协作甚至是有恶意的程序。
3.调度算法的设计目标
设计调度算法的目标取决于环境,例如批处理、交互式或实时,但是,有一些目标是适用于所有系统的。
在所有的情形中,公平是很重要的。相似的进程应该得到相似的服务。对一个进程给予较其他等价的进程更多的处理器时间是不公平的。当然,不同类型的进程可以采用不同方式处理。
与公平有关的是系统策略的强制执行。如果局部策略是只要需要就必须运行安全控制进 程,那么调度程序就必须保证能够强制执行该策略。
另一个共同的目标是保持系统的所有部分尽可能忙碌。如果处理器和所有I/O设备能够 始终运行,那么相对于让某些部件空转而言,每秒钟就可以完成更多的工作。例如,在批处 理系统中,调度程序控制哪个进程调入内存运行。在内存中既有一些处理器密集型进程又有 一些I/O密集型进程是一个较好的想法,好于先调人和运行所有的处理器密集型进程,然后 在它们完成之后再调人和运行所有I/O密集型进程的做法。如果使用后面一种策略,在处理 器密集型进程运行时,它们就要竞争处理器,而磁盘却在空转。稍后,当I/O密集型进程来 了之后,它们要为磁盘而竞争,而处理器又空转了。显然,通过对进程的仔细组合,保持整 个系统都在运行更好一些。
运行大量批处理进程的大型计算中心的管理者们为了掌握其系统的工作状态,通常检查 三个指标:吞吐量、周转时间以及处理器利用率。吞吐量(Throughout)是系统每小时完成 的进程数量。把所有的因素考虑进去之后,每小时完成50个进程好于每小时完成40个进 程。周转时间(Tumarmmd Time)是指从一个批处理进程提交时刻开始直到该进程完成时刻 为止的统计平均时间。该数据度量了用户要得到输出'所需的平均等待时间。其规则是:小就是好的。
能够使吞吐量最大化的调度算法不一定就有最小的周转时间。例如,对于一个确定的短进程和长进程的一个组合,总是运行短进程而不运行长进程的调度程序,可能会获得出色的吞吐性能(每小时大量的短进程),但是其代价是对于长的进程周转时间很差。如果短进程 以一个稳定的速率不断到达,长进程可能根本运行不了,这样平均周转时间是无限长,但是得到了高的吞吐量。
处理器利用率常常用于对批处理系统的度量。尽管这样,处理器利用率并不是一个好的度量参数。真正有价值的是,系统每小时可完成多少进程(吞吐量),以及完成进程需要多 长时间(周转时间)。把处理器利用率作为度量依据,就像用引擎每小时转动了多少次来比 较汽车的好坏一样。另一方面,知道什么时候处理器利用率接近100%比知道什么时候要求 得到更多的计算能力要有用。
对于交互式系统,特别是分时系统和服务器,则有不同的指标。最重要的是最小响应时间,即从发出命令到得到响应之间的时间。在有后台进程运行(例如,从网络上读取和存储电子邮件)的个人计算机上,用户请求启动一个程序或打开一个文件应该优先于后台的工作。能够让所有的交互式请求首先运行的则是好服务。
一个相关的问题是均衡性。用户对做一件事情需要多长时间总是有一种固有的(不过通常不正确)看法。当认为一个请求很复杂需要较多的时间时,用户会接受这个现实,但是当认为一个请求很简单,但也需要较多的时间时,用户就会急躁。例如,如果点击一个图标花费了 60s发送完成一份传真,用户大概会接受这个事实,因为他没有期望花5s得到传 真。另一方面,当传真发送完成,用户点击断开电话连接的图标时,该用户就有不一样的期 待。如果30s之后还没有完成断开操作,用户就可能会抱怨,而60s之后,他就要气得要命 了。之所以有这种情况,其原因是:一般用户认为拿起听筒并建立通话连接所需的时间要比挂掉电话所需的时间长。在有些情形下,调度程序对响应时间指标起不了作用; 但是在另外一些情形下,调度程序还是能够做一些事的,特别是在出现差的进程顺序选择时。
实时系统有着与交互式系统不一样的特性,所以有不同的调度目标。实时系统的特点是或多或少必须满足截止时间。例如,如果计算机正在控制一个以正常速率产生数据的设备, 若一个按时运行的数据收集进程出现失败,就会导致数据丢失。所以,实时系统最主要的要 求是满足所有的(或大多数)截止时间要求。
最后
以上就是留胡子鸡翅为你收集整理的操作系统的处理器的进程调度是怎样的呢?的全部内容,希望文章能够帮你解决操作系统的处理器的进程调度是怎样的呢?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复