1、进程调度的简单图示:

这个图片是网友的
下面是关于这部分的知识点:
二、进程调度的方式
当某个进程正在处理机上执行时。若有某个更为重要或紧迫的进程需要处理,即有优先权更高的进程进入就绪队列,此时要考虑以某种方式分配处理机。
·通常有以下两种进程调度方式:
(1)非剥夺(非抢占)调度方式:当一个进程正在处理机上执行时,即使有某个更为重要或者紧迫的进程进入就绪队列,仍然让正在执行的进程继续执行,知道该进程完成或发生某种事件而进入阻塞态时,才把处理机分配给更为重要或紧迫(优先级更高)的进程。其优点是实现简单,系统开销小,适用于大多数批处理系统,但它不能用于分时系统和大多数实时系统。
(2)剥夺(抢占)调度方式:当一个进程正在处理机上执行时,若有某个更为重要或紧迫的进程(优先级更高)的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给这个更重要的进程。这种方式对提高系统吞吐率和响应效率都有明显的好处。但抢占也要遵循一定原则。
三、调度的基本准则
在进行调度的时候,要考虑很多方面的需求,正如CPU的等待时间,IO设备的等待时间
(1)系统吞吐量:单位时间内CPU完成的作业数量。长作业需要消耗较长的处理机时间,会降低系统的吞吐量。对于短作业,他们所需消耗的处理机时间较短,因此能提高系统吞吐量。调度算法和方式不同,也会对系统的吞吐量产生较大影响。
(2)周转时间:周转时间是指从作业提交到作业完成所经历的时间,是作业等待、在就绪队列中排队,在处理机上运行及输入输出操作所花费的时间的总和。

这部分是带权周转时间以及平均带权周转时间;
(3)等待时间:进程处于等处理机状态的时间之和。等待时间越长,用户满意度越低。实际上,处理机调度算法实际上并不影响作业执行或输入输出操作的时间,只影响作业在就绪队列中等待所花的时间。因此,衡量一个调度算法的优劣,常常只需简单地考察等待时间。
(4)响应时间:用户提交请求到系统首次产生响应所用的时间。在交互式系统中,周转时间不可能是最好的评价准则,一般采用响应时间作业衡量调度算法的重要准则之一。从用户角度来看,调度策略应该尽量降低响应时间,使得响应时间处在用户能接受的范围之内。
四、几种调度的算法
- 先来先服务(FCFS)调度算法
FCFS是一种最简单的调度算法,它既可以用于作业的调度,又可以用于进程调度。在作业调度中,算法每次从后备作业队列中选择最先进入该队列的一个或几个作业,将他们调入内存,分配必要的资源,创建进程并放入就绪队列。
在进程调度中,FCFS调度算法每次从就绪队列中选择最先进入该队列的进程,将处理机分噢诶给它,使之投入运行,直到完成或尹某种原因而阻塞时才释放处理机。
FCFS属于不可剥夺(抢占)算法。从表面上看,它对所有作业都是公平的,但是如果有一个长作业先到达系统,就会使后面许多短作业等待很长时间,因此这种方法肯定不能作为分时系统和实时系统的调度方法,但是它常被结合在其他调度策略使用。比如在使用优先级作为调度策略的系统中,往往对多个具有相同优先级的进程按FCFS原则处理。
· 特点分析:算法简单,但是效率低下;对长作业较为有利,对短作业不利;利于CPU繁忙型作业,不利于I/O繁忙型作业。
- 2短作业优先(SJF)调度算法
短作业(进程)优先调度算法是指对短作业(进程)优先调度算法。短作业优先调度算法从后备队列中选择一个或若干估计运行时间最短的作业,将它们调入内存运行;短进程优先(SPF)调度算法是从就绪队列中选择一个估计运行时间最短的进程,将处理机分配给它,使之立即指向,直到完成或发生某时间而阻塞时,才释放处理机。
但是这种算法有着不容忽视的缺点:
①该算法对长作业不利,SJF中长作业的周转时间会增加。更糟的是,若一旦有长作业进入系统的后备队列,由于调度程序总是优先调度那些短作业(即使是后来的短作业也会被优先安排给处理机),导致长作业长期不被调度,饿死在后备队列中。
②完全没有考虑作业的紧迫程度,因而不能保证紧迫的作业会被及时处理。
③由于作业的长短只是根据用户所提供的预估的执行时间而定的,而用户又可能会有意无意地缩短其作业的估计运行时间,使得算法不一定能真正做到短作业优先调度。
但这算法的优点也显而易见:平均等待时间、平均周转时间最少。
- 优先级调度算法
又称优先权调度算法,它既可以用于作业调度,又可用于进程调度。该算法的优先级用于描述作业运行的紧迫程度。
在作业调度中,优先级调度算法每次从后备作业队列中选择优先级最高的一个或几个作业,将他们调入内存,分配必要的资源,创建进程并放入就绪队列。在进程调度中,优先级调度算法每次从就绪队列中选择优先级最高的进程,并分配处理机,运行。
根据新的更高的优先级进程能否抢占正在执行的进程,可将该调度算法分为如下两种:
①非剥夺(抢占)式优先级调度算法:当一个进程正在处理机上运行时,即使有某个更在重要或者紧迫的进程进入就绪队列,仍然让正在运行的进程继续运行,直到由于自身的原因而主动让出处理机时(任务完成或等待),才把处理机分配给更重要或紧迫的进程。
②剥夺式优先级调度算法:当一个进程正在处理机上运行,若有某个更为重要或紧迫的进程进入就绪队列,则立即暂停正在运行的进程,将处理机分配给更重要或紧迫的进程。
而根据进程创建后其优先级是否可以改变,可以将进程优先级分为一下两种:
①静态优先级:优先级是在创建进程时确定的,并且进程的整个运行期间保持不变。确定静态优先级的主要依据有进程类型、进程对资源的要求、用户要求。
②动态优先级:在进程运行过程中,根据进程情况的变化动态调整优先级。动态调整优先级的主要依据有进程占有CPU的时间的长短、就绪进程等待CPU时间的长短。
一般来说,进程优先级可以参考一下原则:
①系统进程>用户进程。
②交互型进程>非交互型进程(前台进程>后台进程)
③I/O型进程>计算型进程。
- 高响应比优先调度算法
主要用于作业调度,是对FCFS调度算法和SJF调度算法的一种综合平衡,同时考虑了每个作业的等待时间和估计的运行时间。在每次进行作业调度时,先计算后备队列中每个作业的响应比,从中选出响应比最高的作业投入运行。
响应比的变化规律可描述为:
响应比Rp = (等待时间+要求服务时间)/要求服务时间
根据公式可知:
①作业的等待时间相同时,要求服务时间约旦,响应比越高,有利于短作业。
②要求服务时间相同时,作业的响应比由其等待时间决定,等待时间越长,其响应比越高,因而它实现的是先来先服务。
③对于长作业,作业的响应比可以随等待时间的增加而提高,等待时间足够长时,其响应比便可升到很高,从而可以获得处理机,不会饿死。
- 时间片轮转调度算法
时间片轮转调度算法主要适用于分时系统。在这种算法中,系统将所有就绪进程按到达时间的先后次序排成一个队列,进程调度程序总是选择就绪队列中的第一个进程执行,即先来先服务的原则,但是仅能运行一个时间片。在使用完一个时间片后,即使进程并未完成其运行,它也必须释放出(被抢占)处理机给下一个就绪的进程,而被抢占的进程返回到就绪队列的末尾重新排队,等候再次运行。
在时间片轮转的调度算法中,时间片的大小对系统性能有很大影响。如果时间片足够大,以至于所以进程都能在一个事件内执行完毕,则时间片轮转调度算法就退化成FCFS算法。如果时间片很小,则处理机将在进程间过于频繁地切换,使得处理机开销增大,而真正用于运行用户进程的时间将减少。因此,时间片的选择要适当,可以根据系统响应时间、就绪队列中的进程数目和系统的处理能力等决定。
- 多级反馈队列调度算法
多级反馈队列调度算法是时间片轮转算法和优先级调度算法的综合与发展。通过动态调整进程优先级和时间片的大小,多级反馈队列调度算法可以兼顾多方面的系统目标。例如,为了提高系统吞吐量和缩短平均周转时间而照顾短进程;为了获得较好的I/O设备利用率和缩短响应时间而照顾I/O型进程;同时,也不必实现估计进程的执行时间。

(这个图片很清晰,很容易明白多级反馈队列调度算法,正好跟最前面那张图片 解释的进程调度,)
多级反馈队列调度算法的实现思想如下:
(1)设置多个就绪队列,并为各个队列赋予不同的优先级,第一级队列的优先级最高,第二级队列次之,其余队列的优先级逐次降低。
(2)赋予各个队列中进程执行时间片的大小各不相同。在优先级越高的队列中,每个进程的运行时间片越小。例如,第二级队列的时间片要比第一级队列的时间片长一倍…第i+1级队列的时间片要比第i级队列的时间片长一倍。
(3)当一个新的进程进入内存后,首先将它放入第一级队列的末尾,按FCFS原则排队等待调度。当轮到该进程执行时候,如果它能在时间片内完成,便可准备撤离系统;若它在一个时间片结束时尚未完成,调度程序便将该进程转入第二级末尾,再同样按FCFS原则等待调度执行;若它在第二级队列中运行一个时间片后仍未完成,再以同样的方法进入第三级队列…如此下去,当一个长进程从第一级队列一次降到第n级队列后,在第n级队列中便采用时间片轮转方式进行。
(4)仅当第一级队列为空时,调度程序才调度第二级队列中的进程进行;仅当第1到(i-1)级队列均为空,才会调度第i级队列中的进程运行。若处理机正在执行第i级队列中的某个进程,此时又有新的进程进入优先级较高的队列[第1到(i-1)级的任意一级],则此时行进程将抢占正在运行的处理机,即由调度程序把正在运行的进程放回第i级队列末尾,把处理机分配给新到的更高优先级进程。
这种调度方法优势如下:
(1)终端型作业用户:短作业优先。
(2)短批处理作业用户:周转时间较短。
(3)长批处理作业用户:经过前面几个队列得到部分执行,不会饿死。
------------------------------------------------------------------------------------------------------------------------------------------------------------------
关于作业中提到的几个输出指标:
- IO等待时间
IO等待时间是指进程在执行过程中由于需要进行输入/输出(I/O)操作而处于阻塞状态,等待I/O操作完成所花费的时间。在这段时间内,进程无法继续执行,而是被挂起或者阻塞,直到所需的I/O操作完成为止。
IO等待时间是影响系统性能和吞吐量的重要指标之一。高IO等待时间可能意味着系统中存在I/O瓶颈,例如磁盘速度慢、网络带宽不足、外部设备响应缓慢等问题。优化系统的IO等待时间可以通过改进存储设备、优化文件系统、使用更快速的网络设备以及对I/O密集型任务进行合理调度等方式来实现。
- IO占用时间
IO占用时间则是指系统中被用于进行输入/输出(I/O)操作的时间,包括了应用程序或系统内核执行I/O操作所花费的时间。这一时间指标可以反映系统中I/O活动的强度和性能状况。
在程序中展示IO等待时间可以通过以下步骤进行计算:
- 在进程调度模拟程序中,记录每个进程的开始时间(arrival time)和完成时间(completion time)。
- 当一个进程需要进行I/O操作时,记录下当前时间作为IO请求发出时间(IO request time)。
- 当IO操作完成时,记录下当前时间作为IO操作完成时间(IO completion time)。
- 根据上述信息,计算每个进程的IO等待时间: IO等待时间 = IO请求发出时间 - 进程开始时间
- 计算每个进程的IO占用时间: IO占用时间 = IO完成时间 - IO请求发出时间 相当于一个结束时间减去开始时间,针对IO片段的
在模拟进程调度过程中,可以根据实际情况模拟进程的到达、执行和I/O操作等过程,并记录相应的时间点。通过以上计算,你可以得到每个进程的IO等待时间和IO占用时间,以便进行性能分析和优化。
需要注意的是,IO等待时间和IO占用时间是针对单个进程的指标,而不是系统整体的指标。如果想要获取系统整体的IO等待时间和IO占用时间,需要对所有进程进行统计和求和。
对于一个进程有多个IO片段的情况,计算该进程的总IO等待时间和总IO占用时间时,需要对其每一个片段进行求和。
具体来说,针对每个IO片段,单独计算该片段的IO等待时间和IO占用时间,并将其累加到进程的总IO等待时间和总IO占用时间中。这样可以更准确地反映出进程在整个执行过程中的IO等待情况和IO占用情况。
- 就绪等待时间
在模拟进程调度时,就绪等待时间表示进程在就绪队列中等待被调度执行的时间。通常情况下,就绪等待时间可以用来衡量进程在系统中等待执行的时间长短。计算进程的就绪等待时间可以按照以下步骤进行:
-
首先,记录每个进程的到达时间(arrival time)和完成时间(completion time)。
-
对于每个进程,计算其就绪等待时间: 就绪等待时间 = 开始执行时间 - 到达时间
其中,开始执行时间可以根据具体的调度算法来确定,比如先来先服务(FCFS)调度算法中,开始执行时间就是进程进入CPU的时间;而对于抢占式调度算法,可能会有多次进程切换,需要记录每次进程重新开始执行的时间点。
- 周转时间
周转时间 = 完成时间 - 到达时间
其中,完成时间是指进程执行完毕并终止的时间点,到达时间是指进程首次到达系统的时间点。周转时间反映了进程从到达系统到完成执行所经历的总时间
- 带权周转时间
带权周转时间=周转时间/服务时间;也就是运行所需要的时间
平均周转时间=作业周转总时间/作业个数; (除以进程的个数)
平均带权周转时间=带权周转总时间/作业个数; (除以进程的个数)
关于进程调度实现的指针图示:
计算机操作系统实验之进程调度(一)轮转调度法(C语言)-CSDN博客
关于进程调度的C语言的运行
下面暂时不太明白阻塞队列怎么整;
- 关于阻塞队列和就绪队列
进程调度涉及到操作系统中的就绪队列和阻塞队列,它决定了哪些进程能够获得CPU时间片来执行。下面我将为你解释一下进程调度的基本流程和过程,并提供一些关于模拟进程调度的建议。
进程调度的基本流程和过程:
- 进程的状态: 一个进程可以处于就绪态、运行态或阻塞态。
- 就绪队列和阻塞队列: 就绪队列存放着已经准备好运行、但还未获得CPU时间片的进程;阻塞队列存放着由于等待某种资源(如IO操作)而被阻塞的进程。
- 调度算法: 操作系统通过调度算法从就绪队列中选择一个进程来执行。常见的调度算法包括先来先服务(FCFS)、最短作业优先(SJF)、优先级调度、轮转调度等。
- 状态转换: 当进程获得CPU时间片开始执行时,它从就绪态转换为运行态;当进程需要等待资源时,它从运行态转换为阻塞态;当进程执行完成或者时间片用完时,它从运行态转换为就绪态。
模拟进程调度的建议:
- 设计进程控制块(PCB): 为每个进程设计一个数据结构,其中包含进程的状态、优先级、运行时间、等待时间等信息。
- 实现调度算法: 根据需求选择合适的调度算法,并在模拟中实现它。可以使用队列或者其他数据结构来表示就绪队列和阻塞队列。
- 模拟进程状态转换: 在模拟中根据进程的执行情况,实现进程状态的转换,包括就绪态、运行态和阻塞态之间的切换。
- 模拟并发执行: 如果需要模拟多个进程的并发执行,可以使用多线程或者协程来模拟多个进程同时执行的情况。
在编写程序模拟进程调度时,要考虑进程的创建、调度、状态转换以及并发执行等方面的问题,这样可以更好地理解进程调度的原理和实现。
- 问CHAT的结果;关于实现就绪队列和阻塞队列
要实现简单的轮转调度算法,并且进程中存在IO设备片段,可以按照以下步骤进行:
- 设计数据结构: 设计进程控制块(PCB)来保存每个进程的信息,包括进程ID、状态、优先级、运行时间、等待时间等。
- 创建进程队列: 创建就绪队列和阻塞队列来存放相应状态的进程。就绪队列存放已经准备好运行、但还未获得CPU时间片的进程;阻塞队列存放由于等待IO设备而被阻塞的进程。
- 初始化进程队列: 初始化进程队列,将所有进程添加到就绪队列中。
- 执行轮转调度: 循环执行以下步骤:
- 从就绪队列中选择一个进程,将其从就绪队列中取出,并将其状态设置为运行态。
- 执行进程的CPU片段,使用时间片(例如10ms)模拟进程的执行。如果进程的CPU片段执行完成,进程进入下一个状态。
- 如果进程有IO片段,将进程状态设置为阻塞态,并将其添加到阻塞队列中。
- 如果进程的CPU片段尚未执行完成,将进程重新放回就绪队列中,等待下一次调度。
- 处理阻塞队列: 在每个时间片结束后,检查阻塞队列中的进程。对于等待IO设备的进程,模拟IO设备操作,当IO操作完成时,将进程状态设置为就绪态,并将其放回到就绪队列中。
- 更新进程状态和统计信息: 根据进程的执行情况,更新进程的状态和相关统计信息,如等待时间、运行时间等。
- 重复步骤4-6,直到所有进程执行完成。
需要注意的是,在轮转调度算法中,每个进程都会按照一定的时间片执行,然后切换到下一个进程。如果进程的CPU片段很短,可以考虑减小时间片的长度,以便更好地模拟多个进程之间的切换。
阻塞队列的添加
----------------------------------------------------------------明天接着写,。。。