【操作系统】进程调度(1):FIFO(先进先出)算法 原理与实践

0 前言

本文基于书籍《Operating System:Three Easy Pieces》。

中译本:《操作系统导论》,中译本质量还可以,但是英文版后来的更新,中文版目前没有进行同步更新(写下此文的时间是2020年10月)

1 前提铺垫

1.1 进程的设定

我们知道,进行进程调度的前提是

  • 硬件和OS的底层,能够支持上下文切换,这里我们假设已经实现
  • 内存中要有就绪态的进程!

我们基于第二点,再做进一步的假设,以简化问题,对于已经进入或者即将进入内存的进程,我们它们假设:

  1. 工作时间相同
  2. 进程同时到达系统
  3. 一旦开始,进程保持运行一直到其完成
  4. 只使用CPU,不使用IO
  5. 运行时间都是已知的

我先来解释一下这几点假设

  • 第2点:意味着有好多个等着被调度进入CPU执行的进程,坐等操作系统“翻牌子”
  • 第3点:意味着进程将会顺序执行,而不是我们所知道的快速切换式执行,先不要产生反对,这将简化一些原理和概念
  • 第4点:意味着进程的指令,没有IO相关的指令,只有使用CPU的指令。
  • 第1、5点:显然这是荒谬的假设,进程运行完成前,不可能预测未来知道它的运行时间,但是这有助于理解概念,我们先认可这样的假设!

1.2 调度指标:周转时间

周转时间 = 任务完成时间 - 任务到达时间

也就是任务到达系统的时间,与任务被执行完的时间之差。这是个性能指标,它反应了任务等待 + 执行的时间。

这里,任务到达系统是什么意思?进入就绪态吗? 暂时是不清楚,待解决
在这里插入图片描述
周转时间为:T1 - T0

2 FIFO原理

FIFO(First In First Out)先进先出,也可以是FCFS(First Come First Serve 先来先服务)

2.1 算法

我们假设有3个进程A、B和C,首先强调,进程只能顺序执行,让我们充分体会一下先进先出算法的原理。

放宽任务同时到达的条件,假设A比B先到一点点,B比C先到一点点,这样,根据FIFO的原理,执行顺序应该是:

  • A先执行
  • A执行完,B再执行
  • B执行完,C再执行

该算法的特点是,先到达的任务,先执行,就像食堂排队一样,先来的人应该先买饭,这看起来很公平,不是吗?

我们具体一点,举个例子,根据前面的假设,我们假定

  • A、B和C的运行时间已知,且差不多
  • 假设三个任务的执行时间都是10s

因为3个进程几乎同时到达,我们假定到达时间 = 0,这样一来,三个进程的周转时间为:

  • A:10s
  • B:20s
  • C:30s

平均周转时间:(10 + 20 + 30)/3 = 10s

在这里插入图片描述

2.2 缺点:护航效应

我们现在将每个任务运行时间差不多的假设放宽,假设:

  • A:100s
  • B:1s
  • C:1s

这样一来,每个进程的周转时间

  • A:100s
  • B:101s
  • C:102s

平均周转时间(100 + 101 + 102)/3 = 101s,哦!这看起来很糟糕
在这里插入图片描述
B和C使用的资源很少,但是却排在重量级的A后面,这就是护航效应,看来FIFO的算法,也并不是看起来那么公平。

这就像,你在超市排队结账,你只买了1包薯片,而你前面的人买了3个购物车的商品……我们需要更优化的算法!之后会提及。

接下来,我们使用模拟程序,来体验一下FIFO算法。

3 FIFO 实践

我们使用一开始提及的书中的模拟软件,来体验一下FIFO算法。

模拟程序链接,注意需要使用Linux / UNIX系统。

我们输入

./scheduler.py -p FIFO -j 5 -s 100 -m 30 -c

然后我们看见显示(你的和我的结果不一样,因为这是随机种子,数值是随机给出,详情需要参考README.md文档)

ARG policy FIFO
ARG jobs 5
ARG maxlen 30
ARG seed 100Here is the job list, with the run time of each job: Job 0 ( length = 5 )Job 1 ( length = 14 )Job 2 ( length = 24 )Job 3 ( length = 22 )Job 4 ( length = 22 )

我们看到,我们使用FIFO算法,生成了5个job,每个job都有对应的运行时间,并且有编号,这里编号其实就代表顺序了,因为是FIFO算法。

我们很容易得到一些性能指标,是的,这非常简单!自己算一算,然后参考一下答案,在刚才的命令后面加上-c就可以。

** Solutions **Execution trace:[ time   0 ] Run job 0 for 5.00 secs ( DONE at 5.00 )[ time   5 ] Run job 1 for 14.00 secs ( DONE at 19.00 )[ time  19 ] Run job 2 for 24.00 secs ( DONE at 43.00 )[ time  43 ] Run job 3 for 22.00 secs ( DONE at 65.00 )[ time  65 ] Run job 4 for 22.00 secs ( DONE at 87.00 )Final statistics:Job   0 -- Response: 0.00  Turnaround 5.00  Wait 0.00Job   1 -- Response: 5.00  Turnaround 19.00  Wait 5.00Job   2 -- Response: 19.00  Turnaround 43.00  Wait 19.00Job   3 -- Response: 43.00  Turnaround 65.00  Wait 43.00Job   4 -- Response: 65.00  Turnaround 87.00  Wait 65.00Average -- Response: 26.40  Turnaround 43.80  Wait 26.40

这里的参考指标有3个,分别是

  • 周转时间:任务完成时间 - 任务到达时间
  • 响应时间:任务第一次被执行时间 - 任务到达时间
  • 等待时间:任务到达后,完成前,没有运行的时间之和

下面我们来体会一下1,1,100100,1,1的差别,这里不再给出过程,直接给答案。

100,1,1

Average -- Response: 67.00  Turnaround 101.00  Wait 67.00

1,1,100

Average -- Response: 1.00  Turnaround 35.00  Wait 1.00

你可以充分体会到,FIFO真的是个有点糟糕的算法……看来先来先服务的方式也不太公平呀,再想一下,如果排在你前面办理银行业务的人,办理时间非常长,你是不是抓狂了?

4 重要思想

  1. 先进先出,先来先服务的队列思想,这点算法与数据结构的队列有异曲同工之妙
  2. 底层机制 + 上层策略思想:底层机制允许进行上下文切换(进程切换),上层策略采用了FIFO算法,从而实现了简单的进程调度

先进先出的算法,非常容易理解,也非常简单,先来的任务就先执行,后来的任务需要等着之前的任务执行完,再执行,依次类推,这与你在食堂排队打饭没什么区别。

5 预告:进程调度(2a):SJF(短任务优先) 算法 原理与实践

既然FIFO会造成护航效应的问题,我们就改善一下,让短的任务先来执行不就好了~~请看下一篇文章:进程调度(2a):SJF(短任务优先) 算法 原理与实践

6 模拟软件资源链接

模拟软件:Linux下使用的python文件,需要阅读README.md知道软件如何使用,读者可以自行完成模拟,后续的进程调度章节都用的此软件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384676.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【操作系统】进程调度(2a):SJF(短任务优先) 算法 原理与实践

0 前言 接上一篇文章:进程调度(1):FIFO(先进先出)算法 原理与实践 1 前提铺垫 请参考上一篇文章的前提铺垫部分,本文与之完全一致。 2 SJF 原理 SJF(Shortest Job First&#x…

【操作系统】进程调度(2b):STCF(最短完成时间优先) 算法 原理与实践

0 前言 接上一篇文章:进程调度(2a):SJF(短任务优先) 算法 原理与实践 1 前提铺垫 与上一篇同。 2 STCF 原理 STCF(Shortest Time-to-Completion First)最短完成时间优先。 2.1…

【操作系统】进程调度(3):RR(轮转) 算法 原理与实践

0 前言 接上一篇文章:进程调度(2b):STCF(最短完成时间优先) 算法 原理与实践 1 前提铺垫 除了与上一篇相同的,这里介绍新的基础知识。 1.1 三种类型的程序 计算密集型(CPU导向&…

【操作系统】进程调度(4):I/O、不可预测的运行时间

0 前言 上一篇文章:进程调度(3):RR(轮转) 算法 原理与实践 1 前提铺垫 与上一篇同。 2 引入I/O操作 之前我们一直提及的是计算密集型程序,现在我们的程序可以进行I/O交互了,它会…

【计算机系统设计】重点 · 学习笔记(0)

HDL等硬件描述语言,例如Verilog,是并行的,而不像软件一样的顺序执行的,例如很多的always块,initial块,都是并行的,他们会转换为硬件电路,而在仿真的时候,他们也是并发执行…

【计算机系统设计】学习笔记(1)03,04

疑问:sw和lw指令,获取的地址不是4的整倍数(字节不对齐)的时候,应该如何处理? 东南大学MOCC 计算机系统综合设计 03 03-1 寄存器 介绍了MIPS寄存器,32个寄存器的基本功能和使用,注…

【期末考试】计算机网络、网络及其计算 考试重点

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 计算机网络及其计算 期末考点 🚀数…

【计算机系统设计】学习笔记(2)

5.1 对于CPU与外界的读写,只有load和store指令能够做,所以很多情况下,直接通过bypass跳过去了,或者闲置,尤其对于流水线,更应该直接跳过而不是闲置(如何设计?)。 另一方面&#xf…

【计算机系统设计】重点 · 学习笔记(1)(资源消耗)

这一点先浅显理解,就好比我要造一个楼 我是用现成的材料造节省?还是需要用XX材料,但是XX材料还需要现成材料造呢? 这也不一定,但是基本来说,如果使用现有资源,能够直接用,那其实是最好不过的…

【计算机系统设计】重点 · 学习笔记(0)(数据通路设计思想)

重点1:05.1 设计思想 设计思想至关重要,这决定了你能不能自己根据ISA设计出来CPU架构,而不是只是抄别人的,也决定你能不能完成自己的设计更优化的架构。 描述方式约定 6 数据通路 ≠ Verilog代码 我们构建的数据通路&#…

【计算机系统设计】实践笔记(1)数据通路构建:取指部件分析

0 核心思想 根据指令功能,分析出需求,从而得出需要的部件、控制信号以及其他设计。 1. 针对的指令 取指阶段,针对所有指令,任何指令都需要进行取指。 2 功能(需求)分析 CPU的内部采用的是字节编址&…

【计算机系统设计】实践笔记(2)数据通路构建:第一类R型指令分析(1)

0 回顾 上一次实践笔记(0)我们实现了一个最简单的,能够每个上升沿4的PC。 我们最需要关注的就是器件功能的独立性,避免内外功能混杂,同时一定要注意脑中有电路(RTL级描述的抽象电路而不是实际的门级电路&…

接口的抽象与实现(概述)

概述 我们先建立一个整体的接口格局观,建立知识地图,了解接口的大概面貌。 整体来说,就这点事儿,4个箭头代表了所有! 三个器件4个箭头 把这几个都想明白,就完事儿了。 第一层(顶层&#xf…

从功能层次,阐述CPU、接口和外设之间的交互

我们从功能抽象层次,阐述一下CPU、接口芯片和外设之间的交互情况: 三个器件4个箭头 我们依次将其描述清楚。 数据 箭头①和③ CPU给接口可以发送数据,然后接口暂存数据,之后再发给外设,这就是数据缓冲。 发送的数…

Vivado工程文件分类

只需要在创建的时候,选择自定义路径即可,最好在原有的new文件夹下新建文件夹。 至于路径的匹配,可以自己试试,在原有默认new下创建文件夹,选中新的文件夹后,内部的Verilog文件可以访问外部new文件夹的文件&…

【微机原理与接口技术】具体芯片(1)并行接口8255A(1):全局观

并行接口8255A 首先,它是传输并行数据的,与CPU一样,然后,它是可编程的,也是多功能的,CPU可以对其进行一些控制。 管脚 先从最宏观层面分类 一部分引脚与外设相连一部分引脚与CPU相连GND和Vcc 注意&…

【算法】【殊途同归】搜索算法之(深度优先 || 广度优先) (约束条件 || 限界函数)

对于所谓的分支限界法和回溯法,我们完全可以更加灵活,请看表格。 深度优先广度优先约束条件限界函数算法策略√√回溯法局部判定√√√分支限界法局部判定√√√加限界的回溯法局部判定√枚举法全局判定√枚举法全局判定 前两种是我们常见的&#xff0c…

【算法】学习笔记(0):算法初探(逻辑抽象 + 示例 + 代码实现)

什么是算法? 人生皆算法,算法的本质,是解决问题的方法,遇到问题,寻找答案,解决问题,是作为一个人,一生都在做的事情。 算法是人类思维的产物,是解决问题的方案,并且&a…

【Verilog】数据流建模传输问题:赋值传输有方向

这次,我们说明的是,assign语句实现的数据流建模,包含的是两个层面 建立联系传输方向 assign A B的本质含义是 A与B建立关联B的值传给A 这个传输方向至关重要,实际情况是什么,就必须按照顺序进行,不是单…