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 ...
随机推荐
- Console命令详解,让调试js代码变得更简单
Firebug是网页开发的利器,能够极大地提升工作效率. 但是,它不太容易上手.我曾经翻译过一篇<Firebug入门指南>,介绍了一些基本用法.今天,继续介绍它的高级用法. ======= ...
- sql中binary_checksum(*)的用法
sql中binary_checksum(*)的用法(转) binary_checksum(*)可以用来检查修改过的行. 同一行在update后,该行的binary_checksum(*)就不同. 如 ...
- java 抓取网页图片
import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.Out ...
- SharePoint Site "Language Settings"功能与CSOM的对应
博客地址:http://blog.csdn.net/FoxDave SharePoint网站中的语言设置:"Language Settings",可以用CSOM通过Site的一些 ...
- mongo 导入json数据
删除库以及导入库
- linux下查看进程状态
1.查看进程的启动时间和执行时间 使用 ps 命令 :#ps -A -opid,stime,etime,args $ ps -A -opid,stime,etime,args PID STIME EL ...
- jsp取得绝对路径的方法(避免请求转发的方式导致路径错误)
<%String path = request.getContextPath();String basePath = request.getScheme()+"://"+re ...
- 用docker toolBox 搭建 nginx + flask + redis 环境
本篇博客,主要是了解一下docker-compose的使用,docker-compose是官方给出的同时部署多个容器的解决方案:当你需要多个容器同时运行作为你的解决方案时:比如构建一个网站,需要php ...
- Convert
Person p=teacher as person; If (p!=null ) dostring (); 使用这样的方法效率高 使用 is时 进行两次判断效率低
- AXUre
[ Javascript ] 一.javascript能用来干什么? 1.数据的验证. 2.对动态这本写到网页当中. 3.可以对事件做出响应. 4.可以读写html 中的内室. 5.可以检测浏览器 6 ...