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)实验 ...
随机推荐
- Django_rest_framework分页
分页基本流程及配置 1.基于LimitOffsetPagination做分页,根据配置 from rest_framework.pagination import LimitOffsetPaginat ...
- HTML的发展历史
HTML是Web统一语言,这些容纳在尖括号里的简单标签,构成了如今的Web,1991年,Tim Berners-Lee编写了一份叫做“HTML标签”的文档,里面包含了大约20个用来标记网页的HTML标 ...
- Java 之 注解
一.注解介绍 注解概念:注解是说明程序的,给计算机看的. 注释概念:用文字描述程序的,给程序员看的. 注解定义:注解(Annotation),也叫元数据.一种代码级别的说明.它是 JDK1.5 及以后 ...
- Android NDK 学习之调用Java函数
本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件. 在Eclipse中添加配置NDK,路径如下Eclipse-> ...
- 流程控制 while for
循环执行 计算机最擅长的功能之一就是按照规定的条件,重复执行某些操作,这是程序设计中最能发挥计算机特长的程序结构. 1.while语句 while(表达式){ 各种语句.... } 当表达式的值为tr ...
- Linux(一):Linux基础
1. Linux入门 1.1. Linux概述 Linux是一套免费使用和自由传播的类Unix操作系统.Unix操作系统是上世纪70年代在贝尔实验室诞生的一个强大的多用户.多任务操作系统. Linux ...
- Android笔记(十四) Android中的基本组件——按钮
Android中的按钮主要包括Button和ImageButton两种,Button继承自TextView,而ImageButton继承自ImageView.Button生成的按钮上显示文字,而Ima ...
- c# 使用序列化
- 元类编程--__get__ __set__属性描述符
from datetime import date, datetime import numbers class IntField: #数据描述符,实现以下任意一个,都会变为属性描述符 def __g ...
- nginx配置文件详解【nginx.conf】
#基本配置: #user nobody;#配置worker进程运行用户worker_processes 1;#配置工作进程数目,根据硬件调整.通常等于CPU数量或者2倍于CPU数量 比如四核电脑(可以 ...