FCFS,SJF,HRN
1、编写并调试一个单道处理系统的作业等待模拟程序。
作业等待算法:分别采用先来先服务(FCFS),最短作业优先(SJF)、响应比高者优先(HRN)的调度算法。
对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间,以比较各种算法的优缺点。
输入样例:
作业名 提交时间 运行时间
1 5 2
2 2 5
3 2 4
FCFS:
按照提交时间排序:2,3,1
作业2 开始时间 2
运行时间 5
完成时间 7
周转时间 7 - 2 = 5
带权周转时间 5 / 5 = 1
作业 3 开始时间 7
运行时间 4
完成时间 11
周转时间 11 - 2 = 9
带权周转时间 9 / 4 = 2.25
作业 1 开始时间 11
运行时间 2
完成时间 13
周转时间 13 - 5 = 8
带权周转时间 8 / 2 = 4
SJF:
按照运行时间从短到长排序:1,3,2
作业 1 开始时间 5
运行时间 2
完成时间 7
周转时间 7 - 5 = 2
带权周转时间 2 / 2 = 1
作业3 开始时间 7
运行时间 4
完成时间 11
周转时间 11 - 2 = 9
带权周转时间 9 / 4 = 2.25
作业 2 开始时间 11
运行时间 5
完成时间 16
周转时间 16 - 2 = 14
带权周转时间 14 / 5 = 2.8
HRN:
作业1 等待时间 5 - 5 = 0 优先权 0 / 2 + 1 = 1
作业2 等待时间 5 - 2 = 3 优先权 3 / 5 + 1 = 1.6
作业3 等待时间 5 - 2 = 3 优先权 3 / 4 + 1 = 1.75
按照优先权排序:3,2,1
作业 3 开始时间 2
运行时间 4
完成时间 6
周转时间 6 - 2 = 4
带权周转时间 4 / 4 = 1
作业 2 开始时间 6
运行时间 5
完成时间 11
周转时间 11 - 2 = 9
带权周转时间 11 / 5 = 1.8
作业1 开始时间 11
运行时间 2
完成时间 13
周转时间 13 - 5 = 8
带权周转时间 8 / 2 = 4
#include <iostream>
#include <cmath>
using namespace std; struct Box
{
string ID; //作业号
double begin_time; //提交时间
double turnaround_time; //周转时间
double service_time; //要求服务时间
double finish_time; //完成时间
double Wturnaround_time; //带权周转时间
double wait_time; //等待时间
double rate; //优先权
Box& operator = (const Box& p2) //重载 = 运算符,方便排序
{
this->begin_time = p2.begin_time;
this->finish_time = p2.finish_time;
this->service_time = p2.service_time;
this->ID = p2.ID;
this->turnaround_time = p2.turnaround_time;
this->Wturnaround_time = p2.Wturnaround_time;
this->wait_time = p2.wait_time;
this->rate = p2.rate;
return *this;
}
}; typedef struct
{
Box data[]; } JCB; JCB jcb;
int n; void init() //初始化作业块
{
cout<<"please input the number of the process:";
cin>>n;
for(int i = ; i<n; i++)
{
cout<<"process ID:";
cin>>jcb.data[i].ID;
cout<<jcb.data[i].ID<<"'s begin time:";
cin>>jcb.data[i].begin_time;
cout<<jcb.data[i].ID<<"'s service time:";
cin>>jcb.data[i].service_time;
}
for(int i = ; i<n-; i++) //按照提交时间从前到后排序,小的在前
{
for(int j = i+; j<n; j++)
{
if(jcb.data[i].begin_time > jcb.data[j].begin_time)
swap(jcb.data[i],jcb.data[j]);
}
}
for(int i = ; i<n-; i++) //提交时间一样,序号小的排前面
{
for(int j = i+; j<n; j++)
{
if(jcb.data[i].begin_time == jcb.data[j].begin_time && jcb.data[i].ID > jcb.data[j].ID)
swap(jcb.data[i],jcb.data[j]);
}
}
} void FCFS() //先来先服务
{
double bt = jcb.data[].begin_time;
double gtt = ;
double gwtt = ;
double real_begin;
cout<<"ID "<<"real begin time "<<"begin time "<<"turnaround time "<<"finish time "<<"wighted turnaround time"<<endl;
for(int i = ; i<n; i++)
{
real_begin = bt; //真实开始时间
jcb.data[i].finish_time = real_begin + jcb.data[i].service_time; //完成时间 = 开始时间 + 服务时间
jcb.data[i].turnaround_time = jcb.data[i].finish_time - jcb.data[i].begin_time; //周转时间 = 完成时间 - 提交时间
jcb.data[i].Wturnaround_time = jcb.data[i].turnaround_time/jcb.data[i].service_time; //带权周转时间 = 周转时间/服务时间
cout<<jcb.data[i].ID<<" "<<real_begin<<" "<<jcb.data[i].begin_time
<<" "<<jcb.data[i].turnaround_time<<" "<<jcb.data[i].finish_time
<<" "<<jcb.data[i].Wturnaround_time<<endl;
bt = jcb.data[i].finish_time; //下一个作业的开始时间
gtt += jcb.data[i].turnaround_time; //总周转时间
gwtt += jcb.data[i].Wturnaround_time; //总带权周转时间
}
cout<<"group's turnaround time :"<<gtt/n<<endl;
cout<<"group's wighted turnaround time :"<<gwtt/n<<endl;
} void SJF() //短作业优先
{
double bt = ;
double gtt = ;
double gwtt = ;
double real_begin;
cout<<"ID "<<"real begin time "<<"begin time "<<"turnaround time "<<"finish time "<<"wighted turnaround time"<<endl;
for(int i = ; i<n-; i++) //按照服务时间从小到大排序
for(int j = i; j<n; j++)
if(jcb.data[i].service_time > jcb.data[j].service_time)
swap(jcb.data[i],jcb.data[j]);
for(int i = ; i<n-; i++)
{
for(int j = i+; j<n; j++)
{
if(jcb.data[i].service_time == jcb.data[j].service_time && jcb.data[i].ID > jcb.data[j].ID)
swap(jcb.data[i],jcb.data[j]);
}
}
bt = jcb.data[].begin_time;
for(int i = ; i<n; i++)
{
real_begin = bt;
jcb.data[i].finish_time = real_begin + jcb.data[i].service_time;
jcb.data[i].turnaround_time = jcb.data[i].finish_time - jcb.data[i].begin_time;
jcb.data[i].Wturnaround_time = jcb.data[i].turnaround_time/jcb.data[i].service_time;
cout<<jcb.data[i].ID<<" "<<real_begin<<" "<<jcb.data[i].begin_time
<<" "<<jcb.data[i].turnaround_time<<" "<<jcb.data[i].finish_time
<<" "<<jcb.data[i].Wturnaround_time<<endl;
bt = jcb.data[i].finish_time;
gtt += jcb.data[i].turnaround_time;
gwtt += jcb.data[i].Wturnaround_time;
}
cout<<"group's turnaround time :"<<gtt/n<<endl;
cout<<"group's wighted turnaround time :"<<gwtt/n<<endl;
} void HRN() //高响应比优先
{
double bt = ;
double gtt = ;
double gwtt = ;
double real_begin;
cout<<"ID "<<"real begin time "<<"begin time "<<"turnaround time "<<"finish time "<<"wighted turnaround time"<<endl;
for(int i = ; i<n; i++)
{
jcb.data[i].wait_time = jcb.data[n-].begin_time - jcb.data[i].begin_time; //等待时间 = 作业最后提交时间 - 提交时间
jcb.data[i].rate = jcb.data[i].wait_time/jcb.data[i].service_time+; //高响应比 = 等待时间 / 服务时间 + 1
}
for(int i = ; i<n-; i++)
for(int j = i; j<n; j++)
if(jcb.data[i].rate < jcb.data[j].rate)
swap(jcb.data[i],jcb.data[j]);
bt = jcb.data[].begin_time;
for(int i = ; i<n; i++)
{
real_begin = bt;
jcb.data[i].finish_time = real_begin + jcb.data[i].service_time;
jcb.data[i].turnaround_time = jcb.data[i].finish_time - jcb.data[i].begin_time;
jcb.data[i].Wturnaround_time = jcb.data[i].turnaround_time/jcb.data[i].service_time;
cout<<jcb.data[i].ID<<" "<<real_begin<<" "<<jcb.data[i].begin_time
<<" "<<jcb.data[i].turnaround_time<<" "<<jcb.data[i].finish_time
<<" "<<jcb.data[i].Wturnaround_time<<endl;
bt = jcb.data[i].finish_time;
gtt += jcb.data[i].turnaround_time;
gwtt += jcb.data[i].Wturnaround_time;
}
cout<<"group's turnaround time :"<<gtt/n<<endl;
cout<<"group's wighted turnaround time :"<<gwtt/n<<endl;
} int main()
{
int k = ;
while()
{
cout<<"*****************************"<<endl;
cout<<" 1.FCFS"<<endl<<" 2.SJF"<<endl<<" 3.HRN"<<endl;
cout<<"*****************************"<<endl;
cout<<"please choose:";
cin>>k;
init();
switch(k)
{
case :
FCFS();
break;
case :
SJF();
break;
case :
HRN();
break;
default:
break;
}
}
return ;
}
FCFS,SJF,HRN的更多相关文章
- C语言模拟实现先来先服务(FCFS)和短作业优先(SJF)调度算法
说明 该并非实现真正的处理机调度,只是通过算法模拟这两种调度算法的过程. 运行过程如下: 输入进程个数 输入各个进程的到达事件 输入各个进程的要求服务事件 选择一种调度算法 程序给出调度结果:各进程的 ...
- 0422 Step2-FCFS调度
一.目的和要求 1. 实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 2.实验要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调度程序.作业一投入运行, ...
- 0421 实验二Step2-FCFS调度
一.目的和要求 1. 实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 2.实验要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调度程序.作业一投入运行, ...
- C语言程序代写(Linux下线程)
联系QQ:928900200 CSCI 3120 Operating Systems Summer 2014 Handout 3Assignment 2Date Due: June 5, 2014 b ...
- 菜鸟的飞翔日记-os篇
一轮王道os复习感想 1概述 虽然去年有上操作系统这门必修课,考的成绩也算理想,本来还有点沾沾自喜,嗯,觉得自己学的还不错,知道有一天我拿起了王道,(没给王道打广告)看王道的原因完全在于为考研做准备, ...
- OS作业模拟SJF和FCFS
一个OS的作业, 用于模拟短作业优先 和 先来先服务两种作业调度方式. #!/usr/bin/python3.5 ## Modify the SJF and FCFS algorithm in the ...
- 调度算法FCFS、SJF和优先权调度的介绍和例题
调度算法 一.先来先服务FCFS (First Come First Serve) 1.思想: 选择最先进入后备/就绪队列的作业/进程,入主存/分配CPU 2.优缺点 优点:对所有作业/进程公平,算法 ...
- 《操作系统_FCFS和SJF》
先来先服务FCFS和短作业优先SJF进程调度 转自:https://blog.csdn.net/qq_34374664/article/details/73231072 一.概念介绍和案例解析 FCF ...
- OS实验报告--FCFS算法
实验二.作业调度模拟实验 专业:商业软件工程 姓名:王泽锴 学号:201406114113 一.实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 二.实验内容和要求 (1)实验 ...
随机推荐
- Java内存模型学习笔记(一)—— 基础
1.并发编程模型的分类 在并发编程中,我们需要处理两个关键的问题:1.线程间如何通信,2.线程间如何同步.通信是指线程之间以何种机制来交换信息,同步是指程序用于不同线程之间操作发生相对顺序的机制. 在 ...
- JavaDoc工具和Ideade javadoc工具
命令参考: javadoc -locale zh_CN -protected -notree -nonavbar -noindex -use -author -version -encoding UT ...
- RabbitMQ 应用一
(百度百科)MQ全称为Message Queue,消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们.消息传递指的 ...
- html中标签的英文含义!
html中的标签缩写的英文是什么? 标签 英文全称 含义 ul unordered lists 无序列表 li list item 列表项目 ol ordered lists 有序列表 dl d ...
- 通透理解viewport
摘自:https://blog.csdn.net/u014787301/article/details/44466697 在移动设备上进行网页的重构或开发,首先得搞明白的就是移动设备上的viewpor ...
- HTML中的标题<h1>标签的用法!
在HTML中,<h1>标签是命名标题的元素,并且在网页中起到了很重要的作用,但是不要只是因为想要弄成黑粗字体就使用<h1>标题标签这样不好.如果说你还想要做完网站后需要进一步做 ...
- Java 之 注解
一.注解介绍 注解概念:注解是说明程序的,给计算机看的. 注释概念:用文字描述程序的,给程序员看的. 注解定义:注解(Annotation),也叫元数据.一种代码级别的说明.它是 JDK1.5 及以后 ...
- Flutter——Drawer、DrawerHeader、UserAccountsDrawerHeader组件(侧边栏组件)
在 Scaffold 组件里面传入 drawer 参数可以定义左侧边栏,传入 endDrawer 可以定义右侧边栏.侧边栏默认是隐藏的,我们可以通过手指滑动显示侧边栏,也可以通过点击按钮显示侧边栏. ...
- python 中 ModuleNotFoundError: No module named 'Crypto' 错误处理
今天在微信小程序服务端集成了微信的登录解密模块 WXBizDataCrypt,集成后运行程序时出现了下面的错误 (.venv) [1lin24@1lin24]# python manager_dev. ...
- Python if __name__ == "__main__" 的含义
一.概念 我们在Python中经常可以看到一个程序会有if __name__ == "__main__",同时这通常是写在程序的入口位置,那么他有什么特殊含义呢?在了解这个之前,我 ...