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 ...
随机推荐
- Result Maps collection does not contain value for java.lang.Integer异常处理
使用Mybatis的时候出现这个问题是因为配置文件的问题造成的,mybatis需要写大量的配置文件, 尽管有mybatis-generator,但是里面的内容有很多还是要自己去写的,在这过程中难免会出 ...
- gradle环境配置、
话不多说,直接上流程. 1.下载 gradle.zip文件,我以为已经为大家准备好了各个版本的下载地址. 链接: http://pan.baidu.com/s/1hqjIVlE 密码: 8ccb 本人 ...
- DB2获取有效工作时长函数(排除节假日、排除午休时间)
CREATE OR REPLACE FUNCTION DIFFHOURTIME_WITHOUTHOLIDAY_FUN ( STARTTIME ), ENDTIME ) ) RETURNS DOUBLE ...
- [转] 使用反射机制控制Toast的显示时间
大体上说就是利用toast的内部类TN 来控制show和hide ,这是一个反射机制 怎么控制toast的显示时间呢?这个就是通过tn类的show和hide的方法 http://blog.csdn.n ...
- 《java小应用程序(Applet)和java应用程序(Application)分别编写的简单计算器》
Application和Java Applet的区别.Java语言是一种半编译半解释的语言.Java的用户程序分为两类:Java Application和Java Applet.这两类程序在组成结构和 ...
- HTTP协议用的TCP但是只建立单向连接
作者:IronTech链接:https://www.zhihu.com/question/20085992/answer/71742030来源:知乎著作权归作者所有,转载请联系作者获得授权. 下面的解 ...
- JavaScript获取一段html片段中a标签的href值
最近,做项目中有一个需求,页面中有一个文本编辑器,里面写的内容最后生成了html代码片段,在另一个页面需要前一个页面文本编辑器的html代码片段中的a标签的href值,就尝试做了,因为不太熟悉js,所 ...
- spring 3.0 应用springmvc 构造RESTful URL 详细讲解
在线springmvc_rest demo 由于下一版本的rapid-framwork需要集成spring RESTful URL,所以研究了一下怎么搭建. 并碰到了一下问题. springmvc 3 ...
- 三种renderman规范引擎的dice对比
次表面做的有些烦躁,既然如此,索性先记一下前一阵比较的PIXIE.3delight.prman的dice方式. 研究过reyes的人都知道dice,简而言之,就是为了生成高质量高精度的图片(电影CG) ...
- 【LeetCode OJ】Maximum Depth of Binary Tree
Problem Link: https://oj.leetcode.com/problems/maximum-depth-of-binary-tree/ Simply BFS from root an ...