一、实验目的:

目的:了解并掌握作业调度的功能,熟悉并掌握各种作业调度算法。
任务:模拟实现先来先服务或者短作业优先调度算法。

二、实验内容:

模拟实现SJF调度。
设置作业体:作业名,作业的到达时间,服务时间,作业状态(W——等待,R——运行,F——完成),作业间的链接指针;
作业初始化:由用户输入作业名、服务时间、到达时间进行初始化,同时,初始化作业的状态为W。
显示函数:在作业调度前、调度中和调度后进行显示。
排序函数:对等待状态的作业按照调度算法排序(不同的调度算法排序方式不同),注意考虑到达时间。
调度函数:每次从等待队列队首调度已到达的适合的作业执行,状态变化。当服务结束时,状态变为F。
删除函数:撤销状态为F的作业。
实验要求
(1)测试数据可以随即输入或从文件中读入;
(2)必须要考虑到作业的到达时间;
(3)最终能够计算每一个作业的周转时间、带权周转时间。

三、实验代码:

#include<iostream>
#include<iomanip>
#include<algorithm>using namespace std;
const int MAX = 1e5;#define W "waitting"
#define R "running"
#define F "finished"typedef struct WORK
{string work_name; // 作业名int serve_time; // 服务时间int arrive_time; // 到达时间int start_time;//开始时间int finish_time; // 完成时间string work_state; // 作业状态int turnover_time; // 周转时间
}WORK;WORK work[MAX]; // 作业
int n; // 作业数量bool cmp_SJF(WORK x, WORK y) // 排序函数
{if (x.serve_time != y.serve_time) // 服务时间不同时,较短的优先return x.serve_time < y.serve_time;else // 服务时间相同时,先到达的优先return x.arrive_time < y.arrive_time;
}bool cmp_arr_time(WORK x, WORK y) // 按到达时间从小到大排序
{return x.arrive_time < y.arrive_time;
}int init()
{cout << "请输入要调度的作业:" << endl;cout << "要调度的作业的数量:";cin >> n;for (int i = 1; i <= n; i++){cout << "作业名: ";cin >> work[i].work_name;cout << "作业到达时间: ";cin >> work[i].arrive_time;cout << "作业服务时间: ";cin >> work[i].serve_time;work[i].work_state = W;work[i].finish_time = -1;}system("cls");return n;}void show(WORK work[],int n)
{cout << "                                          作业状态" << endl;cout << "-----------------------------------------------------------------------------------------------"<< endl;cout << "    作业名    " << "    到达时间    "<< "   服务时间    " << "    开始时间    "<<"    完成时间     "<<"     当前状态    " << endl;for (int i = 1; i <= n; i++){cout << setw(8) << work[i].work_name << setw(16)<< work[i].arrive_time<< setw(15) << work[i].serve_time<<setw(15)<<work[i].start_time<< setw(18)<<work[i].finish_time<< setw(20) << work[i].work_state << endl;}cout << endl;
}void deal(WORK work[],int n)
{for (int i = 1; i <= n; i++){if (i == 1){work[i].start_time = work[i].arrive_time;work[i].finish_time = work[i].arrive_time + work[i].serve_time;}else{work[i].start_time = work[i-1].finish_time;work[i].finish_time = work[i - 1].finish_time + work[i].serve_time;}}for (int i = 1; i <= n; i++){work[i].turnover_time = work[i].finish_time - work[i].arrive_time;cout << work[i].work_name << ":";cout << "周转时间:" << work[i].turnover_time;cout << "   带权周转时间:" << work[i].turnover_time / work[i] .serve_time<< endl;}}void sjfDispatch(WORK work[], int n)
{sort(work + 1, work + 1 + n, cmp_arr_time); show(work,n);for (int i = 1; i <=n; i++){show(work, n);//执行调度程序....work[i].work_state = R;//调度队列中的第一个作业cout << "作业" << work[i].work_name << "调度中:" << endl;show(work, n);if (i == 1){work[i].start_time = work[i].arrive_time;work[i].finish_time = work[i].arrive_time + work[i].serve_time;}else{work[i].start_time = work[i - 1].finish_time;work[i].finish_time = work[i - 1].finish_time + work[i].serve_time;}//该部分用来计算各个作业的完成时间if (i != n){int workcount = 0;for (int j = i + 1; j <= n; j++){if (work[j].arrive_time <= work[i].finish_time){workcount++;}}sort(work + 1 + i, work + 1 + i + workcount, cmp_SJF);//对等待队列中的作业按SJF算法进行排序,一共有workcount个}work[i].work_state = F; //撤销正在调度的作业cout << "作业" << work[i].work_name << "调度后:" << endl;show(work, n); }   deal(work, n);}int main()
{   int n=init();sjfDispatch(work, n);return 0;
}

四、实验结果:

数据样本

输入数据:





作业执行顺序及周转时间和带权周转时间与预期结果相符。

五、实验总结:

通过本次短作业优先调度算法实验我实际认识到了系统在执行作业调度的具体过程,对SJF短作业优先调度算法有了更加深入的认识,SJF的基本思想是以作业的长度来计算优先级,作业越短,其优先级越高。作业的长短是以作业所要求的运行时间来衡量的。
代码的主体思路主要是三步:1.找出最先到达的作业(该作业的完成时间=到达时间+服务时间);2.根据上一作业的完成时间,找到在这个完成时间内所有到达的作业,并找到这些作业中服务时间最短的那个,然后计算它的完成时间(该作业的完成时间=上一作业的完成时间+该作业服务时间);3.重复步骤2直至完成所有作业的计算。
由于我采用的编程语言是C++,因此对于排序算法的处理可以简单地调用STL中的sort函数,这使得编码得到了进一步的简便。但要注意第三个形参cmp函数,该函数是该SJF算法的关键。

操作系统第一次实验-短作业优先调度算法相关推荐

  1. 短作业优先算法c语言实现,OS短作业优先调度算法C语言

    OS短作业优先调度算法C语言 采用短作业优先调度算法调度程序 学 号: 姓 名: 专 业: 指导老师: 日 期: 目录 一.实验题目3 二.课程设计的目的3 三.设计内容3 四.设计要求3 五.主要数 ...

  2. 软件测试——进程调度(短作业优先调度算法+先来先服务算法)测试

    源代码 被测代码 Schedule package net.mooctest;import java.util.ArrayList; import java.util.List;public clas ...

  3. 设有 4道作业,它们的提交时间及执行时间如下,试计算在单道程序环境下,采用先来先服务调度算法和短作业优先调度算法时的平均周转时间和平均带权周转时间,并指出它们的调度顺序。

    处理机调度算法 题目: 设有 4道作业,它们的提交时间及执行时间如下: 试计算在单道程序环境下,采用先来先服务调度算法和短作业优先调度算法时的平均周转时间和平均带权周转时间,并指出它们的调度顺序. 先 ...

  4. C#进程调度的模拟实现:模拟先来先服务调度算法、短作业优先调度算法和优先级调度算法(考虑非抢占式和抢占式),进行算法评价,输出调度结果和算法评价指标。

    没什么水平,希望能帮到你 环境:visual studio 2019 附带工程资源:C#进程调度的模拟实现附带资源-C#文档类资源-CSDN下载 先来先服务的调度算法:是一种非抢占式的算法,先来先服务 ...

  5. 先来先服务和短作业优先调度算法

    先来先服务调度算法:系统按照作业到达的先后次序来进行调度,或者说它优先考虑在系统中等待时间最长的作业,而不管该作业所需执行时间的长短,从后备作业队列中选择几个最先进入该队列的作业,将它们调入内存,为它 ...

  6. 操作系统:先来先服务调度算法以及短作业优先调度算法C语言实现

    FCFS(先来先服务)和SJF(短作业优先)调度算法 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度.当在作业调度中采用该算法时,每次调度都是从后备作业 ...

  7. 先来先服务和短作业优先调度算法-C语言实现

    算法介绍 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度.当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将 ...

  8. 进程调度算法-短作业优先调度算法(SJF)

    基本思想 SJF算法是以作业的长度来计算优先级,作业越短,其优先级越高.作业的长短是作业所要求的运行时间来衡量的. 算法性能评价 面向用户 周转时间 从作业被提交给系统开始,到作业完成为止的这段时间间 ...

  9. 操作系统短作业优先(SJF)调度算法

    一,算法代码 #include<stdio.h>struct sjf { //定义进程的结构体 char name[10];//进程名 float arrivetime;//到达时间 fl ...

最新文章

  1. 【linux】用过的shell命令
  2. JavaWeb显示器
  3. sgi stl 之list
  4. 64位有符号与无符号类型的整数
  5. node --- 连接mysql(docker环境) Sequelize库
  6. Codeforces Round #667 (Div. 3)
  7. 《软件工程实践》第三次作业-原型设计(结对第一次)
  8. hiveserver2的高可用HA
  9. 0e php若类型,0e开头MD5 python生成脚本 PHP哈希弱类型比较缺陷
  10. (转)JAVA实现Windows拨号、IP切换
  11. 记录 Kindle Fire HDX 7 安装 Google Play 服务过程
  12. 基于S7-200 PLC控制的小型自动化立体仓
  13. idea清除本地注册信息
  14. 发射功率dBm 换算表
  15. 学计算机为什么伤眼,电脑族用眼过度最伤眼!专家教你如何缓解视疲劳
  16. Animation.css动画效果属性
  17. 《紫川》之远东战火 第八卷
  18. C Primer Plus 第二章 复习题编程练习 答案
  19. 世界有几个终端服务器,全球互联网终端服务器共13根,美国占据10根,美真可以关闭中国网络?...
  20. 用理想低通滤波器在频率域实现低通滤波、高通滤波。

热门文章

  1. 双向绑定 当obj的值修改时_JavaScript进阶之深入理解数据双向绑定
  2. qq好友克隆-转好友
  3. 邮件客户端用IMAP还是POP3,为什么?Thunderbird 雷鸟和免费腾讯企业邮箱
  4. 准备斑马网络一面(1)
  5. 微信发送的视频有限制
  6. IDA分析-熊猫烧香
  7. 优秀课件笔记之POWERPOINT 演示文稿
  8. 丰巢牵手速递易,末端派送领域迎来大变革
  9. Bootstrap学习总结
  10. STM32F103C8T6的flash读写