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. 对称加密,非对称加密,数字签名,https

    对称加密和非对称加密 对称加密 概念:加密秘钥和解密秘钥使用相同的秘钥(即加密和解密都必须使用同一个秘钥) 特点:一对一的双向保密通信(每一方既可用该秘钥加密,也可用该秘钥解密,非对称加密是多对一的单 ...

  2. java-websocket客户端 断线重连 注入Service问题

    java版客户端: 使用开源项目java-websocket, github地址: https://github.com/TooTallNate/Java-WebSocket github上有很多示例 ...

  3. Linux Wireless Supported Devices

    Linux Wireless Supported Devices https://ark.intel.com/content/www/us/en/ark/products/series/59484/i ...

  4. metasploit情报收集

    1.msf连接数据库 service postgresql start(postgresql默认用户名scott,密码tiger) msf > db_connect 用户名:密码@127.0.0 ...

  5. 使用 pykafka 进行消费

    kafka连接脚本 环境:python3,用到的模块有 pykafka,kazoo # coding=utf-8 import pykafka class KafkaReaderThread(obje ...

  6. 一、ribbon如何集成在openfeign中使用

    所有文章 https://www.cnblogs.com/lay2017/p/11908715.html 正文 ribbon是springcloud封装的一个基于http客户端负载均衡的组件.spri ...

  7. UI5-技术篇-Hybrid App-1-Barcode扫描

    参考资料: https://www.w3cschool.cn/cordova/cordova_overview.html https://blogs.sap.com/2017/01/03/sapui5 ...

  8. SDcms1.8代码审计

    由于工作原因,分析了很多的cms也都写过文章,不过觉得好像没什么骚操作都是网上的基本操作,所以也就没发表在网站上,都保存在本地.最近突然发现自己博客中实战的东西太少了,决定将以前写的一些文章搬过来,由 ...

  9. [#Linux] CentOS 7 应用程序添加快捷方式到桌面

    在centos使用中,会发现应用程序只能到eclipse的目录中执行eclipse的脚本去启动.这样很不方便. 查阅资料后找到了解决方案: 1.通过命令行,进入到桌面文件夹中 cd /home/you ...

  10. 微信小程序 之wxml保留小数点后两位数的方法及转化为字符串的方法

    原理:wxml中不能直接使用较高级的js语法,如‘.toFixed’,‘toString()’,但可以通过引入wxs模块实现效果 1.新建`filter.wxs` var filters = {    ...