前言:
- 在之前的文章中,我们已经了解了进程和线程相关的基本概念,今天我们将要了解的是关于处理机调度相关的知识。
(一)调度的概念
1、调度的基本概念
在多道程序系统中,进程的数量往往多于处理机的个数,因此进程争用处理机的情况在所难免。处理机调度是对处理机进行分配,即从就绪队列中按照一定的算法(公平、高效的原则)选用一行进程并将处理机分配给它运行,以实现进程并发地执行。
⚔️ 处理机调度是多道程序操作系统的基础,是操作系统设计的核心问题 ⚔️
2、调度的层次
一个作业从提交开始直到完成,往往需要经历以下三级调度,具体如下:
⏭高级调度 (作业调度)
- 它负责从外部存储器(如硬盘、网络等)中选择一个或多个作业(job),并将它们调入内存中,为它们创建进程,并在系统资源充足时将它们放入就绪队列中等待CPU执行。
- 简单点来说,高级调度就是内存与辅存之间的调度,对于每个作业,只调入一次,调出一次。
⏭中级调度 (内存调度)
- 它负责在内存中运行的进程数量和大小之间进行平衡,并控制进程在内存中的位置和状态;
- 中级调度通常由操作系统自动执行,其主要任务是将某些处于阻塞状态的进程移动到外部设备或磁盘上,以释放出宝贵的内存资源。
🔥 注意 🔥
中级调度与高级调度对比:
- 高级调度是针对整个作业或进程的调度;
- 而中级调度则是针对进程在内存中的状态进行调度。中级调度主要关注内存的使用情况,以保证系统的稳定性和性能。
⏭低级调度 (进程调度)
- 它控制CPU从就绪队列中选择下一个要执行的进程,并将CPU分配给该进程;
- 低级调度的目的是尽可能快地完成当前进程的运行,以达到最大的系统吞吐量和响应速度
3、三级调度的关系
- 调度对象:高级调度的调度对象是作业(job),即用户提交给操作系统的程序。中级调度的调度对象是进程(process),即正在运行的程序实例。低级调度的调度对象是CPU执行的进程。
- 调度频率:高级调度的调度频率较低,通常在作业到达时才会执行一次。中级调度的调度频率稍微高一些,大约每几秒钟或分钟执行一次。低级调度的调度频率最高,通常每隔几毫秒、甚至微秒就会执行一次。
- 调度目标:高级调度的调度目标是控制系统的吞吐量和资源利用率,以及保证用户程序的公平性。中级调度的调度目标是在内存中运行的进程数量和大小之间进行平衡,并控制进程在内存中的位置和状态。低级调度的调度目标是尽可能快地完成当前进程的运行,以达到最大的系统吞吐量和响应速度。
- 调度策略:高级调度通常采用先来先服务(FCFS)或优先级调度等简单的调度策略。中级调度通常采用LRU(最近最少使用)或FIFO(先进先出)等算法来选择要被换出的进程。低级调度则通常采用时间片轮转、优先级抢占或多级反馈队列等复杂的调度策略。
- 调度开销:高级调度的开销较大,因为它涉及到从外部存储器中读取数据、分配内存空间、创建进程等复杂的操作。中级调度和低级调度的开销相对较小,因为它们只需要对进程或CPU进行简单的状态切换即可。
(二)调度的目标
不同的调度算法有不同的特性,在选择调度算法的时候,必须考虑相应的算法特性。为了比较处理机调度算法的性能,人们提出了很多评价标准,具体有以下几个:
1️⃣cpu利用率
- CPU是计算机最昂贵的和最重要的资源之一,所以应该尽可能的满足“忙”状态,使这一资源得到充分的利用。计算方法如下:
2️⃣系统吞吐量
- 系统吞吐量(throughput)是指单位时间内系统能够处理的任务或作业数量。在操作系统中,系统吞吐量通常用于衡量操作系统的性能和效率。
3️⃣周转时间
- 是指从作业提交到完成的时间,是作业等待、在就绪队列中排队、在处理机上运行及输入输出所花费的时间总和。计算方法如下:
- 平均周转时间是指多个作业周转的平均值:
- 带权周转时间是指多个作业带全周期时间的比值:(>=1)
- 平均带权周转时间是指多个作业带权周转时间的平均值:
4️⃣等待时间
- 指进程处于等处理机的时间之和,等待时间越长,用户满意度越低。处理机调度算法实际上并不影响作业执行或输入/输出操作的时间,只影响作业在就绪队列中等待所花的时间。
💨 因此,衡量一个调度算法的优劣,常常只需简单地考察等待时间。
5️⃣响应时间
- 指从用户提交请求到系统首次产生响应所用的时间;
- 在交互式系统中,周转时间不是最好的评价准则,一般采用响应时间作为衡量调度算法的重要准则之一;
- 从用户角度来看,调度策略应尽量降低响应时间,使响应时间处在用户能接受的范围之内。
【小结】
- 要想得到一个满足所有用户和系统要求的算法几乎是不可能的;
- 设计调度程序,一方面要满系统用户的要求(如某些实时和交互进程的快速响应要求);
- 另一方面要考虑系统整体效减少整个系统的进程平均周转时间),同时还要考虑调度算法的开销。
(三)调度的实现
1、调度器
在操作系统中,用于调度和分派cpu的组件称为调度程序,它们通常右三大组件构成。
1️⃣排队器
- 将系统中的所有就绪进程按照一定的策略排成一个或多个队列,以便于调度程序选择。每当有一个进程转变为就绪态时,排队器便将它插入到相应的就绪队列中。
2️⃣分派器
- 依据调度程序所选的进程,将其从就绪队列中取出,将 CPU 分配给新进程
3️⃣上下文切换器
在对处理机进行切换时,会发生两对上下文的切换操作:
- 第一对,将当前进程的上下文保存到其 PCB 中,再装入分派程序的上下文,以便分派程序运行;
- 第二对,移出分派程序的上下文,将新选进程的 CPU 现场信息装入处理机的各个相应寄存器。
【小结】
- 在上下文切换时,需要执行大量 load 和 store 指令,以保存寄存器的内容,因此会花费现在已有硬件实现的方法来减少上下文切换时间;
- 通常采用两组寄存器,其中一组供内核使用,一组供用户使用;
- 因此,上下文切换时,只需改变指针,让其指向当前寄存器组即可。
2、调度的时机、切换与过程
- 可以进行调度和切换的情况如下:
- 不可以进行调度和切换的情况如下:
3、进程调度的方式
通过情况下主要有两种进程调度方式:
1}非抢占式调度方式:
- 它指定了一个进程在运行中不会被操作系统强制中断,只有当这个进程自己完成或者发生某些事件时才会放弃CPU控制权。
应用场景:
- 通常适用于一些轻量级应用程序,如嵌入式系统、移动设备或者实时数据处理等场景;
- 因为这些应用程序通常需要快速响应用户输入或者外部事件,而非抢占式调度可以保证当前进程能够完整地执行,避免出现任务切换带来的开销和延迟,提高了响应速度和稳定性
2}抢占式调度方式:
- 在这种调度策略下,操作系统可以强制中断正在执行的进程,并将CPU分配给优先级更高的进程。
应用场景:
- 通常适用于对响应速度要求比较高、需要快速处理事件的应用程序,如实时系统或者多任务操作系统等场景。它可以保证高优先级进程能够及时获得CPU使用权,提高系统的性能和稳定性。
注意:
- 抢占式调度和非抢占式调度并不是对立的,而是可以结合起来使用;
- 例如,在Windows操作系统中,就采用了两种调度策略:时间片轮转(抢占式)和优先级调度(非抢占式),以提供更好的操作系统服务。
4、闲逛进程
- 是指在操作系统中专门用于占用CPU空闲时间的一种特殊进程。当操作系统中没有其他可执行的进程时,闲逛进程就会被调度执行,以防止CPU处于空闲状态浪费资源。
注意:
闲逛进程的实现方式可能因操作系统而异:
- 在Windows操作系统中,闲逛进程的任务是通过调用空闲处理程序Idle Process来实现的;
- 在Linux操作系统中,闲逛进程的任务是通过内核线程kidle实现的。
5、两种线程的调度
在操作系统中,线程调度通常有两种方式:用户级线程调度和内核级线程调度
用户级线程调度
- 用户级线程是由应用程序通过线程库(Thread Library)实现的,它们只存在于应用程序的地址空间中,不涉及到操作系统内核。因此,用户级线程的调度也是由应用程序自己来完成的。
优缺点:
- 用户级线程调度的优点是速度快、灵活性高,可以根据应用程序的需要进行定制化设置;
- 缺点是无法利用操作系统提供的多处理器支持,并且可能会出现线程饥饿等问题。
内核级线程调度
- 内核级线程的调度是由操作系统内核来完成的。对被选择的线程赋予一个时间片,超出了时间片的限制就会强制挂起该线程。
优缺点:
- 内核级线程调度的优点是稳定性高、可靠性强,可以充分利用系统资源,并避免线程饥饿等问题;
- 缺点是速度较慢,因为每次进行线程切换时都需要从用户态切换到内核态。
(四)典型的调度算法
1、先来先服务调度算法(FCFS)
定义:
- 是一种最简单的进程调度算法。它按照进程到达的先后顺序进行调度,即先到达的进程首先被执行,直到该进程执行完或等待某些事件发生才会切换到下一个进程。
流程图:
该调度算法不考虑进程的优先级和执行时间长短,因此可能导致一些长时间运行的进程占用CPU资源,从而影响系统的响应速度和吞吐量。此外,如果有一个进程占用了大量的I/O操作,则其他进程也可能被阻塞,导致整个系统变慢。
性能评价:
- FCFS调度算法的特点是算法简单,但效率较低;
- 对长作业有利,但对短作业不利(相对于SJF和高响应比);
- 有利于cpu繁忙型作业,而不利于I/O繁忙型作业
- 例题如下:
💨 总之,FCFS调度算法虽然简单易实现,但在实际应用中并不是很常见,通常会采用更加复杂的调度算法来提高系统的性能和稳定性。
2、短作业优先调度算法(SJF)
定义:
- 是一种按照进程执行时间长短进行调度的算法。它假设对于一个进程来说,执行时间越短,就应该优先获得CPU的使用权。
流程图:
当一个进程到达时,操作系统会比较该进程的执行时间和当前正在执行的进程的执行时间
- 如果新到达的进程执行时间更短,则将CPU控制权转移到该进程上;
- 如果有多个进程的执行时间相同,则按照先来先服务的原则进行调度。
性能评价:
- 算法对长作业不利, SJF 调度算法中长作业的周转时间会增严重的是,若有一长作业进入系统的后备队列,由于调度程序总是优先调度那些是后进来的)短作业,将导致长作业长期不被调度("饥饿"现象,注意区分"死锁“ ,后者是系统环形等待,前者是调度策略问题)
- 该算法完全未考虑作业的紧迫程度,因而不能保证紧迫性作业会被及时处理;
- 作业的长短是根据用户所提供的估计执行时间而定的,而用户又可能会有意可短其作业的估计运行时间,致使该算法不一定能真正做到短作业优先调度。
改进方案:
- 为了解决这个问题,可以采用动态SJF调度算法,即通过不断监测和更新每个进程的执行时间来调整优先级顺序;
- 另外,还可以采用预测执行时间的方式,如加权平均法、指数平均法等,以更好地适应实际情况的变化。
注意:
- 💨 在所有进程几乎同时可运行时 SJF 调度算法的平均等待时间、平均周转时间最少。
- 例题如下:
💨 总之,SJF调度算法在一些特定场景下可以提供比较好的性能和响应速度,但需要注意对于长进程的处理,以免出现饥饿现象。
3、优先级调度算法
定义:
- 是一种按照进程优先级进行调度的算法。每个进程被赋予一个优先级,优先级越高的进程将被优先执行,而低优先级的进程则可能会一直等待CPU使用权。
根据新的更高优先级进程能否抢占正在执行的进程,可将该调度算法分为如下两种:
- 1)非抢占式优先级调度算法。当一个进程正在处理机上运行时,即使有某个优先级更高的进程进入就绪队列,仍让正在运行的进程继续运行,直到由于其自身的原因而让出处理机时(任务完成或等待事件),才把处理机分配给就绪队列中优先级最高的进程。
- 2)抢占式优先级调度算法。当一个进程正在处理机上运行时,若有某个优先级更高的进进入就绪队列,则立即暂停正在运行的进程,将处理机分配给优先级更高的进程。
而根据进程创建后其优先级是否可以改变,可以将进程优先级分为以下两种:
- 1)静态优先级。优先级是在创建进程时确定的,且在进程的整个运行期间保持不变。确定静态优先级的主要依据有进程类型、进程对资源的要求、用户要求。
- 2)动态优先级。在进程运行过程中,根据进程情况的变化动态调整优先级。动态优先级的主要依据有进程占有 CPU 时间的长短、就绪进程等待 CPU 时间的长短。
动态调整优一般来说,进程优先级的设置可以参照以下原则:
- 1)系统进程>用户进程。系统进程作为系统的管理者,理应拥有更高的优先级。
- 2)交互型进程>非交互型进程(或前台进程>后台进程)。大家平时在使用手机时,后台运行的正在和你交互的进程应该更快速地响应你,因此自然需要被优先处理。
- 3)I/O 型进程>计算型进程。所谓 I / O 型进程,是指那些会频繁使用 I / O 设备的进程,而计算型进程是那些频繁使用 CPU 的进程(很少使用 I / O 设备)。我们知道, I / O 设备(5印机)的处理速度要比 CPU 慢得多,因此若将 I / O 型进程的优先级设置得更高,就更可能让 I / O 设备尽早开始工作,进而提升系统的整体效率。
- 流程图(抢占式):
- 例题如下:
【小结】
- 优先级调度算法可以保证高优先级的进程能够及时响应事件和处理任务,但如果不合理地设置优先级,也可能会导致低优先级进程长时间等待或者饥饿现象的出现;
- 因此,在设计和实现操作系统时,需要合理设置优先级、结合其他调度算法进行优化等措施,以提高系统的性能和稳定性。
4、高响应比优先调度算法
- 算法的提出:
- 例题如下:
整体分析:
5、时间片轮转调度算法
定义:
- 是一种按照时间片大小进行调度的算法。每个进程被分配一个固定大小的时间片,即每次只能执行一段固定长度的时间,如果在这个时间内没有完成,则该进程会被挂起,并将CPU控制权转移到下一个进程上。
时间片轮转调度算法可以确保每个进程都能获得CPU使用权,并且避免了长时间运行进程占用CPU资源而导致其他进程无法响应的问题。此外,由于每个进程都只能执行一段固定长度的时间,因此可以有效地控制进程的执行时间和处理能力。
- 例题如下:
- 整体如下:
注意:
- 时间片轮转调度算法可能会引入一定的上下文切换开销,特别是当时间片设置过小时;
- 此外,在某些负载较重的场景下,时间片轮转调度算法可能会导致一些进程长时间等待或者饥饿现象的出现。
- 流程图如下:
1.当所有就绪进程都被分配了时间片后,操作系统会重新从第一个进程开始,依次为每个进程分配新的时间片,以此类推;
2.如果某个进程长时间未能完成任务,则可能需要分配多个时间片给该进程,以确保其能够顺利完成执行。
【小结】
- 总之,时间片轮转调度算法是一种简单而有效的调度算法,适用于多任务操作系统和分时系统等场景;
- 在实际应用中,可以根据不同的系统负载和任务需求来灵活设置时间片大小,以最大限度地提高系统的性能和稳定性。
6、多级队列调度算法
前述的各种调度算法,由于系统中仅设置一个进程的就绪队列,即调度算法是固定且单一的,系统中不同用户对进程调度策略的不同要求。在多处理机系统中,这种单一调度策略实现机制的缺点更为突出,多级队列调度算法能在一定程度上弥补这一缺点。
该算法在系统中设置多个就绪队列,将不同类型或性质的进程固定分配到不同的就绪队列。 每个队列可实施不同的调度算法,因此,系统针对不同用户进程的需求,很容易提供多种调度策队列中的进程可以设置不同的优先级,不同的队列本身也可以设置不同的优先级。在多统中,可以很方便为每个处理机设置一个单独的就绪队列,每个处理机可实施各自不同略,这样就能根据用户需求将多个线程分配到一个或多个处理机上运行。
7、多级反馈队列调度算法
多级反馈队列调度算法是时间片轮转调度算法和优先级调度算法的综合与发展,如下图,动态调整进程优先级和时间片大小,多级反馈队列调度算法可以兼顾多方面的系统为提高系统吞吐量和缩短平均周转时间而照顾短进程;为获得较好的 I / O 设备利用间而照顾 I / O 型进程;同时,也不必事先估计进程的执行时间。
- 流程图如下:
多级反馈队列调度算法实现思想如下:
- 1)设置多个就绪队列,并为每个队列赋予不同的优先级。第1级队列的优先级最高,第二级队列的优先级次之,其余队列的优先级逐个降低。
- 2)各个队列的进程运行时间片的大小各不相同在优先级越高的队列中,每个进列的时间片就越小。例如,第 i +1级队列的时间片要比第 i 级队列的时间片长1倍。
- 3)每个队列都采用 FCFS 算法。当新进程进入内存后,首先将它放入第1级队列的末,按FCFS原则等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可撤离系统。若它在一个时间片结束时尚未完成,调度程序将其转入第2级队列的末尾等待调度;若它在2级队列中运行一个时间片后仍未完成,再将它放入第3级队列……,依止最后被降到第 n 级队列后,在第 n 级队列中便采用时间片轮转方式运行。
- 4)按队列优先级调度。仅当第1级队列为空时,才调度第2级队列中的进程运行;仅当第 1~ i -1级队列均为空时,才会调度第 i 级队列中的进程运行。若处理机正在执行第 i 级队列中的某进程时,又有新进程进入任一优先级较高的队列,此时须立即把正在运行的进程放回到第 i 级队列的末尾,而把处理机分配给新到的高优先级进程。
反馈队列的优势有以下几点:
- 终端型作业用户:短作业优先。
- 短批处理作业用户:周转时间较短。
- 长批处理作业用户:经过前面几个队列得到部分执行,不会长期得不到处理。
例题如下:
总结
(五)进程切换
1、上下文切换
是指当一个进程被中断或者阻塞后,操作系统需要保存该进程的执行上下文信息,并将CPU控制权转移到另一个就绪进程上去。当这个就绪进程获得CPU使用权时,操作系统需要恢复该进程的执行上下文信息,以便进程能够正确地继续执行。
💨 上下文切换的实质就是值处理机从一个进程的运行切换到另一个进程上运行,在这个过程中,进程的运行环境发生了实质性的变化。
流程如下:
- 1)挂起一个进程,保存 CPU 上下文,包括程序计数器和其他寄存器。
- 2)更新 PCB 信息。
- 3)把进程的 PCB 移入相应的队列,如就绪、在某事件阻塞等队列。
- 4)选择另一个进程执行,并更新其 PCB 。
- 5)跳转到新进程 PCB 中的程序计数器所指向的位置执行。
- 6)恢复处理机上下文。
2、上下文切换的功耗
- 上下文切换通常是计算密集型的,即它需要相当可观的 CPU 时间,在每秒几十上百次的每次切换都需要纳秒量级的时间,所以上下文切换对系统来说意味着消耗大量的 CPU 些处理器提供多个寄存器组,这样,上下文切换就只需要简单改变当前寄存器组的指针
3、上下文切换与模式切换
- 模式切换与上下文切换是不一样的,模式切换时,cpu逻辑上可能还在执行同一进程。
- 用户进程最开始都运行在用户态,若进程因中断或异常进入核心态运行,执行完后又回到用户态刚被中断的进程运行。
- 用户态和内核态之间的切换称为模式切换,而不是上下文切换,因为没有改变当前的进程;
- 上下文切换只能发生在内核态,它是多任务操作系统中的一个必需的特性。
注意:
- 调度是指决定资源分配给哪个进程的行为,是一种决策行为;
- 切换是指实际分配的行为,是执行行为。一般来说,先有资源的调度,然后才有进程的切换。
总结
到此,关于处理机调度的知识便讲解完毕了,接下来我们简单的总结一下本文都讲了什么吧!!!
- 首先,我们知道了为什么要引入处理机调度的机制,目的就是减少在进程运行过程中,提高对处理机资源的运用,避免造成极大的浪费;
- 接下来,针对不同的调度算法,我们给出了评价调度算法性能的指标;
- 其次,我们对调度底层是如何实现的进行了简单的了解,掌握了调度的基本时机,以及关于调度的两种方式之间的区别与联系;
- 然后,最重要的就是对于调度算法的学习了,我们学了7中不同的调度算法,针对每种算法我们给出了相应的优缺利弊,这是需要大家重点掌握的;
- 最后就是关于调度与切换之间的差别与联系了,大家需要记住一点:先有资源的调度才有进程的切换。
以上便是本文的全部内容了,感谢大家的观看与支持!!!