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 ...
随机推荐
- android studio 换护眼的颜色步骤
设置--->Editor-->General-->Default Text-->Background护眼色是#D2E3C7
- as3延迟处理
查找关键字“flashplayer 弹性跑道” 每当一帧即将走完,FlashPlayer就要做些总结性工作(一次性地汇总变化),把这一帧当中发生的变化拿出来展示(渲染)一下. 如果它处理的事情少,工作 ...
- $scope 的生命周期
当Angular关心的事件发生在浏览器中时,比如用户在通过ng-model属性监控的输入字段中输入,或者带有ng-click属性的按钮被点击时,Angular的事件循环都会启动.这个事件将在Angul ...
- C++数据类型和变量类型。
数据类型 数字是自由的[不只属于某个类型]!但是它可以有不同的身份!int.char.float.double等身份.它以不同的身份[存储规则]存储在内存的某个位置内部! 变量类型 内存编号是不会变的 ...
- Oracle存储过程中异常Exception的捕捉和处理
Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...
- mac 下配置tomcat
下面就是一些简单的步骤,帮你把Tomcat7安装在你的Mac上. 下载一个 二进制包: apache-tomcat-7.0.27.tar.gz ,可以在Apache的官方网站找到. 双击解压在你的下载 ...
- Thinkphp 带查询条件数据分页
//查询条件中如果有中文 $keyword= urldecode(I("request.keyword")); if ($keyword!=""){ $Mode ...
- javascript学习之【new操作符】
首先请大家思考这么一段代码,如下: <script>var jquery=function(){ console.log(this);};jquery();new jquery() ...
- 团队开发——冲刺2.g
冲刺阶段二(第七天) 1.昨天做了什么? 编写软件计划书第三阶段:整理用户体验建议:据用户对界面的要求,把小球改头换面,借鉴超级马里奥叔叔的道具们. 2.今天准备做什么? 最后的美工,统一整合: 测试 ...
- iOS技术博客(文摘)链接地址
objc系列译文(5.1):认识 TextKit 手把手教你配置苹果APNS推送服务 如何使用iOS Addressbook UIApplication深入研究 GCD倒计时 那些不能错过的Xco ...