0421实验二 作业调度模拟程序
实验二作业调度模拟程序
一、目的和要求
1. 实验目的
(1)加深对作业调度算法的理解;
(2)进行程序设计的训练。
2.实验要求
用高级语言编写一个或多个作业调度的模拟程序。
单道批处理系统的作业调度程序。作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素。
作业调度算法:
1) 采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度。总是首先调度在系统中等待时间最长的作业。
2) 短作业优先 (SJF) 调度算法,优先调度要求运行时间最短的作业。
3) 响应比高者优先(HRRN)调度算法,为每个作业设置一个优先权(响应比),调度之前先计算各作业的优先权,优先数高者优先调度。RP (响应比)= 作业周转时间 / 作业运行时间=1+作业等待时间/作业运行时间
每个作业由一个作业控制块JCB表示,JCB可以包含以下信息:作业名、提交(到达)时间、所需的运行时间、所需的资源、作业状态、链指针等等。
作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种之一。每个作业的最初状态都是等待W。
一、 模拟数据的生成
1. 允许用户指定作业的个数(2-24),默认值为5。
2. 允许用户选择输入每个作业的到达时间和所需运行时间。
3. (**)从文件中读入以上数据。
4. (**)也允许用户选择通过伪随机数指定每个作业的到达时间(0-30)和所需运行时间(1-8)。
二、 模拟程序的功能
1. 按照模拟数据的到达时间和所需运行时间,执行FCFS, SJF和HRRN调度算法,程序计算各作业的开始执行时间,各作业的完成时间,周转时间和带权周转时间(周转系数)。
2. 动态演示每调度一次,更新现在系统时刻,处于运行状态和等待各作业的相应信息(作业名、到达时间、所需的运行时间等)对于HRRN算法,能在每次调度时显示各作业的响应比R情况。
3. (**)允许用户在模拟过程中提交新作业。
4. (**)编写并调度一个多道程序系统的作业调度模拟程序。 只要求作业调度算法:采用基于先来先服务的调度算法。 对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。
三、 模拟数据结果分析
1. 对同一个模拟数据各算法的平均周转时间,周转系数比较。
2. (**)用曲线图或柱形图表示出以上数据,分析算法的优点和缺点。
四、 实验准备
序号 |
准备内容 |
完成情况 |
1 |
什么是作业? |
|
2 |
一个作业具备什么信息? |
|
3 |
为了方便模拟调度过程,作业使用什么方式的数据结构存放和表示?JCB |
|
4 |
操作系统中,常用的作业调度算法有哪些? |
|
5 |
如何编程实现作业调度算法? |
|
6 |
模拟程序的输入如何设计更方便、结果输出如何呈现更好? |
五、 其他要求
1. 完成报告书,内容完整,规格规范。
2. 实验须检查,回答实验相关问题。
注:带**号的条目表示选做内容。
二、实验内容
根据指定的实验课题,完成设计、编码和调试工作,完成实验报告。
三、实验环境
可以采用TC,也可以选用Windows下的利用各种控件较为方便的VB,VC等可视化环境。也可以自主选择其他实验环境。
四、实验原理及核心算法参考程序段
单道FCFS算法:
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> struct jcb{char name[10]; //作业名char status; //作业状态double arrtime; //作业到达时间double reqtime; //作业要求时间double startime; //作业开始时间double finitime; //作业完成时间double turntime; //作业周转时间float Tatime,TAWtime;float prio; }jobarr[24],jobfin[24],job[24],cunfang;int systime=0; int intarr,intfin,intjob; //作业到达个数,完成个数,未达到作业个数 int i; int r;//排序 void rank(int flag){int j;for(r=0;r<flag;r++){for(j=r+1;j<flag;j++)if(jobarr[r].arrtime>jobarr[j].arrtime){cunfang=jobarr[r];jobarr[r]=jobarr[j];jobarr[j]=cunfang;}} }//先来先服务算法 void FCFS(int flag) {int r;double attime,wattime; jobarr[0].startime=0;jobarr[0].finitime=jobarr[0].startime+jobarr[0].reqtime;jobarr[0].turntime=jobarr[0].reqtime;attime=jobarr[0].turntime;wattime=jobarr[0].finitime;for(r=1;r<flag;r++){jobarr[r].startime=jobarr[r-1].finitime;jobarr[r].finitime=jobarr[r].startime+jobarr[r].reqtime;jobarr[r].turntime=jobarr[r-1].finitime-jobarr[r].arrtime+jobarr[r].reqtime;attime+=jobarr[r].turntime;wattime=jobarr[r].finitime-jobarr[r].reqtime+wattime;}attime=attime/((double)flag);wattime=wattime/((double)flag);printf("\nFCFS算法作业序列表\n\n");printf("--------------------------------------------------------------------------------\n");printf("作业名\t到达系统时间\tCPU所需时间\t开始时间\t结束时间\t周转时间");for(r=1;r<flag;r++){printf("\n");printf("%s",jobarr[r].name);printf("%11.2lf",jobarr[r].arrtime);printf("%16.2lf",jobarr[r].reqtime);printf("%16.2lf",jobarr[r].startime);printf("%16.2lf",jobarr[r].finitime);printf("%16.2lf",jobarr[r].turntime); }printf("\n\n平均周转时间:%.2lf",attime);printf("\n\n平均带权周转时间:%.2lf\n",wattime);printf("--------------------------------------------------------------------------------\n"); }//插入 void inser() {printf("第%d个作业:\n",i+1);printf("输入作业名:");scanf("%s",jobarr[i].name);printf("作业到达时间:");scanf("%d",&jobarr[i].arrtime);printf("作业要求服务时间:");scanf("%d",&jobarr[i].reqtime);printf("\n");i++;rank(i); }//删除 void delet() {int q;char remove[10];printf("请输入要删除的作业名: ");scanf("%s",remove);for(r=0;r<i;r++) if(strcmp(jobarr[r].name,remove)==0){for(q=r;q<i;q++){jobarr[q]=jobarr[q+1];}i--;} }//输入作业信息 void input() {printf("作业个数:");scanf("%d",&i);printf("\n");for(r=0;r<i;r++){printf("第%d个作业:\n",r+1);printf("输入作业名:");scanf("%s",jobarr[r].name);printf("到达时间:");scanf("%lf",&jobarr[r].arrtime);printf("要求服务时间:");scanf("%lf",&jobarr[r].reqtime);printf("\n");} }//输出作业信息 void output() {int num,m;while(1){printf("经按到达时间排序后,未达到队列是\n");printf("\tname\tartime\trqtime\n");for(r=0;r<i;r++){printf("N %d",r+1);printf("\t%s",jobarr[r].name);printf("\t%.2lf",jobarr[r].arrtime);printf("\t%.2lf",jobarr[r].reqtime);printf("\n");}printf("\n\t\t\t现在系统时间 0:\n");printf("请选择算法: 1.先来先服务(FCFS)调度算法 2.短作业优先(SJF)调度算法\n");scanf("%d",&m); switch(m){case 1:FCFS(i);break;case 2:break;}printf("\n1.插入 2.删除 3.退出?\n");printf("请选择:");scanf("%d",&num);if(num==1)inser();else if(num==2)delet();else if(num==3)return; elsecontinue;}}//读取文件的数据void ReadFile(){int m;int i=1;int flag=0;FILE *fp; //定义文件指针fp=fopen("3.txt","r"); //打开文件if(fp==NULL){printf("File open error !\n");exit(0);}printf("\n\t作业名\t 作业到达时间\t 作业运行所需要时间\n");while(!feof(fp)){fscanf(fp,"%s%lf%lf",&jobarr[i].name,&jobarr[i].arrtime,&jobarr[i].reqtime); //fscanf()函数将数据读入 i++;flag=i;};rank(i);for(i=1;i<flag;i++)printf("\n\t%s\t\t %.2lf\t\t %.2lf",jobarr[i].name,jobarr[i].arrtime,jobarr[i].reqtime); //输出到屏幕printf("\n");printf("\n");if(fclose(fp)) //关闭文件 {printf("Can not close the file !\n");exit(0);}printf("请选择算法: 1.先来先服务(FCFS)调度算法 2.短作业优先(SJF)调度算法\n");scanf("%d",&m);switch(m){case 1:FCFS(i);break;case 2:break;}printf("\n");//printf(""); }//伪随机数产生器void Pseudo_random_number(){int i,n,m;srand((unsigned)time(0)); //参数seed是rand()的种子,用来初始化rand()的起始值。//输入作业数n=rand()%13+5;for(i=1; i<=n; i++){//jobarr[i].name=i;//作业到达时间jobarr[i].arrtime=rand()%29+1;//作业运行时间jobarr[i].reqtime=rand()%7+1;}rank(i);printf("\n作业名 作业到达时间 作业运行所需要时间\n");for(i=1; i<=n; i++){printf("\njob%2d %11.2lf %.2lf",i,jobarr[i].arrtime,jobarr[i].reqtime);}printf("\n\n");printf("请选择算法:1.先来先服务(FCFS)调度算法 2.短作业优先(SJF)调度算法\n");scanf("%d",&m);switch(m){case 1:FCFS(i);break;case 2:break;}printf("\n");}void main(){int num;while(1){printf("-----------------------------------------------------------------------------\n");printf("请选择读取作业的方式:1.文件读取 2.手动输入 3.伪随机数随机产生\n");printf("-----------------------------------------------------------------------------\n");printf("请选择:");scanf("%d",&num);switch(num){case 1:ReadFile();break;case 2:input();rank(i);output();break;case 3:Pseudo_random_number();break;}}}
运行结果:
转载于:https://www.cnblogs.com/55fmj/p/5419207.html
0421实验二 作业调度模拟程序相关推荐
- 【操作系统】实验二 作业调度模拟程序
实验二作业调度模拟程序 一.目的和要求 1. 实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 2.实验要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调 ...
- (操作系统)实验二 作业调度
一.目的和要求 1. 实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 2.实验要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调度程序.作业一投入运行, ...
- 操作系统 实验三 进程调度模拟程序
实验三 进程调度模拟程序 ...
- 实验三进程调度模拟程序
实验三 进程调度模拟程序 专业:物联网工程 姓名:王鸾 学号:201306104128 一. 实验目的和要求 目的: 用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 实 ...
- 实验三 进程调度模拟程序2.0
实验三 进程调度模拟程序2.0 一.实验目 ...
- 2018.9.10.Matlab实验二:Matlab基本运算
实验二:Matlab基本运算 一.实验任务和目的 1. 掌握变量的定义与数据类型. 2. 掌握变量的初始化方法. 3. 掌握数组.多维数组与子数组的定义.存储.赋值.变换. 4. 掌握逻辑数组的用法. ...
- 操作系统实验二(调度算法模拟-先进先出-时间片轮转法-优先服务调度算法)
实验二 进程调度 一. 实验目的 1. 理解进程运行的并发性. 2. 理解处理器的三级调度. 3. 掌握先来先服务的进程调度算法. 4. 掌握短 ...
- Java实现操作系统作业调度模拟程序+GUI图形化
0.资源链接:csdn资源下载 一. 设计要求 编写并调试一个单道处理系统的作业调度模拟程序.分别采用先来先服务(FCFS),以及优先权优先调度算法,简单轮转法调度算法进行调度.对每种调度算法都要求打 ...
- 单位斜变函数matlab,实验二 用MATLAB实现线性系统的时域分析
实验二基于MATLAB的线性系统时域分析 [实验目的] 1.研究线性系统在典型输入信号作用下的暂态响应: 2.熟悉线性系统的暂态性能指标: 3.研究二阶系统重要参数阻尼比ξ对系统动态性能的影响: 4. ...
最新文章
- 007_logback配置
- 科大星云诗社动态20210830
- kali卸载firefox_kali 安装最新firefox的悲惨经历
- xpath java html_Java根据XPath提取HTML
- 达拉草201771010105《面向对象程序设计(java)》第十七周学习总结
- 浅谈栈和队列的有关面试题
- 2019年英语计算机二级,2019年下半年计算机二级考试时间和英语六级考..._成人英语考试_帮考网...
- Sublime下MarkDown插件实现编辑和实时预览并转换成HTML格式
- 电脑故障速查方法集萃
- CactiEZ安装与配置-监控网卡流量
- Win10使用以前的图片查看器
- layui 确认,取消弹窗
- word 任意页设置开始页码
- php cms下载地址,phpcms将下载地址替换为图片显示
- UPC10728:Imputation
- linux xen 管理,ARM平台上运行Xen 可同时管理linux和VxWorks
- MATLAB画带厚度的圆弧线
- android 映客弹幕实现方法,映客如何关闭弹幕 关闭弹幕方法
- 什么是SCCP认证?POPS测试是什么?POPS-SCCP如何测试
- 信修修:安全省心!U盘安装纯净原版Win10系统教程!