【操作系统】进程调度(1):FIFO(先进先出)算法 原理与实践
0 前言
本文基于书籍《Operating System:Three Easy Pieces》。
中译本:《操作系统导论》,中译本质量还可以,但是英文版后来的更新,中文版目前没有进行同步更新(写下此文的时间是2020年10月)
1 前提铺垫
1.1 进程的设定
我们知道,进行进程调度的前提是
- 硬件和OS的底层,能够支持上下文切换,这里我们假设已经实现
- 内存中要有就绪态的进程!
我们基于第二点,再做进一步的假设,以简化问题,对于已经进入或者即将进入内存的进程,我们它们假设:
- 工作时间相同
- 进程同时到达系统
- 一旦开始,进程保持运行一直到其完成
- 只使用CPU,不使用IO
- 运行时间都是已知的
我先来解释一下这几点假设
- 第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,100和100,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 重要思想
- 先进先出,先来先服务的队列思想,这点算法与数据结构的队列有异曲同工之妙
- 底层机制 + 上层策略思想:底层机制允许进行上下文切换(进程切换),上层策略采用了FIFO算法,从而实现了简单的进程调度。
先进先出的算法,非常容易理解,也非常简单,先来的任务就先执行,后来的任务需要等着之前的任务执行完,再执行,依次类推,这与你在食堂排队打饭没什么区别。
5 预告:进程调度(2a):SJF(短任务优先) 算法 原理与实践
既然FIFO会造成护航效应的问题,我们就改善一下,让短的任务先来执行不就好了~~请看下一篇文章:进程调度(2a):SJF(短任务优先) 算法 原理与实践
6 模拟软件资源链接
模拟软件:Linux下使用的python文件,需要阅读README.md知道软件如何使用,读者可以自行完成模拟,后续的进程调度章节都用的此软件。
【操作系统】进程调度(1):FIFO(先进先出)算法 原理与实践相关推荐
- 【操作系统】进程调度(2a):SJF(短任务优先) 算法 原理与实践
0 前言 接上一篇文章:进程调度(1):FIFO(先进先出)算法 原理与实践 1 前提铺垫 请参考上一篇文章的前提铺垫部分,本文与之完全一致. 2 SJF 原理 SJF(Shortest Job Fi ...
- 【操作系统】进程调度(3):RR(轮转) 算法 原理与实践
0 前言 接上一篇文章:进程调度(2b):STCF(最短完成时间优先) 算法 原理与实践 1 前提铺垫 除了与上一篇相同的,这里介绍新的基础知识. 1.1 三种类型的程序 计算密集型(CPU导向) 输 ...
- 【操作系统】进程调度(2b):STCF(最短完成时间优先) 算法 原理与实践
0 前言 接上一篇文章:进程调度(2a):SJF(短任务优先) 算法 原理与实践 1 前提铺垫 与上一篇同. 2 STCF 原理 STCF(Shortest Time-to-Completion Fi ...
- kmeans算法原理以及实践操作
原文:http://www.cnblogs.com/dudumiaomiao/p/5839905.html kmeans算法原理以及实践操作(多种k值确定以及如何选取初始点方法) kmeans一般在数 ...
- LSA/LSI算法原理和实践
本篇文章主要转载自LSI/LSA算法原理与实践Demo 目录: 1.使用场景 2.优缺点 3.算法原理 3.1.传统向量空间模型的缺陷 3.2.Latent Semantic Analysis (La ...
- Apollo星火计划学习笔记——Apollo开放空间规划算法原理与实践
文章目录 前言 1. 开放空间规划算法总体介绍 1.1 Task: OPEN_SPACE_ROI_DECIDER 1.2 Task: OPEN_SPACE_TRAJECTORY_PROVIDER 1. ...
- 特征值 与特征向量(机器学习算法原理与实践)
取至:机器学习算法原理与编程实践(郑捷) # -*- coding: utf-8 -*- # Filename : matrix05.py import operator from numpy imp ...
- LSI/LSA算法原理与实践Demo
目录: 1.使用场景 2.优缺点 3.算法原理 3.1.传统向量空间模型的缺陷 3.2.Latent Semantic Analysis (Latent Semantic Indexing) 3.3. ...
- 【NLP基础】NLP关键字提取技术之LDA算法原理与实践
点击上方,选择星标或置顶,每天给你送干货! 阅读大概需要11分钟 跟随小博主,每天进步一丢丢 引文 人们是如何从大量文本资料中便捷得浏览和获取信息?答案你肯定会说通过关键字.仔细想想,我们人类是怎么提 ...
最新文章
- 第二十二部分_Hibernate检索策略、拦截器、事务隔离级别
- 小孩孩子应用题计算机错误,孩子应用题失分的主要原因是什么?家长来看看
- python读取文件with open_python 文件读写操作open和with的用法
- 控件属性、事件持久化(转)
- Activity四种加载模式
- MongoDB基本管理命令
- java 1000以内的完数
- Reading SBAR SDN flow-Based monitoring and Application Recognition
- maven 引入外部jar包的几种方式
- DFS建立准备之基于windows 2008 R2的第二台域控建立
- (转)超全面设计指南:如何做大屏数据可视化设计?
- ios学习8_KVC和字典转模型
- 处理Clob数据(转)关于oracle中大对象处理的一些方法和实例
- 本科计算机技术与应用知识点,《软件工程》经典考试例题题,重点的知识点(含答案)...
- [UVA 10529]Dumb Bones
- arcgis中给属性文件加x y坐标
- 期末复习—计算机组成原理—计算机的分类
- 华为交换机DHCP Server释放IP
- win10系统电脑提示此程序被组策略阻止的解决办法
- 基于Kinect深度图像和SLAM二维地图创建