实验二作业调度模拟程序

一、目的和要求

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. 实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 2.实验要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调 ...

  2. (操作系统)实验二 作业调度

    一.目的和要求 1. 实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 2.实验要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调度程序.作业一投入运行, ...

  3. 操作系统 实验三 进程调度模拟程序

                                                          实验三 进程调度模拟程序                                   ...

  4. 实验三进程调度模拟程序

    实验三 进程调度模拟程序 专业:物联网工程   姓名:王鸾  学号:201306104128 一. 实验目的和要求 目的: 用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 实 ...

  5. 实验三 进程调度模拟程序2.0

                                                                                   实验三 进程调度模拟程序2.0 一.实验目 ...

  6. 2018.9.10.Matlab实验二:Matlab基本运算

    实验二:Matlab基本运算 一.实验任务和目的 1. 掌握变量的定义与数据类型. 2. 掌握变量的初始化方法. 3. 掌握数组.多维数组与子数组的定义.存储.赋值.变换. 4. 掌握逻辑数组的用法. ...

  7. 操作系统实验二(调度算法模拟-先进先出-时间片轮转法-优先服务调度算法)

    实验二 进程调度 一.     实验目的 1.       理解进程运行的并发性. 2.       理解处理器的三级调度. 3.       掌握先来先服务的进程调度算法. 4.       掌握短 ...

  8. Java实现操作系统作业调度模拟程序+GUI图形化

    0.资源链接:csdn资源下载 一. 设计要求 编写并调试一个单道处理系统的作业调度模拟程序.分别采用先来先服务(FCFS),以及优先权优先调度算法,简单轮转法调度算法进行调度.对每种调度算法都要求打 ...

  9. 单位斜变函数matlab,实验二 用MATLAB实现线性系统的时域分析

    实验二基于MATLAB的线性系统时域分析 [实验目的] 1.研究线性系统在典型输入信号作用下的暂态响应: 2.熟悉线性系统的暂态性能指标: 3.研究二阶系统重要参数阻尼比ξ对系统动态性能的影响: 4. ...

最新文章

  1. 007_logback配置
  2. 科大星云诗社动态20210830
  3. kali卸载firefox_kali 安装最新firefox的悲惨经历
  4. xpath java html_Java根据XPath提取HTML
  5. 达拉草201771010105《面向对象程序设计(java)》第十七周学习总结
  6. 浅谈栈和队列的有关面试题
  7. 2019年英语计算机二级,2019年下半年计算机二级考试时间和英语六级考..._成人英语考试_帮考网...
  8. Sublime下MarkDown插件实现编辑和实时预览并转换成HTML格式
  9. 电脑故障速查方法集萃
  10. CactiEZ安装与配置-监控网卡流量
  11. Win10使用以前的图片查看器
  12. layui 确认,取消弹窗
  13. word 任意页设置开始页码
  14. php cms下载地址,phpcms将下载地址替换为图片显示
  15. UPC10728:Imputation
  16. linux xen 管理,ARM平台上运行Xen 可同时管理linux和VxWorks
  17. MATLAB画带厚度的圆弧线
  18. android 映客弹幕实现方法,映客如何关闭弹幕 关闭弹幕方法
  19. 什么是SCCP认证?POPS测试是什么?POPS-SCCP如何测试
  20. 信修修:安全省心!U盘安装纯净原版Win10系统教程!

热门文章

  1. ASP.NET MVC Model元数据(五)
  2. 使用data uri将图片内嵌到html中
  3. 移动终端三分天下 何与争峰
  4. [原创]通过编写PowerDesigner脚本功能批量修改属性
  5. 编程珠玑第二章习题答案
  6. C++实现8皇后问题
  7. python图像变形
  8. 神经网络应该注意的重要问题
  9. eclipse下classes文件夹无法发布到tomcat的问题--tomcat发布慢的问题
  10. 创新的前端 豆瓣书评 摘录