多级队列调度算法可视化界面_操作系统的调度

371cf5bcea5dba50b9c0d7707d8a2bf8.png

调度的定义

CPU并不只是简单的根据FIFO的规则来实现进程/线程的调度;
如何结合考虑进程/线程的 优先级运行时间等多方面的因素,实现合理、科学、高效得调度是本文要研究的核心内容;

758ca3458c7b38bbbe5876200b95292f.png

如上图中,左侧是FIFO+优先级的综合调度,右侧是FIFO+运行时间的综合调度;

而所谓调度,就是从 就绪队列中按照 一定的算法选择一个进程/线程并将CPU等资源分配给它运行,已达到并发的效果;

调度的三个层次

高级调度:磁盘 -> 内存(只会调度一次,创建进程的过程)

磁盘上的程序软件可以有千千万万个(够大),但是内存相对磁盘而言,是相当有限的,一般内存就8G,没法同时存放磁盘上所有的软件,因此一般只会启动磁盘的一部分软件,即创建相应的进程,存储并运行在内存上;

06a6bfd728581d68f399bdbef3896c5e.png
磁盘上的作业提交后,等待被创建成新的进程(即,高级调度)

磁盘上的某个软件程序以作业形式提交后,操作系统并不会立即就将其创建成新进程,作业的提交需要先进入磁盘中的作业等待队列中,CPU对这个等待队列中的作业以某种算法(通常思路是综合FIFO+优先级+***考虑因素)进行调度;所以我们平常使用Windows点击某个.exe软件时,界面上可能不会立马打开的软件窗口,可能需要等待一会软件才“启动响应”,这个过程其实就是新提交的创建进程的作业只是被放入等待队列中,还没有被CPU从队列中调度出来并执行作业;

这样的通过将作业提交至磁盘上的等待队列中,等待CPU调度并创建进程,然后将磁盘上的软件存储在内存的虚拟地址空间上,并由CPU取指执行的过程即是本小节讨论的“高级调度”;

e7be23af0b04ad310c0c633cbda942b5.png
高级调度:提交磁盘程序作业,等待创建新进程

中级调度:磁盘->内存(会被调度多次,处于挂起态的进程重新调入内存的过程)

由于内存是稀缺资源,对于当前未处于运行态的某些进程,不能“占着茅坑不拉屎”,当前未处于运行态的进程被临时从内存置换到磁盘中,等待该进程再次具备运行条件或者内存有足够余量时,再重新调回内存;这样做能极大提升内存利用率系统吞吐量

这里的 暂时将进程调到磁盘等待的进程状态,被称为 挂起状态

(注:从这段话,我们可以稍作思考,进程的PCB和进程在内存中的虚拟地址空间,在逻辑上应该是设计成分开存放的,这样即便当进程的代码段、数据段等被置换到磁盘上,该进程的PCB并不会被置换出去,PCB仍旧在常驻内存中,虽然在内存中具体存放位置,我还不太清楚,但PCB应该还在就绪队列或者阻塞队列指向的某个内存地址上,这样的话,操作系统才可以继续对该进程进行管理,仍不会影响该进程在未来的某个时候可能会被分配CPU时间片,并重新获得CPU使用权)

2b25a3a4b82fbaaa974fa2211e225bd0.png

注意这张图,虽然有两个进程从内存中被换到了磁盘中,但是与其对应的两个PCB依旧放在常驻内存上,接受操作系统的管理与调度;

上面介绍了什么是挂起态:因内存有限,当前不在运行的进程被暂时调到外存,此时进程的状态就是挂起态,即没在运行、又没有就绪或阻塞,更不是创建或终止;

而根据进程挂起之前的状态进行细分,可分为:就绪挂起阻塞挂起

不管是就绪挂起,还是阻塞挂起,都得是从磁盘重新调度到内存上,才能重新被运行;

1c5cd877f45a7f7c2dfb8d6af734c30b.png
五状态模型(未引入挂起态)

ef06971da7c7d3f692dfacc35132bbe8.png

341c2f2f4f0da2e7c0eae79073fe11ca.png
七状态模型

在七状态模型中,需要尤为注意的有:

  • 存储在外存的阻塞挂起进程可以因时间的响应,直接在外存中转换成就绪挂起,因为都是挂起,所以进程依然是在外存上;
  • 当进程刚用完时间片,可以直接从运行态,变成就绪挂起态;
  • 当新的进程刚完成创建过程,可能也会直接进入就绪挂起;

而发生这一切的原因,基本都是因为内存不够用了

低级调度:即进程调度,从就绪队列中取出进程,将其转换成运行态(调度频率最高)

低级调度就是我们最常关注的多进程的管理与切换,即选择合适的算法从就绪队列中选取一个进程,并为其分配CPU等资源;

0ffdf94c50a2339c444734433390b1ad.png

三个层次的调度对比:

afddabf1343ad3677d39f2383ea5c7bc.png

操作系统调度总结

096bf25c6f458f5488a18e4c413644c3.png
【实验目的】 1. 理解进程的概念,熟悉进程的组成; 2. 用高级语言编写和调试一个进程调度程序,以加深对进程调度算法的理解。 【实验准备】 1. 几种进程调度算法  短进程优先调度算法  高优先权优先调度算法  先来先服务调度算法  基于时间片的轮转调度算法 2. 进程的组成  进程控制块(PCB)  程序段  数据段 3. 进程的基本状态  就绪W(Wait)  执行R(Run)  阻塞B(Block) 【实验内容】 1. 例题 设计一个有 N个进程共行的进程调度程序。 进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。 每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。进程的运行时间以时间片为单位进行计算。每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。重复以上过程,直到所要进程都完成为止。 4. 实验题目  编写并调试一个模拟的进程调度程序,采用“最高优先数优先”调度算法对五个进程进行调度。“最高优先数优先”调度算法的基本思想是把CPU分配给就绪队列中优先数最高的进程。静态优先数是在创建进程时确定的,并在整个进程运行期间不再改变。动态优先数是指进程的优先数在创建进程时可以给定一个初始值,并且可以按一定原则修改优先数。例如在进程获得一次CPU后就将其优先数减少1。或者,进程等待的时间超过某一时限时增加其优先数的值,等等。  编写并调试一个模拟的进程调度程序,采用“轮转法”调度算法对五个进程进行调度。轮转法可以是简单轮转法、可变时间片轮转法,或多队列轮转法。简单轮转法的基本思想是:所有就绪进程按 FCFS排成一个队列,总是把处理机分配给队首的进程,各进程占用CPU的时间片相同。如果运行进程用完它的时间片后还为完成,就把它送回到就绪队列的末尾,把处理机重新分配给队首的进程。直至所有的进程运行完毕。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值