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 ...
随机推荐
- RN中的onChangeText
在RN学习中,按照一本书中案例书写TextInput框, 书中给了两种写法 写法1: <TextInput style={styles.pswInputStyle} placeholder='请 ...
- jQuery原生框架中的jQuery.fn.extend和jQuery.extend
extend 方法在 jQuery 中是一个很重要的方法,jQuey 内部用它来扩展静态方法或实例方法,而且我们开发 jQuery 插件开发的时候也会用到它.但是在内部,是存在 jQuery.fn.e ...
- matlab初学之plot颜色和线型
文章出处: http://jiangshuxia.9.blog.163.com/blog/static/3487586020116711375339/ 字母 颜色 标点 ...
- 兼容各版本浏览器,封装原生Js获取ClassName
web前端开发工作中常常会用到获取元素的className,用jQuery的$(".class")方法也可以获取className,但是有时候牵扯到数据而影响的加载顺序的原因会获取 ...
- 第5章 搭建S3C6410开发板的测试环境
1.使用Eboot擦除NandFlash的方法如下: 第一步:准备工作 用串口线或USB转串口线连接开发板和PC,并启动minicom 第二步:进入Eboot状态 打开OK6410开发板的电源开关,过 ...
- 微软Face API体验——人脸检测
微软推出了全新REST API,现在可免费获取密钥,大家可以赶快申请!申请地址:https://cn.projectoxford.ai/subscription 看了网站的API介绍,忍不住赶快体验一 ...
- MySQL命令行导出数据库
MySQL命令行导出数据库:1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录如我输入的命令行:cd C:\Program Files\MySQL\MySQL Server ...
- sql语句查询结果添加排序列(转)
给查询出的SQL记录添加序号列,解决方法有以下两种 第一: select ROW_NUMBER() OVER (ORDER BY a.字段 ASC) AS XUHAO,a.* from table ...
- GitHub菜鸟日志1——20160531
好吧,事实上很早就知道有github这个东西了,然而就有一种莫名的力量一直阻止着我向这“未知的领域”涉足(which is called lazy). 然后,前略...总之,默默的就开始了github ...
- Inversion_树状数组***
Problem Description You have a sequence {a1,a2,...,an} and you can delete a contiguous subsequence o ...