OS实验报告——作业调度模拟程序
一、目的和要求
1. 实验目的
(1)加深对作业调度算法的理解;
(2)进行程序设计的训练。
2.实验要求
用高级语言编写一个或多个作业调度的模拟程序。
单道批处理系统的作业调度程序。作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素。
作业调度算法:
1) 采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度。总是首先调度在系统中等待时间最长的作业。
2) 短作业优先 (SJF) 调度算法,优先调度要求运行时间最短的作业。
3) 响应比高者优先(HRRN)调度算法,为每个作业设置一个优先权(响应比),调度之前先计算各作业的优先权,优先数高者优先调度。RP (响应比)= 作业周转时间 / 作业运行时间=1+作业等待时间/作业运行时间
每个作业由一个作业控制块JCB表示,JCB可以包含以下信息:作业名、提交(到达)时间、所需的运行时间、所需的资源、作业状态、链指针等等。
作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种之一。每个作业的最初状态都是等待W。
二、实验内容
根据指定的实验课题,完成设计、编码和调试工作,完成实验报告。
三、源代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h> struct job
{
char name[]; //作业名
char status; int arrtime; //到达时间
int reqtime; //要求服务时间
int startime; //开始时间
int finitime; //结束时间 float TAtime,TAWtime; //周转时间、带权周转时间
float prio; //优先级
float resratio;//响应比 }jobarr[],jobfin[],job[];
int systime=,num=;
int intarr,intfin,intjob;
int temp[]; void accordingTheInformation();//显示信息
void sort();//按到达时间进行排序
void output();//输出结果 void dataAccess();//选择数据的获取方式 void readFile();//读取文件
void manuallyEnter();//手动输入模拟函数 void algorithmMenu();//算法菜单 void FCFS();//FCFS算法
void SJF();//SJF算法
void HRRF();//HRRF算法 main()
{
//调用选择数据的获取方式方法
dataAccess(); } //显示信息
void accordingTheInformation()
{ printf("\n\n\t作业名 到达时间 CPU所需时间\n");
for(int i=;i<num;i++){
printf("\t %s\t %d\t\t%d\n",job[i].name,job[i].arrtime,job[i].reqtime);
}
} //按到达时间进行排序
void sort()
{ int i,j,k = ;
for(i=;i<num;i++)
temp[i]=i; //按作业到达时间进行排序
for(i=;i<num;i++){
for(j=i+;j<num;j++){
if(job[temp[i]].arrtime>job[j].arrtime){
k = temp[i];
temp[i] = temp[j];
temp[j] = k;
}
}
} } //输出结果
void output()
{
int i;
float AVGTAtime=,AVGTAWtime=; //平均周转时间,平均带权周转时间 //计算周转时间、带权周转时间
job[temp[]].startime = job[temp[]].arrtime;
job[temp[]].finitime = job[temp[]].startime + job[temp[]].reqtime;
job[temp[]].TAtime = (float)job[temp[]].finitime - job[temp[]].arrtime;
job[temp[]].TAWtime = job[temp[]].TAtime/job[temp[]].reqtime;
for(i=;i<num;i++){
job[temp[i]].startime = job[temp[i-]].finitime;
job[temp[i]].finitime = job[temp[i]].startime + job[temp[i]].reqtime;
job[temp[i]].TAtime = (float)job[temp[i]].finitime - job[temp[i]].arrtime;
job[temp[i]].TAWtime = job[temp[i]].TAtime/job[temp[i]].reqtime;
} //输出相关内容
printf("\n\n经按到达时间排序后,未达到队列是\n");
printf("作业名 到达时间 CPU所需时间 开始时间 结束时间 周转时间 带权周转时间\n");
for(i=;i<num;i++)
{
printf(" %s\t %d\t\t%d\t %d\t %d\t %f\t%f\n",job[temp[i]].name,job[temp[i]].arrtime,
job[temp[i]].reqtime,job[temp[i]].startime,job[temp[i]].finitime,job[temp[i]].TAtime,job[temp[i]].TAWtime);
} //计算平均周转时间、平均带权周转时间
for(i=;i<num;i++)
{
AVGTAtime += job[temp[i]].TAtime;
AVGTAWtime += job[temp[i]].TAWtime;
}
printf("\n\n平均周转时间=%f\n",AVGTAtime/num);
printf("平均带权周转时间=%f\n\n",AVGTAWtime/num);
} //FCFS算法
void FCFS()
{
printf("\n\n* * * * * * * 先来先服务算法FCFS * * * * * * *");
//显示信息
accordingTheInformation(); //按到达时间进行排序
sort(); //输出结果
output(); //再次调用算法菜单
algorithmMenu();
} //SJF算法
void SJF()
{
int i,j,k = ; printf("\n\n* * * * * * * 最短作业优先算法SJF * * * * * * *");
//显示信息
accordingTheInformation(); //按到达时间进行排序
sort(); //按需要服务时间进行排序
for(i=;i<num;i++){
for(j=i+;j<num;j++){
if(job[temp[i]].reqtime>job[j].reqtime && temp[i]!=){
k = temp[i];
temp[i] = temp[j];
temp[j] = k;
}
}
} //输出结果
output(); //再次调用算法菜单
algorithmMenu(); } //HRRF算法
void HRRF(){
int i,j,k=;
printf("\n\n* * * * * * * 响应比最高者优先算法HRRF * * * * * * *");
//显示信息
accordingTheInformation();
//按到达时间进行排序
sort(); //计算最高响应比
for(i=;i<num;i++){
if(temp[i]!=){
job[temp[i]].resratio = + (float)(job[].reqtime+job[].arrtime-job[temp[i]].arrtime)/job[temp[i]].reqtime;
}
}
/*
for(i=0;i<num;i++){
printf("%f\n",job[temp[i]].resratio);
}
*/ //按最高响应比进行排序
for(i=;i<num;i++){
for(j=i+;j<num;j++){
if(job[temp[i]].resratio<job[j].resratio && temp[i]!=){
k = temp[i];
temp[i] = temp[j];
temp[j] = k;
}
}
} //输出结果
output(); //再次调用算法菜单
algorithmMenu(); } //算法菜单
void algorithmMenu()
{
int k;
printf("\n\n\t**************************************\n");
printf("\t\t1.FCFS算法调度\n");
printf("\t\t2.SJF算法调度\n");
printf("\t\t3.HRRF算法调度\n");
printf("\t\t0.退出算法调度\n");
printf("\t**************************************\n\n\n");
printf("\t请选择菜单项: ");
scanf("%d",&k);
switch(k){
case :
//调用FCFS算法
FCFS();
break;
case :
//调用SJF算法
SJF();
break;
case :
//调用HRRF算法
HRRF();
break;
case :
//退出程序
printf("\n\n\t已退出算法调度\n\n");
break;
default:
printf("\n\n\t**请输出0-3的数字进行选择");
algorithmMenu();
break;
}
} //手动输入模拟函数
void manuallyEnter(){ int i;
printf("\n\t作业个数:");
scanf("%d",&num);
printf("\n");
//循环输入信息
for(i = ;i<num;i++){
printf("\t第%d个作业:\n",i+);
printf("\t输入作业名:");
scanf("%s",&job[i].name);
printf("\t到达时间:");
scanf("%d",&job[i].arrtime);
printf("\t要求服务时间:");
scanf("%d",&job[i].reqtime);
printf("\n");
}
//调用算法菜单
algorithmMenu();
} //读取文件
void readFile()
{
//读取文件
FILE *fp = fopen("job.txt","r");
if(fp == NULL)
{
printf("File open error!\n");
exit();
}
while(!feof(fp)&&fgetc(fp)!=EOF)
{
fseek(fp,-1L,SEEK_CUR);
fscanf(fp,"%s%d%d",&job[num].name,&job[num].arrtime,&job[num].reqtime);
num++;
}
fclose(fp);
//显示读取到的文本信息
accordingTheInformation();
//调用算法菜单函数
algorithmMenu();
} //选择数据的获取方式
void dataAccess()
{
int k;
printf("\n\n\t**************************************\n");
printf("\t\t1.调用文本写入数据\n");
printf("\t\t2.调用自己输入模拟数据\n");
printf("\t**************************************\n\n\n");
printf("\t请选择菜单项: ");
scanf("%d",&k);
switch(k){
case :
readFile();
break;
case :
manuallyEnter();
break;
default:
printf("\n\n\t**请输出1或者2进行选择");
dataAccess();
break;
}
}
四、实验结果
1.调用文本写入数据

2.调用FCFS算法

3.调用SJF算法

4.调用HRRF算法

OS实验报告——作业调度模拟程序的更多相关文章
- OS实验报告--FCFS算法
实验二.作业调度模拟实验 专业:商业软件工程 姓名:王泽锴 学号:201406114113 一.实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 二.实验内容和要求 (1)实验 ...
- OS第1次实验报告:熟悉使用Linux命令和剖析ps命令
零.个人信息 姓名:陈韵 学号:201821121053 班级:计算1812 一.实验目的 熟悉Linux命令行操作 二.实验内容 使用man查询命令使用手册 基本命令使用 三.实验报告 1. 实验环 ...
- UFLDL实验报告3:Self-taught
Self-taught 自我学习器实验报告 1.Self-taught 自我学习实验描述 自我学习是无监督特征学习算法,自我学习意味着算法能够从未标注数据中学习,从而使机器学习算法能够获得更大数量的数 ...
- UFLDL实验报告2:Sparse Autoencoder
Sparse Autoencoder稀疏自编码器实验报告 1.Sparse Autoencoder稀疏自编码器实验描述 自编码神经网络是一种无监督学习算法,它使用了反向传播算法,并让目标值等于输入值, ...
- UFLDL实验报告1: Softmax Regression
PS:这些是今年4月份,跟斯坦福UFLDL教程时的实验报告,当时就应该好好整理的…留到现在好凌乱了 Softmax Regression实验报告 1.Softmax Regression实验描述 So ...
- 20155212 实验四 《Android程序设计》 实验报告
20155212 实验四 <Android程序设计> 实验报告 (一)Android Stuidio的安装测试 参考<Java和Android开发学习指南(第二版)(EPUBIT,J ...
- 2017-2018-2 20165312 实验四《Android程序设计》实验报告
2017-2018-2 20165312 实验四<Android程序设计>实验报告 一.安装Android Studio并进行Hello world测试和调试程序 安装Android St ...
- 2017-2018-2 20165315 实验四《Android程序设计》实验报告
2017-2018-2 20165315 实验四<Android程序设计>实验报告 第24章:初识Android Android Studio项目的目录树 1 build:该目录包含了自动 ...
- 2017-2018-2 20165306 实验四《Android开发基础》实验报告
实验四<Android开发基础>实验报告 实验报告封面 实验内容 Android程序设计-1 实验要求: 参考<Java和Android开发学习指南(第二版)(EPUBIT,Java ...
随机推荐
- c语言问卷
1.你对自己的未来有什么规划?做了哪些准备? 答:关于未来我想从事设计网页.做小游戏或者app的工作,因为是金融服务外包方向,也许也会进入银行或者证券公司管理银行系统.让英语更近一层,可进入外企工作. ...
- 【转】Nginx中upstream有以下几种方式:
1.轮询(weight=1) 默认选项,当weight不指定时,各服务器weight相同, 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除.upstream bak ...
- shared_ptr:资源管理利器
如果你还在使用传统的C++,那么可以肯定堆内存的管理让你头痛过!在传统的C++领域,堆内存管理上我们能借用的现成工具就只有auto_ptr.但是很不幸用auto_ptr管理堆内存简直就是个错误.aut ...
- 将word文件快速转换成表格的技巧
最近烦心事还真是很多,世界买家网最近就遇到了很多烦心事. 从www.buyerinfo.biz网站中的数据导出为csv格式的文件,我导出了buyer的数据,那怎么把它制作成表格呢? 找了下,发现还是比 ...
- SharePoint Document Library中的"Versioning Settings"功能与CSOM的对应
博客地址:http://blog.csdn.net/FoxDave SharePoint文档库关于版本的设置:"Versioning Settings",可以通过CSOM用L ...
- MySQL 通过semi join 优化子查询
半连接是MySQL 5.6.5引入的,多在子查询exists中使用,对外部row source的每个键值,查找到内部row source匹配的第一个键值后就返回,如果找到就不用再查找内部row sou ...
- jQuery原生框架-----------------属性操作
// 添加一个处理兼容获取样式的静态方法jQuery.getStyle = function( dom, styleName ) { // dom不是dom,styleName不是字符串,直接打走 i ...
- mount: /dev/sdb1 already mounted or /mnt/hdb busy 导致NameNode无法启动
最近,公司由于断电导致的服务器关机,等到来电了,重启集群发现Namenode无法启动,查看原因是由于无法加在faimage文件,在查看一下Namenode的磁盘挂在情况(df -h命令查看),发现磁盘 ...
- 《Eclipse中的一些快捷键》
1,window--首选项--Java--templates 自定义模板. 2,快捷键. 2.1 alt+/ 内容辅助. 2.2 ctrl+1 : 对小红×的提供解决法案.大红×(代码错误)必须修改代 ...
- C# 字符编码类Encoding
在网络通信中,很多情况下都是将字符信息转成字节序列进行传输.将字符序列转为字节序列的过程称为编码.当这些字节传送到接收方,接收方需要逆向将字节序列转为字符序列.这个过程就是解码. 常见编码有ASCII ...