处理机调度算法模拟实验

一、实验目的

本实验模拟在单处理机情况下的处理机调度算法,用某种编程语言实现先来先服务和最短作业优先调度算法的模拟。

二、实验原理

1、先来先服务调度算法原理:
先来先服务调度算法,类似于队列,先进先出,后进后出。

输入进程后依据进程的提交时间进行排序。

1.怎么计算每个作业的运行时间? 运行时间就是作业需要运行的时间。

2.怎么计算每个作业的结束时间?

先维护一个成员变量作为当前时间,

当前时间初始化为第一个作业进入的时间

每进入一个作业,当前时间就加上该作业的 运行时间

每个作业的结束时间就是当前时间。

3.怎么计算周转时间?

周转时间=作业结束时间—作业提交时间。

4.怎么计算平均周转时间?

平均周转时间=周转时间/作业个数。

2、短作业优先调度算法原理为:
在作业调度中,该算法每完成一个作业,就从后续所有到达队列的作业中找到运转时间最短的一个调入内存,分配必要的资源,创建进程并放入就绪队列。SJF是非抢占式的调度算法,优先照顾短作业,具有较好的性能,降低了平均等待时间,提高作业的吞吐量。但另一方面,由于短作业优先,长作业可能超时间处于等待状态,不能用于实时系统。

先输入所有作业的条件,录入到顺序表中

对所有作业按到达时间排序,将到达时间最小的作业调入内存

然后将剩下作业按运转时间升序排序,依次进入内存作业

结束后输出作业时间,平均周转时间

三、实验要求

上机前必须认真的做好准备,了解FCFS和短作业优先调度算法原理;

四、实验内容

1、问题描述

假设有三个作业,他们的作业号、提交时间、需要运行的时间如下:

作业号

提交时间

需要运行的时间

1

0

6

2

2

4

3

3

2

(1)如果使用FCFS调度算法,请问这三个作业的执行顺序是什么样的,并基于此执行顺序计算它们的周转时间、平均周转 时间,计算后将结果填入下表。

三个作业的执行情况分析(FCFS):

作业执行顺序

提交时间

运行时间

开始时间

结束时间

周转

时间

平均周

转时间

1

0

6

0

6

6

7.6

2

2

4

6

10

8

3

3

2

10

12

9

(2)如果使用短作业优先调度算法,请问这三个作业的执行顺序是什么样的,并基于此执行顺序计算它们的周转时间、平均周转时间,计算后将结果填入下表。

三个作业的执行情况分析(SJF):

作业执行顺序

提交时间

运行时间

开始时间

结束时间

周转

时间

平均周

转时间

1

0

6

0

6

6

7

3

3

2

6

8

5

2

2

4

8

12

10

2、代码设计

用某种编程语言模拟FCFS和SJF调度算法,加深对进程调度算法的认识,并将代码复制粘贴在本段下方。要求程序首先由用户输入要运行的作业数,然后选择进程调度算法,并依次输入各个作业的基本信息,包括作业号、提交作业时间、需要运行的时间,代码会分析整个作业调度执行过程,并计算出各个作业的开始执行时间、结束运行时间、周转时间、平均周转时间。

FCFS算法:

Main类:

package fcfs;import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);ArrayList<Work> works = new ArrayList<>(); //储存作业System.out.println("请输入作业个数");int n = sc.nextInt();//把需要进行的作业添加到worksfor (int i = 0; i < n; i++) {System.out.println("请输入作业的编号、提交时间、运行时间");int id = sc.nextInt();int startTime = sc.nextInt();int runTime = sc.nextInt();Work work = new Work(id,startTime,runTime);works.add(work);}LinkSort(works,0,works.size()-1);double time = works.get(0).getStartTime();double turnvoerTimeSum=0;//每个作业的值for (Work work : works) {if(time<work.getStartTime()) time = work.getStartTime();work.setStartRunTime(time);time += work.getRunTime();work.setFinalTime(time);work.setTurnoverTime(time-work.getStartTime());turnvoerTimeSum+=work.getTurnoverTime();}double turnvoerTimeAverage=turnvoerTimeSum/n;System.out.println("编号\t\t\t提交时间\t\t\t开始时间\t\t\t运行时间\t\t\t结束时间\t\t\t周转时间");for (Work work : works) {workOut(work);}System.out.println("平均周转时间为:"+turnvoerTimeAverage);}//根据作业的提交时间进行排序public static void LinkSort(ArrayList<Work> works,int l,int r){if(l>=r) return ;Work x = works.get(l+r>>1);int i = l-1,j = r+1;while(i<j){do i++;while(works.get(i).getStartTime()<x.getStartTime());do j--;while(works.get(j).getStartTime()>x.getStartTime());Collections.swap(works,i,j);}LinkSort(works,l,j);LinkSort(works,j+1,r);}public static void workOut(Work work){System.out.println(work.getId()+"   "+work.getStartTime()+"   "+work.getStartRunTime()+"   "+work.getRunTime()+"   "+work.getFinalTime()+"   "+work.getTurnoverTime());}
}

Work类:

package fcfs;public class Work {private int id;private double startTime;private double startRunTime;public double getStartRunTime() {return startRunTime;}public void setStartRunTime(double startRunTime) {this.startRunTime = startRunTime;}private double runTime;private double finalTime;private double turnoverTime;public double getFinalTime() {return finalTime;}public void setFinalTime(double finalTime) {this.finalTime = finalTime;}public double getTurnoverTime() {return turnoverTime;}public void setTurnoverTime(double turnoverTime) {this.turnoverTime = turnoverTime;}public Work(int id, double startTime, double runTime) {this.id = id;this.startTime = startTime;this.runTime = runTime;}public int getId() {return id;}public void setId(int id) {this.id = id;}public double getStartTime() {return startTime;}public void setStartTime(double startTime) {this.startTime = startTime;}public double getRunTime() {return runTime;}public void setRunTime(double runTime) {this.runTime = runTime;}}

SJF调度算法:

#include <iostream>#include<algorithm>using namespace std;string name;int reachtime;int usetime;double averagewaittime;int alltime = 0;class node{public:int name;//作业名 到达时间 运行时间 开始运行时间 结束运行时间 周转时间 是否运行过int reachtime;int usetime;int starttime;int useendtime;int waittime;bool yn;};node* arr = new node[100];node* brr = new node[100];void push(int x){cout << "请输入作业号 进入时间 作业时间" << endl;for (int i = 0; i < x; i++){cin >> arr[i].name >> arr[i].reachtime >> arr[i].usetime;arr[i].yn = 1;}}bool cmp1(node cs1, node cs2)//重载sort,到达时间 运行时间 作业名{return cs2.reachtime > cs1.usetime;}bool cmp2(node cs1, node cs2){return cs1.usetime < cs2.usetime;}bool cmp3(node cs1, node cs2){return cs1.name < cs2.name;}int main(){int x, xcode, i = 1;cout << "作业总数为:" << endl;cin >> x;xcode = x ;push(x);sort(arr, arr + x, cmp1);arr[0].starttime = arr[0].reachtime;arr[0].useendtime = arr[0].reachtime + arr[0].usetime;arr[0].waittime = arr[0].useendtime - arr[0].reachtime;arr[0].yn = 0;alltime += arr[0].useendtime;sort(arr + 1, arr + x, cmp2);while (xcode-1){if (arr[i].reachtime <= alltime && arr[i].yn == 1){arr[i].starttime = alltime;arr[i].useendtime = arr[i].usetime + alltime;arr[i].waittime = arr[i].useendtime - arr[i].reachtime;alltime = arr[i].useendtime;xcode--;i++;}else if (arr[i].reachtime > alltime && arr[i].yn == 1){alltime = arr[i].reachtime;arr[i].useendtime = arr[i].usetime + alltime;arr[i].waittime = arr[i].usetime;arr[i].starttime = alltime;alltime = arr[i].useendtime;xcode--;i++;}else if (arr[i].yn == 0){i++;}else if (i >= x){i = 1;}}sort(arr, arr + x, cmp3);cout << "以下分别为作业号 提交时间 需要运行的时间 开始运行时间 运行结束时间 周转时间" << endl;for (int cx = 0; cx < x; cx++){cout << arr[cx].name << " " << arr[cx].reachtime << " " << arr[cx].usetime << " " << arr[cx].starttime << " " << arr[cx].useendtime << " " << arr[cx].waittime << endl;averagewaittime += arr[cx].waittime;}averagewaittime = averagewaittime / (double)x;cout << "平均周转时间为:" << averagewaittime << endl;return 0;}

3、实验验证

用编写好的代码验证实验内容1中作业的执行情况,看代码运行结果是否与之前的分析计算结果一致,并将执行界面进行截图。

(1)FSFC调度算法

(2)SJF调度算法

五、实验中遇到的问题及解决方法,以及对作业的自我评价和反思。

FCFS 先来先服务:优点:公平、算法实现简单; 缺点:排在长作业(进程)后面的短作业需要等待很长时间,带权周转时间很大,对短作业来说用户体验不好。即,FCFS算法对长作业有利,对短作业不利

SJF 短作业优先 :优点:“最短的”平均等待时间、平均周转时间。缺点:不公平。对短作业有利,对长作业不利。可能产生饥饿现象。另外,作业/进程的运行时间是由用户提供的,并不一定真实,不一定能做到真正的短作业优先。如果源源不断地有短作业/进程到来,可能使长作业/进程长时间得不到服务,产生“饥饿”现象。如果一直得不到服务,则称为“饿死”

通过这次实验,加深了我对于不同种处理机调度算法的理解,包括不同算法的原理,特点,优缺点等。通过实际的测试用例,让我们对不同调度算法的工作流程和规则更加熟悉。同时,也提升了自己的编程能力,受益匪浅。

处理机调度算法模拟实验——FCFS算法,SJF调度算法相关推荐

  1. c语言实现FCFS SJF算法,实现FCFS和SJF调度算法.docx

    操作系统实验报告 实验一:作业调度 学院: 软件学院 专业: 软件工程 班级: 软件工程12-01 姓名: *** 学号:541213460157 实验一:作业调度 实现FCFS和SJF调度算法 [实 ...

  2. 实现FCFS和SJF调度算法(电梯调度算法详解)

    实现FCFS和SJF调度算法 操作系统实验报告 实验一:作业调度 学院:软件学院 专业:软件工程 班级:软件工程12-01 姓名:*** 学号:541213460157 实验一:作业调度 实现FCFS ...

  3. 关于c语言排序计时器完整程序,先来先服务调度算法模拟实验程序源代码(C语言)...

    先来先服务调度算法模拟实验程序源代码(C语言) 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水 ...

  4. CPU调度算法——FCFS算法/SJF算法/优先级调度算法/RR算法

    文章目录 一.先来先服务(FCFS)调度算法 二.最短作业优先(SJF)算法 1. 非抢占式SJF 2. 抢占式SJF 三.优先级调度算法 1. 非抢占式优先级调度算法 2. 抢占式优先级调度算法 四 ...

  5. 操作系统实验二(调度算法模拟-先进先出-时间片轮转法-优先服务调度算法)

    实验二 进程调度 一.     实验目的 1.       理解进程运行的并发性. 2.       理解处理器的三级调度. 3.       掌握先来先服务的进程调度算法. 4.       掌握短 ...

  6. FCFS和SJF算法

    ```cpp #include <iomanip> #include <iostream> using namespace std; static const int N=10 ...

  7. Java模拟操作系统实验一:四种进程调度算法实现(FCFS,SJF,RR,HRN)

    前言 刚学完操作系统,模拟实现了其中一些经典的算法,内容比较多,打算写一个系列的总结,将自己的源码都分享出来,既方便自己以后复习,也希望能帮助到一些刚入坑的小伙伴.我的所有代码的运行环境都是基于Ecl ...

  8. 一、操作系统——处理机(作业)调度算法:先来先服务算法FCFS、最短作业优先算法SJF(非抢占式)、 最短剩余时间优先算法SRTN(抢占式)、最高响应比优先算法HRRN

    各种调度算法的学习思路: 调度算法的评价指标: 一.先来先服务算法(FCFS):First Come First Serve 二.最短作业优先算法(SJF非抢占式):Shortest Job Firs ...

  9. FCFS、SJF、HRRN调度算法以及时间片轮转、优先级调度算法、多级反馈队列算法总结

    先来先服务(FCFS) 算法思想 主要从"公平"角度考虑 算法规则 按照作业/进程到达的先后顺序进行服务 用于作业/进程调度? 用于作业调度时,考虑哪个作业先到达后备队列: 用于进 ...

最新文章

  1. Facebook AI研究员田渊栋的2021年终总结:多读历史!
  2. Ruby的.nil? .empty? .blank? .present?区别
  3. 如何使自己的程序只运行一次
  4. 认识进程 java 1615387415
  5. 【OpenCV图像处理】一、图像相加、相减、相乘与相除的实现【转载】
  6. ie6识别important问题
  7. Java:使用 Java 开发的一个异常处理框架
  8. Unity播放序列帧,功能丰富
  9. java学习心得---循环结构
  10. “属你最牛” | 树莓派百变打印机
  11. 使用layUI弹出输入框并收集输入框信息
  12. 双缓冲技术解决java游戏图片闪现问题
  13. ARM Linux ELF加壳方案
  14. 无线路由器使用交换机模式上网不稳定
  15. Python将经纬度数据转换成浮点数据
  16. iceberg-flink 十:flink 窗口,事件时间,处理时间。
  17. Environment Modules安装和使用教程
  18. 松鼠Ai辅助公校教育,开启智慧教育3.0
  19. 计算机研究生报录比高的学校,报录比最高专业TOP10!就离谱!
  20. head 10字节_优秀了!10万系谱,计算近交系数,不到1秒!

热门文章

  1. 【Golang开发面经】米哈游(一轮游)
  2. c++: 31:开关灯
  3. 智能手环功能模块设计_智能养老手环设计方案
  4. Pygame学习笔记13:Dungeon角色扮演游戏
  5. 《学习opencv》笔记——矩阵和图像操作——cvMax,cvMaxS,cvMerge,cvMin and cvMinS
  6. 安装wincc flexible等西门子软件时出现“Please restart Windows before installing new programs“
  7. 机器学习建模中的Bagging思想!
  8. 第四代V850微控制器系列(瑞萨电子)
  9. 【Cadence17.2】Capture CIS封装设置、DRC、BOM单生成和网表生成
  10. AutoCAD 出现“安全系统(软件锁许可管理器)不起作用或未正确安装”的解决方法...