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的更多相关文章

  1. C语言模拟实现先来先服务(FCFS)和短作业优先(SJF)调度算法

    说明 该并非实现真正的处理机调度,只是通过算法模拟这两种调度算法的过程. 运行过程如下: 输入进程个数 输入各个进程的到达事件 输入各个进程的要求服务事件 选择一种调度算法 程序给出调度结果:各进程的 ...

  2. 0422 Step2-FCFS调度

    一.目的和要求 1. 实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 2.实验要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调度程序.作业一投入运行, ...

  3. 0421 实验二Step2-FCFS调度

    一.目的和要求 1. 实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 2.实验要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调度程序.作业一投入运行, ...

  4. C语言程序代写(Linux下线程)

    联系QQ:928900200 CSCI 3120 Operating Systems Summer 2014 Handout 3Assignment 2Date Due: June 5, 2014 b ...

  5. 菜鸟的飞翔日记-os篇

    一轮王道os复习感想 1概述 虽然去年有上操作系统这门必修课,考的成绩也算理想,本来还有点沾沾自喜,嗯,觉得自己学的还不错,知道有一天我拿起了王道,(没给王道打广告)看王道的原因完全在于为考研做准备, ...

  6. OS作业模拟SJF和FCFS

    一个OS的作业, 用于模拟短作业优先 和 先来先服务两种作业调度方式. #!/usr/bin/python3.5 ## Modify the SJF and FCFS algorithm in the ...

  7. 调度算法FCFS、SJF和优先权调度的介绍和例题

    调度算法 一.先来先服务FCFS (First Come First Serve) 1.思想: 选择最先进入后备/就绪队列的作业/进程,入主存/分配CPU 2.优缺点 优点:对所有作业/进程公平,算法 ...

  8. 《操作系统_FCFS和SJF》

    先来先服务FCFS和短作业优先SJF进程调度 转自:https://blog.csdn.net/qq_34374664/article/details/73231072 一.概念介绍和案例解析 FCF ...

  9. OS实验报告--FCFS算法

    实验二.作业调度模拟实验 专业:商业软件工程  姓名:王泽锴 学号:201406114113 一.实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 二.实验内容和要求 (1)实验 ...

随机推荐

  1. SOS dp

    设$ans=\sum\limits_{A \cap B=\varnothing} f(A)g(B) $ 直接暴力枚举子集是$O(3^n)$, 一个技巧是先预处理出$h(S)=\sum\limits_{ ...

  2. 一行代码实现Vue微信支付,无需引用wexin-sdk库,前后端分离HTML微信支付,无需引用任何库

    前后端分离项目实现微信支付的流程: 1:用户点击支付 2:请求服务端获取支付参数 3:客户端通过JS调起微信支付(微信打开的网页) * 本文主要解决的是第3步,视为前两步已经完成,能正确拿到支付参数, ...

  3. ajax中的事件

    blur : 当光标移开时(点击)触发 change : 当光标移开并且文本框中的内容和上一次不一致时(点击)触发

  4. Pytorch 1.0升级到Pytorch 1.1.0

    Pytorch 1.0Pytorch 1.0于2018-12-8发布,详见https://github.com/pytorch/pytorch/releases/tag/v1.0.0 主要更新JIT全 ...

  5. Node.js 实战(一)之—防灾备措施

    前言 博客系统上线已经3个多月了,中间没有出现过宕机事故,一直稳定运行.自己写的代码还是挺严谨的,小小鼓励一下!上周对云服务器进行了一次内存扩容,扩容后重启了一次服务器.虽然过程很短,但是因重启后导致 ...

  6. Qt QPushButton 背景色

    正常状态:黑底(背景色),白字(前景色),圆角,向外凸起 鼠标停留:背景和前景反色 鼠标按下:背景色变为淡蓝色,向内凹陷 ui->pushButton->setStyleSheet(&qu ...

  7. 修改mysql/MariaDB数据库的端口号+远程

    1.修改端口 2.远程+开放端口 (1)设置远程账号:xxx和密码yyyyyyygrant all privileges on *.* to 'xxx'@'%' identified by 'yyyy ...

  8. Android笔记(二十) Activity中的跳转和值传递

    我们知道,一个APP是由若干个Activity组成的,那么各个Acitivity中肯定需要进行跳转以及传递数值以保证App的运行,现总结一下多个Activity之间的跳转和值传递. 显式Intent跳 ...

  9. linux运维之路配置网络

    前言裸机上装操作系统,想和物理机通信需要设置IP 开机以后: 第一步:setup命令  ——>  NetWork configguation  ---->Device configurat ...

  10. 18.父组件给子组件传值&方法

    1.父组件给子组件传值 2.父组件把方法传递给子组件