考研操作系统【2.2 处理机调度】

前言

✨本篇为博主 考研操作系统 的第七篇:处理机调度

本篇博客内容来自:
👊2022王道视频笔记总结
👊2023王道书重点归纳总结
👊2023王道习题好题,错题总结

效率问题,就不再和前几篇文章一样对重点进行特殊标记强调,需要的可以看PDF版,那个是有强调色彩的

需要博主PDF版笔记或相关资料的同学可以评论出来,我会私发给大家~


笔记

        调度的基本概念:处理机调度是对处理机进行分配,即从就绪队列中按照一定的算法,选择一个进程并将处理机分配给它运行,以实现进程并发地执行;处理机调度是多道程序操作系统的基础,是操作系统设计的核心问题。
        作业:就是指一个具体的任务,用户给操作系统提交一个作业≈用户让操作系统启动一个程序(来处理某一个具体的任务)
        1.高级调度(作业调度):按照一定的规则从外存上处于后备队列的作业中挑选一个(多个),给它(们)分配内存、输入/输出设备等必要的资源,并建立相应的进程;作业调度就是内存与辅存之间的调度,对于每个作业只调度一次,调出一次,作业调入时会建立PCB,调出时才撤销PCB;多道批处理系统中大多配有作业调度,而其他系统中通常不需要配置作业调度
        2.中级调度(内存调度):内存不够时,可以将某些进程的数据调出到外存,等内存空闲或者进程需要运行时再重新调入内存,暂时调到外存中等待的进程状态为挂起状态,被挂起的进程PCB会被组织成挂起队列;一个进程可能会被多次调出、调入内存,因此中级调度发生的频率比高级调度高;位于挂起态的进程,当它们已具备运行条件且内存又稍微空闲的时候,由中级调度决定把外存上的这些进程重新调入内存,并修改其状态为就绪态,挂在就绪队列上等待;中级调度实际上是存储器管理中的对换功能
在这里插入图片描述

        简单介绍以下挂起态:暂时调到外存等待的进程状态称为挂起状态(suspend),挂起态可以进一步细分为就绪挂起、阻塞挂起两种状态;挂起和阻塞的区别:两种状态都是暂时不能获得CPU的服务,但挂起状态是将进程映像调到外存去了,而阻塞态下的进程映像还在内存中;有的操作系统会把就绪挂起、阻塞挂起分为两个挂起队列,甚至会根据阻塞原因不同再把阻塞挂起进程进一步细分为多个队列
        3.低级调度(进程调度、处理机调度):按照某种算法从就绪队列中选取一个进程,将处理机分配给它;进程调度是最基本的一种调度,在各种操作系统中都必须配置这级调度,进程调度的频率很高,一般几十毫秒一次
        作业调度为进程活动做准备,进程调度使进程正常活动起来;进程调度是最基本的,不可或缺

        CPU利用率= C P U 有 效 工 作 时 间 C P U 有 效 工 作 时 间 + C P U 空 闲 等 待 时 间 \frac{CPU有效工作时间}{CPU有效工作时间+CPU空闲等待时间} CPU+CPUCPU
        系统吞吐量:表示单位时间内CPU完成作业的数量;调度算法和方式不同,也会对系统的吞吐量产生较大的影响;系统吞吐量= 总 共 完 成 了 多 少 道 作 业 总 共 花 了 多 长 时 间 \frac{总共完成了多少道作业}{总共花了多长时间}
周转时间:指从作业提交到作业完成所经历的时间,是作业等待、在就绪队列中排队、在处理机上运行及输入/输出操作所花费的时间的总和;周转时间=作业完成时间-作业提交时间;平均周转时间=(作业1的周转时间+…+作业n的周转时间)/n;带权周转时间=;平均带权周转时间=(作业1的带权周转时间+…+作业n的带权周转时间)/n
        带权周转时间与周转时间都是越小越好
        等待时间:指进程处于等待处理机的时间之和,等待时间越长,用户满意度越低;处理机调度算法实际上并不影响作业执行或输入/输出操作的时间(因为一个作业总共需要被服务多久,被I/O设备服务多久一般都是确定不变的),只影响作业在就绪队列中等待所花的时间;对于进程来说,等待时间就是指进程建立后等待被服务的时间之和,在等待I/O完成的期间其实进程也是在被服务的,所以不计入等待时间;对于作业来说,不仅要考虑建立进程后的等待时间,还要加上作业在外存后备队列中等待的时间
        响应时间:指从用户提交请求到操作系统首次产生相应所用的时间;在交互式系统中,周转时间不是最好的评价标准,一般采用响应时间作为衡量调度算法的重要准则之一;从用户角度来看,调度策略应尽量降低响应时间

        在操作系统中,用于调度和分派CPU的组件称为调度程序,它通常由三部分组成:
        1.排队器:将系统中的所有就绪进程按照一定的策略排成一个或多个队列,以便于调度程序选择;每当一个进程转变为就绪态时,排队器便将它插入到相应的就绪队列中
        2.分派器:依据调度程序所选的进程,将其从就绪队列中取出,将CPU分配给新进程
        3.上下文切换器:在对处理机进行切换时,会发生两对上下文切换操作:第一对:保存当前进程的上下文到PCB,装入分派程序上下文;第二对:移出分派程序的上下文,将新进程的CPU现场信息装入处理机的各个寄存器中(这里的分派程序有歧义,应该是王道书有问题)

在这里插入图片描述

        在上下文切换时,需要执行大量的load和store指令,以保存寄存器的内容,因此会花费较多时间。现在已有硬件实现的方法来减少上下文切换时间,通常采用两组寄存器,其中一组供内核使用,一组供用户使用,这样在上下文切换时,只需要改变指针,让其指向当前寄存器组即可。

        调度程序是操作系统内核程序,请求调度的事件发生后,才能可能运行调度程序,调度了新的就绪进程后,才会发生进程切换;需要进行进程调度与切换的情况:
        1.当运行中的进程主动放弃处理机:
        a.进程正常终止
        b.运行过程中发生异常而终止
        c.进程主动请求阻塞(如等待I/O)
        2.当运行中的进程被动放弃处理机:
        a.分配进程的时间片用完
        b.有更紧急的事需要处理(如I/O中断)
        c.有更高优先级的进程进入就绪队列
        在实际的操作系统内核程序运行中,若某时刻发生了引起进程调度的因素,不一定能马上进行进程的调度与切换;不能进行进程的调度与切换的情况如下:
        1.在处理中断的过程中:中断处理过程复杂,与硬件密切相关,在实现上很难做到进程切换,且中断处理是系统工作中的一部分,逻辑上不属于某一进程,不应被剥夺处理机资源
        2.进程在操作系统内核临界区中:注意这里专指内核临界区,进程处于临界区时是可以进行处理机调度的;首先介绍几个概念:临界资源:一个时间段内只允许一个进程使用的资源,各进程之间需要互斥地访问临界资源;临界区:访问临界资源的那段代码;内核程序临界区一般是用来访问某种数据结构的,比如进程的就绪队列(由各就绪队列进程的PCB组成),普通的临界区是允许进程调度和切换的;
        3.其他需要完全屏蔽中断的原子操作过程中(原语):如加锁、解锁、中断现场保护、恢复等原子操作,在原子过程中,连中断都要屏蔽,更不应该进行进程调度与切换
若发生了上述情况导致不能进行进程调度和切换,应置系统的请求调度标志,直到上述过程结束后才进行相应的调度与切换
非剥夺调度:发生引起调度条件且当前进程无法继续运行下去时,可以马上进行调度与切换,若操作系统只在这种情况下进行进程调度,则是非剥夺调度
剥夺方式的调度:中断处理结束后或自陷处理结束后,回到被中断进程的用户态程序执行前,若置上请求调度,即可马上进行进程调度与切换,若操作系统支持这种情况下的运行调度程序,则实现了剥夺方式的调度
进程切换往往在调度完成后立刻发生,它要求保存原进程当前断点的现场信息,恢复被调度进程的现场信息;现场切换时,操作系统内核将原进程的现场信息推入当前进程(即将运行的进程)的内核堆栈来保存它们,并更新堆栈指针,内核完成从新进程的内核栈中装入新进程的现场信息、更新当前运行进程空间指针、重设PC寄存器等相关工作后,开始运行新的进程(这里有歧义)
        狭义的进程调度指的是从就绪队列中选择一个要运行的进程(这个进程可以是刚刚被暂停执行的进程,也可能是另一个进程,后一种情况就需要进程切换);
        进程切换是指一个进程让出处理机,由另一个进程占用处理机的过程
        广义的进程调度包含了选择一个进程和进程切换两个步骤
        进程切换的过程主要完成了:1.对原来运行进程各种数据的保存2.对新的进程各种数据的恢复(如:程序计数器、程序状态字、各种数据寄存器等处理机现场信息,这些信息一般保存在进程控制块)
        注:进程切换是有代价的,因此如果过于频繁的进程调度、切换,必然会导致整个系统的效率降低,使系统大部分时间都花在了进程切换上,而真正用于执行进程的时间减少

        1.非抢占调度方式(非剥夺方式):即使有某个更为重要或紧迫的进程进入就绪队列,仍然让正在执行的进程继续执行,直到该进程完成或发生某种事件而进入阻塞态时,才把处理机分配给其他进程;优点:实现简单,系统开销小,适用于大多数批处理系统;缺点:不适用于分时系统和大多数的实时系统
        2.抢占式调度方式(剥夺方式):若有某个更为重要或紧迫的进程需要使用处理机,则允许调度程序根据某种原则去暂停正在执行的进程,将处理机分配给这个更为重要或紧迫的进程;这种调度方式不仅可以优先处理更紧急的进程,也可实现让各进程按时间片轮流执行的功能(通过时钟中断),适用于分时操作系统、实时操作系统

        闲逛进程:在进程切换时,如果系统中没有就绪进程,就会调度闲逛进程(idle)运行,如果没有其他进程就绪,该进程就一直执行,并在执行过程中测试中断;闲逛进程的优先级最低,只要有进程就绪,就会让出处理机;闲逛进程不需要CPU之外的资源,它不会被阻塞

        1.先来先服务(FCFS)调度算法:既可以用于作业调度,也可以用于进程调度;作业调度:算法每次从后备作业队列中选择最先进入该队列的一个或几个作业,将它们调入内存,分配资源,创建进程放入就绪队列;进程调度:算法每次从就绪队列中选择最先进入该队列的进程,将处理机分配给它,使之投入运行,直到完成或阻塞;FCFS调度算法属于不可剥夺算法(非抢占式),不会导致饥饿;不能作为分时操作系统和实时操作系统的主要调度策略,适用于早期批处理系统;常常结合其他调度算法一起使用;特点:算法简单,效率较低,对长作业有利,对短作业不利,有利于CPU繁忙型作业,不利于I/O繁忙型作业
        2.短作业优先(SJF)调度算法/短进程优先(SPF)调度算法:SJF:从后备队列中选择一个或若干估计运行时间最短的作业,将它(们)调入内存运行;SPF:从就绪队列中选择一个估计运行时间最短的进程,将处理机分配给它,使之立即运行,直到完成或阻塞;SJF、SPF算法是非抢占式的算法,会导致饥饿;虽然是非抢占式算法,但是也有抢占式版本:最短剩余时间优先算法(SRTN):每当有进程加入就绪队列改变时,就需要调度,如果新到达的进程剩余时间比当前运行的进程剩余时间更短,则由新进程抢占处理机,当前运行进程重新回到就绪队列,当一个进程完成时也需要调度;注:默认短作业/短进程优先调度算法是非抢占式的;适用于早期批处理系统;(在所有进程同时执行时/在所有进程都几乎同时到达时)采用SPF调度算法的平均等待时间、平均周转时间最少,【抢占式的短作业/进程优先调度算法(SRNT)的平均等待事件、平均周转时间最少】,如果SPF算法没有前提条件,不一定式错,需要判断是否有更明显的错误;SJF、SPFG的缺点:
        a.对长作业不利,可能会导致饥饿现象(作业长期不被调度,饿死是指一直得不到服务)
        b.完全未考虑作业的紧迫程度,因此不能保证紧迫性作业会被即使执行
        c.作业的长短是根据用户所提供的估计执行时间而定的,用户数据可能造假,致使该算法不一定能真正的做到短作业优先调度
        3.高响应比优先调度算法:主要用于作业调度,也可用于进程调度;是对FCFS、SJF的一种综合平衡;是非抢占式算法,因此只有在当前运行的作业/进程主动放弃处理机时,才需要调度,才需要计算响应比,不会导致饥饿;适用于早期批处理系统;在每次进行作业调度时,先计算后备作业队列中每个作业的响应比,从中选出响应比最高的作业投入运行;响应比Rp= 等 待 时 间 + 要 求 服 务 时 间 要 求 服 务 时 间 \frac{等待时间+要求服务时间}{要求服务时间} +;根据公式可知:
        a.作业的等待时间相同时,要求服务时间越短,响应比越高,有利于短作业,类似于SJF
        b.要求服务时间相同时,作业的响应比由其等待时间决定,等待时间越长,其响应比越高,类似于FCFS
        c.对于长作业,作业的响应比可以通过随等待时间的增加而提高,等待时间足够长时也会获得处理机,从而避免了饥饿现象
        4.优先级调度算法:即可用于作业调度,也可用于进程调度,甚至会用于I/O调度;作业调度:每次从后备队列中选择优先级最高的一个或几个作业,将它们调入内存,分配必要的资源,创建进程并放入就绪队列;进程调度:每次从就绪队列中选择优先级最高的进程,将处理机分配给它,使之投入运行;会导致饥饿;优点:用优先级区分紧急程度、重要程度,适用于实时操作系统(交互式系统),可灵活调整各种作业/进程的偏好程度;缺点:若源源不断地有高优先级进程到来,则可能导致饥饿;根据新的更高优先级进程是否能抢占正在执行的进程,可将调度算法分为:a.非抢占式优先级调度算法;b.抢占式优先级调度算法;根据进程创建后其优先级是否可以改变分为:a.静态优先级:创建进程时就确定(决定因素有:进程类型、进程对资源的要求、用户要求)b.动态优先级:运行过程中根据进程情况的变化动态调整(决定因素有:进程占用CPU的时间长短、就绪进程等待CPU时间的长短);一般来说,进程优先级的设置可以参照以下原则:
        a.系统进程>用户进程
        b.交互式进程>非交互式进程(前台进程>后台进程)
        c.I/O型进程>计算型进程:I/O进程就是频繁使用I/O设备的进程,计算型进程是频繁使用CPU的进程(很少使用I/O设备);若将I/O型进程的优先级设置得更高,就更有可能让I/O设备尽早的开始工作,从而提高系统的整体效率
        5.时间片轮转调度算法(RR):用于进程调度;主要用于分时系统(交互式系统);公平地、轮流地为各个进程服务,让每个进程在一定时间间隔内都可以得到相应;系统将所有的就绪进程按FCFS策略排成一个就绪队列,每次选择就绪队列中的第一个进程执行运行一个时间片,使用完一个时间片后不管是否运行完成,都释放出(被剥夺)处理机给下一个就绪进程,被剥夺的进程返回到就绪队列的末尾重新排队,等候再次运行;只有作业放入内存建立了相应的进程后,才能被分配处理机时间片;属于抢占式算法,由时钟装置发出时钟中断来通知CPU时间片已到,不会导致饥饿;优点:公平、响应快、适用于分时操作系统;缺点:由于高频繁的进程切换,因此有一定开销,不区分任务的紧急程度;关于时间片:时间片过大,退化为FCFS,时间片过小:处理机开销过大,真正用于运行用户进程的时间减少;时间片决定因素:系统响应时间、就绪队列中的进程数目、系统的处理能力
        6.多级队列调度算法:在系统中设置多个就绪队列,将不同类型或性质的进程固定分配到不同的就绪队列,每个队列可实施不同的调度算法;同一队列中的进程可以设置不同的优先级,不同的队列本身也可以设置不同的优先级;在多处理机系统中,可以很方便的为每个处理机设置一个单独的就绪队列,每个处理机可以实施各自不同的调度策略,这样就能根据用户需求将多个线程分配到一个或多个处理机上运行
        7.多级反馈队列调度算法:用于进程调度;属于抢占式算法,会导致饥饿;不必事先估计进程的执行时间;算法的实现思想如下:
        a.设置多个就绪队列,并为每个队列赋予不同的优先级,第1级队列优先级最高,其余队列优先级逐个降低
        b.赋予各个队列的进程运行时间片的大小各不相同,优先级越高,时间片越小(如第i+1级队列的时间片要比第i级队列的优先级长一倍)
        c.每个队列都采用FCFS算法,新进程进入内存后,把它放置第1级队列的末尾,按照FCFS原则等待调度,轮到它执行时,如果在时间片内完成,则撤离系统,否则插入到下一级队列的末尾,降到最后一级队列时(第n级),在第n级队列中采用时间片轮转方式运行
        d.按照队列优先级调度,仅当第1~i-1级队列均为空时,才会调度第i级队列中的进程运行,若处理机正在执行第i级队列中的某进程,当又有新进程进入任一优先级较高的队列时,立即把正在执行的进程放回第i级队列的末尾,并把处理机分配给新到的高优先级进程
        优点:对各类进程相对公平(FCFS的优点),短进程只用较少的时间就可以完成(SPF的优点),每个新到达的进程都可以很快得到响应(RR的优点),不必估计进程的运行时间(避免用户造假),可灵活地调整对各类进程的偏好程度,比如CPU密集型进程、I/O密集型进程(拓展:可以将因I/O而阻塞的进程重新放回原队列,这样I/O型进程就可以保持较高优先级)

在这里插入图片描述

        进程切换:对于一般进程而言,其创建、撤销及要求由系统设备完成的I/O操作,都是利用系统调用进入内核,再由内核中的相应处理程序予以完成;进程切换同样是在内核的支持下实现的;任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关的
        上下文切换:切换CPU到另一个进程需要保存当前进程状态并恢复另一个进程的状态,这个任务就是上下文切换;上下文是指某一时刻CPU寄存器和程序计数器的内容;上下文切换时,内核会把旧进程状态保存在其PCB中,然后加载新进程的上下文;上下文切换的实质是指处理机从一个进程的运行转到另一个进程上运行,在这个过程中,进程的运行环境发生了实质性的变化,流程如下:
        1.挂起一个进程,保存CPU上下文,包括程序计数器和其他寄存器
        2.更新PCB信息
        3.把进程的PCB移入相应的队列
        4.选择另一个进程执行,并更新其PCB
        5.跳转到新进程PCB中的程序计数器所指向的位置进行
        6.恢复处理机上下文
        下文切换的消耗:上下文切换通常是计算密集型,需要相当可观的CPU时间,所以上下文切换对系统来说意味着消耗大量的CPU时间;有些处理器提供多个寄存器组,这样,上下文切换就只需要简单改变当前寄存器组的指针
        上下文切换与模式切换:模式切换与上下文切换是不同的;模式切换时,CPU逻辑上可能还在执行同一进程;用户态和内核态之间的切换称为模式切换;上下文切换只能发生在内核态
        调度和切换:调度是决定资源分配给哪个进程的行为,是一种决策行为;切换是指实际分配的行为,是执行行为;一般来说,现有资源的调度,然后才有进程的切换

        为什么要进程处理机调度?为了合理地处理计算机的软/硬件资源


习题总结

        时间片轮转的主要目的是,使得多个交互的用户能够得到及时的响应,使得用户以为“独占”计算机的使用,不会对特殊进程做特殊服务,时间片轮转增加了系统开销,所以不会使得操作系统高效运转,吞吐量和周转时间均不如批处理

        FCFS有利于CPU繁忙型的作业,而不利于I/O繁忙型的作业

        进程(线程)调度的时机包括:运行的进程(线程)运行完毕、运行的进程(线程)自我阻塞、运行的进程(线程)的时间片用完、运行的进程(线程)所需的资源没有准备好、运行的进程(线程)出现错误;【可抢占式】:就绪队列中的某个进程(线程)的优先级高于当前运行进程(线程)的优先级时,也会发生进程(线程)调度

        RR算法是绝对可抢占的

        作业是从用户角度出发的,它由用户提交,以用户任务为单位;进程是从操作系统出发的,由系统生成,是操作系统的资源分配和独立运行的基本单位

        分时操作系统中响应时间与时间片和用户数成正比;UNIX是一个强大的多用户、多任务操作系统,支持多种处理机架构,按照操作系统分类,属于分时操作系统;中断向量本身是用于存放中断服务例行程序的入口地址,因此中断向量地址就应是该入口地址的地址;中断由硬件保护并完成,主要是为了保证系统运行可靠、正确,提高处理速度也是一个好处,但不是主要目的

        在系统调用完成并返回用户态时能进行处理机调度

        时钟中断发生后,系统会修改当前进程在时间片内的剩余时间;影响时间片大小的主要因素包括响应时间、系统开销和进程数量等

        就绪队列的数量会影响长进程的最终完成时间;就绪队列的优先级会影响进程执行的顺序;各就绪队列的调度算法会影响各队列中进程的调度顺序;进程在就绪队列间的迁移条件会影响各进程在各队列中的执行时间

        在分时系统的时间片轮转调度中,当系统检测到时钟中断时,会引出时钟中断处理程序,调度程序从就绪队列中选择一个进程为其分配时间片,并且修改该进程的进程控制块中的进程状态等信息,同时将时间片用完的进程放入就绪队列或让其结束运行

        多级反馈队列的调度算法能较好地满足各种类型用户的需要。对于终端用户而言,由于它们提交的作业大多属于交互式作业,作业通常比较短小,系统只要能使这些作业在第1级队列所规定的时间片内完成,便可使终端型用户感到满意;对于短批处理作业用户而言,它们的作业开始时就像终端型作业一样,若仅在第1级队列中执行一个时间片即可完成,便可获得与终端型作业一样的响应时间,对于稍长的作业,通常也只需要在第2级队列和第3级队列中各执行一个时间片即可完成,而周转时间仍然较短;对于长批处理作业用户而言,它们的长作业将依次在第1,2,…,n级队列中运行,然后按时间片轮转方式运行,用户不必担心其作业长期得不到处理

        为提高CPU的效率,一般情况下要尽量减少时钟中断的次数,以延长中断的时间间隔。或将每个时间片的中断数量(时钟数)加大。也可以优化中断处理程序,减少中断处理开销


  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辰chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值