实验二作业调度模拟程序

合集下载

作业调度算法-实验报告

作业调度算法-实验报告

作业调度算法-实验报告作业调度算法模拟一、课题内容和要求常见的作业调度算法有先来先服务算法、最短作业优先算法、响应比优先调度算法。

(1) 参考操作系统教材理解这3种算法。

(2) 实现这3个算法。

(3) 已知若干作业的到达时间和服务时间,用实现的算法计算对该组作业进行调度的平均周转时间Ttime和平均带权周转时间WTtime。

(4) 作业的到达时间和服务时间可以存放在文本文件record.txt中。

(5) 设计简单的交互界面,演示所设计的功能。

(可以使用MFC进行界面的设计) (6)可根据自己能力,在完成以上基本要求后,对程序功能进行适当扩充。

二、需求分析模拟实现作业调度算法,包括:FCFS(先来先服务算法)、SJF(短作业优先算法)、HRN(最高响应比优先算法)、HPF(基于优先数调度算法)。

先来先服务算法:按照各个作业进入系统(输入井)的自然次序来调度算法。

短作业优先算法:优先调度并处理短作业。

所谓的“短作业”并不是指物理作业长度短,而是指作业的运行时间短。

最高响应比优先算法:优先调度并处理响应比最高的作业。

三、概要设计函数中一些类:Time类 int hour 小时 int minute 分钟 Job 类 Int ID 作业编号 Time enter 进入时间 int requesttime 估计运行时间 intpriority 优先数 Time start Time end int Ttime double WTtime 开始时间结束时间周转时间带权周转时间Schedule类 int size Job *job int *r Int Differ() void HRN() 作业数作业数组排序用数组求时间差最高响应比优先 schedule() void readFile() void FCFS() void SJF() 构造函数从文件读信息先来先服务短作业优先主要功能函数的流程图 1、 EDIT1 平均带权周转时间 2、先来先服务:结束 EDIT2 平均周转时间 EDIT4 平均周转时间 EDIT5 平均带权周转时间EDIT6 平均周转时间 EDIT7 平均带权周转时间 OnButton1() FCFS OnButton2() SJF 开始 readFile()给变量赋值 OnButton3() HRN 开始感谢您的阅读,祝您生活愉快。

二进程同步算法模拟

二进程同步算法模拟

实验二进程同步算法模拟一、实验目的1、模拟设计一种进程调度过程:FCFS、短作业优先、高响应比优先(任选其一)。

2、算法代码实现,模拟数据演示,模拟结果验证。

二、实验学时4课时三、实验环境与平台Windows 2000, C/C++程序开发集成环境(开发语言可自选)四、实验内容及要求1、实验内容:(1)自定义PCB的数据结构;(2)针对资源分配中出现的问题,选择适合的算法,实现资源的合理分配。

2、实验要求:(1)完成规定的实验内容;(2)在实验之前,利用课外时间浏览帮助文件的相关主题内容;(3)实验时保存程序代码;(4)写出实验报告.(实验目的、实验时间、实验设备和实验环境平台、完成的实验内容、实验结果和结论)。

五、完成的实验内容下例是用C语言编写,用TC2.0调试结果六、实现代码如下:#include "stdio.h"#define getjcb(type) (type*)malloc(sizeof(type))#define NULL 0int n=0,time=0;float eti,ewi;struct jcb{ char name[10]; /* 作业名 */char state; /* 作业状态 */int ts; /* 提交时间 */float super; /* 优先权 */int tb; /* 开始运行时间 */int tc; /* 完成时间 */float ti; /* 周转时间 */float wi; /* 带权周转时间 */int ntime; /* 作业所需运行时间 */ char resource[10]; /* 所需资源 */struct jcb *link; /* 结构体指针 */} *p,*q,*head=NULL;typedef struct jcb JCB;inital(){int i;printf("\nInput jcb num\n");scanf("%d",&n);printf("Input\nname\tts\tntime\tresource\n");for(i=0;i<n;i++){p=getjcb(JCB);scanf("%s\t%d\t%d\t%s",&p->name,&p->ts,&p->ntime,&p->resou rce);p->state='W';p->link=NULL;if(head==NULL) head=q=p;else{ q->link=p; q=p; }}}fileinput(){FILE *fp;int i;if((fp=fopen("os2.txt","r"))==NULL) printf(" open error!") ; fscanf(fp,"%d\n",&n);for(i=0;i<n;i++){p=getjcb(JCB);fscanf(fp,"%s%d%d%s",&p->name,&p->ts,&p->ntime,&p->resource );p->state='W';p->link=NULL;if(head==NULL) head=q=p;else{q->link=p;q=p;}} fclose(fp);}void print(JCB *pr,int m){JCB *p;printf("\ntime=%d",time);if(m==3){printf("\nname\tstate\tts\tntime\tsuper\tsource\ttb\ttc\tti\twi\n");printf("%s\t%c\t%d\t%d\t%4.2f\t%s\t%d\t%d\t%4.2f\t%4.2f\n",pr->name,pr->state,pr->ts,pr->ntime,pr->super,pr->resource,pr->tb,pr->tc,pr->ti,pr->wi);} else {printf("\nname\tstate\tts\tntime\tsource\ttb\ttc\tti\twi\n"); printf("%s\t%c\t%d\t%d\t%s\t%d\t%d\t%4.2f\t%4.2f\n", pr->name,pr->state,pr->ts,pr->ntime,pr->resource,pr->tb,pr->tc,pr->ti,pr->wi); }p=head;do{ if(p->state=='W')if(m==3){printf("%s\t%c\t%d\t%d\t%4.2f\t%s\n",p->name,p->state,p->ts,p->ntime,p->super,p->resource);}else{printf("%s\t%c\t%d\t%d\t%s\n",p->name,p->state,p->ts,p->ntime,p->resource);}p=p->link;}while(p!=NULL);p=head;do{if(p->state=='F')if(m==3){printf("%s\t%c\t%d\t%d\t%4.2f\t%s\t%d\t%d\t%4.2f\t%4.2f\n",p->name,p->state,p->ts,p->ntime,p->super,p->resource,p->tb, p->tc,p->ti,p->wi);}else{printf("%s\t%c\t%d\t%d\t%s\t%d\t%d\t%4.2f\t%4.2f\n",p->name,p->state,p->ts,p->ntime,p->resource,p->tb,p->tc,p-> ti,p->wi);}p=p->link;}while(p!=NULL);}void last(){eti/=n;ewi/=n;printf("\neti=%7.3f\tewi=%7.3f\n",eti,ewi);}super(){JCB *padv;padv=head;do{if(padv->state=='W'&&padv->ts<=time)padv->super=(float)(time-padv->ts+padv->ntime)/padv->ntime; padv=padv->link;}while(padv!=NULL);}void hrn(m){JCB *min;int i,iden;for(i=0;i<n;i++){p=min=head;iden=1;super();do{if(p->state=='W'&&p->ts<=time)if(iden){min=p;iden=0;}else if(p->super>min->super) min=p;p=p->link;}while(p!=NULL);if(iden) {i--;time++;printf("\ntime=%d:\tno JCB submib...wait...",time);if(time>1000){printf("\nruntime is too long...error...");getch();}}else{running(min,m);}}}void sjf(int m){JCB *min;int i,iden;for(i=0;i<n;i++){p=min=head;iden=1;do{if(p->state=='W'&&p->ts<=time)if(iden){min=p;iden=0;}else if(p->ntime<min->ntime) min=p;p=p->link;}while(p!=NULL) ;if(iden) {i--;printf("\ntime=%d:\tno JCB submib...wait...",time);time++;if(time>100){printf("\nruntime is too long...error");getch();}}else{running(min,m);}}}fcfs(int m){int i,iden;printf("\n\nthe jcb is runing...");for(i=0;i<n;i++){p=head;iden=1;do{if(p->state=='W'&&p->ts<=time) iden=0;if(iden)p=p->link;}while(p!=NULL&&iden) ;if(iden) {i--;printf("\ntime=%d:\tno JCB submib...wait...",time);time++;if(time>100){printf("\nruntime is too long...error");getch();}}else{running(p,m);}}}running(JCB *p,int m){p->tb=time;p->state='R';p->tc=p->tb+p->ntime;p->ti=(float)(p->tc-p->ts);p->wi=(float)(p->ti/p->ntime);eti+=p->ti;ewi+=p->wi;print(p,m);time+=p->ntime;p->state='F';printf("\n%s has been finished!\npress any key to continue...\n",p->name);getch();}void runjcb(int m){printf("\n\nstart running jcb...");switch(m){case 1:fcfs(m);break;case 2:sjf(m);break;case 3:hrn(m);break;default:printf("\nrunjcb error...\n");exit();}}fileway(){printf("\nadopts the file way to input the datas...y/n:") ; if(getch()=='y') fileinput();else inital();}start(){int m;char str[100]="\nselect algorithm\n1.FCFS\n2.SJF\n3.HRN\n" ;printf("%s",str);m=getch()-48;fileway();if(1<=m&&m<=3) runjcb(m);else {printf("\nselect error!try again...\n");start();}last();}main(){start();printf("\nfinished!");getch();}六、实验结果七、结论分析本例依次实现了FCFS,SJF,HRN算法,我只对SJF算法即短作业优先调度算法进行了实验按要求输入数据,如上图所示,即:进程个数(jcd num):5执行后,输出周转时间ti、带权周转时间wi,而且是逐次运行。

作业调度实验报告

作业调度实验报告

一、根据调度算法设计流程图:实验
步骤
}
}
}
三、整合完成所有程序并实现作业调度(见源代码)。

四、进行调试阶段,对程序修改优化,进行数据测试。

五、实验结果分析
六、总结
实验
WindowsXP和CV++6.0集成开发环境
环境
实验运行的初始界面:
实验结
果与分

测试数据:
a1 1 2 a1
a2 2 3 a2
运行结果:
进行多次循环录入:返回算法选择界面:
测试数据:
b1 2 4 b1
b2 1 3 b2
运行结果:
实验分析和总结:
1)测试的数据必须是符合JCB模块中相同类型的,如在源码中式int类型的,而在测试的时候输入float类型就出错。

2)各个库函数的运用需要掌握相应的功能,否则会照成代码冗余、繁杂、不优化等各种问题。

3)通常在dos下运用的都是英文,而想要用汉字提示就必须考虑一些问题。

在源码中我们用制表符(\t)来控制提示,输出的数字是不能与之对齐的,所以我们要将“\t”改成空格。

4)这编写和调试程序时,为了尽快调通程序应该按照流程图的结构(保证流程图思路是对的情况下)来建立编程思路。

5)此程序也借用了现有的一些代码,并且它还不是最优化的,它还可以进行改进和优化,比如:在回调函数的引用时跳到了另一个页面,见下图:
继续Enter的时候就到下一页:
而不是在同一页面。

6)总之,在编程旅途中是一个很艰辛的过程,要在这里开拓一片蓝天就必须有孜孜不倦的精神。

操作系统原理实验指导

操作系统原理实验指导
(3)计算页面命中率程序流程图
3、实验题
(1)设计一个内存分配模拟程序。假定在计算机系统作业后备队列中有六个等待调度运行的作业,参与分配的内存大小为32KB,采用简单页式管理,每个页帧的大小为1KB。根据要求进行内存的分配和回收。要求打印内存分配表。有关作业的组织和作业有关参数的设置请自行设计,要大致符合实际情况。
main()
{
int i;
if (fork())
{
i=wait();
printf(“It is parent process.\n”);
printf(“The child process, ID number %d, is finished.\n”,i);
}
else{
print(“It is child process.\n”);
(2)自选设计一个进程调度算法,并加以实现。
实验三存储器管理
1、目的与要求
目的:存储器管理是操作系统重要的组成部分,提高存储器的效率始终是操作系统研究的重要课题之一。虚拟存储技术是用来扩大存储容量的一种重要方法。学生应独立地使用一种开发工具或高级语言编写几个常用的存储分配算法,并能设计一个存储管理的模拟程序,对各种算法进行分析比较,评测其性能优劣,从而加深对这些算法的理解,巩固所学的知识。
操作系统实验指导
操作系统是计算机的最重要的系统软件,它在计算机中具有核心地位,其作用是对计算机系统资源进行统一的调度和管理,提供各种强有力的系统服务,为用户创造灵活而又方便的使用环境。一个精心设计的操作系统能极大地扩充计算机系统的功能,充分地发挥系统中各种资源的使用效率,提高系统工作的可靠性。
操作系统原理是计算机科学与技术专业的一门主要专业课程,它涉及计算机系统中各种软、硬资源管理的实现原理与方法,内容非常丰富,综合性非常强,并且还具有很强的实践性。只有把理论与实践紧密地结合起来,才能取得较好地学习效果。

操作系统实验之处理机调度实验报告

操作系统实验之处理机调度实验报告

操作系统实验之处理机调度实验报告一、实验目的处理机调度是操作系统中的核心功能之一,本次实验的主要目的是通过模拟不同的处理机调度算法,深入理解操作系统对处理机资源的分配和管理策略,比较不同调度算法的性能差异,并观察它们在不同负载情况下的表现。

二、实验环境本次实验使用的操作系统为 Windows 10,编程语言为 Python 38。

实验中使用了 Python 的相关库,如`numpy`、`matplotlib`等,用于数据生成、计算和图形绘制。

三、实验原理1、先来先服务(FCFS)调度算法先来先服务算法按照作业到达的先后顺序进行调度。

先到达的作业先被服务,直到完成或阻塞,然后再处理下一个到达的作业。

2、短作业优先(SJF)调度算法短作业优先算法选择预计运行时间最短的作业先执行。

这种算法可以有效地减少作业的平均等待时间,但可能导致长作业长时间等待。

3、时间片轮转(RR)调度算法时间片轮转算法将处理机的时间分成固定长度的时间片,每个作业轮流获得一个时间片的处理时间。

当时间片用完后,如果作业还未完成,则将其放入就绪队列的末尾等待下一轮调度。

4、优先级调度算法优先级调度算法为每个作业分配一个优先级,优先级高的作业先被执行。

优先级可以根据作业的性质、紧急程度等因素来确定。

四、实验内容与步骤1、数据生成首先,生成一组模拟的作业,包括作业的到达时间、预计运行时间和优先级等信息。

为了使实验结果更具代表性,生成了不同规模和特征的作业集合。

2、算法实现分别实现了先来先服务、短作业优先、时间片轮转和优先级调度这四种算法。

在实现过程中,严格按照算法的定义和规则进行处理机的分配和调度。

3、性能评估指标定义了以下性能评估指标来比较不同调度算法的效果:平均等待时间:作业在就绪队列中的等待时间的平均值。

平均周转时间:作业从到达系统到完成的时间间隔的平均值。

系统吞吐量:单位时间内完成的作业数量。

4、实验结果分析对每种调度算法进行多次实验,使用不同的作业集合,并记录相应的性能指标数据。

进程调度算法实验报告

进程调度算法实验报告

计算机操作系统实验报告实验二进程调度算法一、实验名称:进程调度算法二、实验内容:编程实现如下算法:1.先来先服务算法;2.短进程优先算法;3.时间片轮转调度算法。

三、问题分析与设计:1.先来先服务调度算法先来先服务调度算法是一种最简单的调度算法,该算法既可以用于作业调度,也可用于进程调度。

当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将他们调入内存,为它们分配资源、创建进程,然后放入就绪队列。

在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。

该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。

FCFS算法比较有利于长作业(进程),2.短作业(进程)优先调度算法短作业(进程)优先调度算法SJ(P)F,是指对短作业或短进程优先调度的算法。

它们可以分别用于作业调度和进程调度。

短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。

而短进程(SPF)调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机再重新调度。

SJ(P)F调度算法能有效地降低作业(进程)的平均等待时间,提高系统吞吐量。

该算法对长作业不利,完全未考虑作业的紧迫程度。

3.时间片轮转算法在时间片轮转算法中,系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。

当执行的时间片用完时,由一个计数器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。

这样就可以保证就绪队列中的所有进程在一给定的时间内均能获得一时间片的处理机执行时间。

换言之,系统能在给定的时间内响应所有用户的请求。

进程调度算法实验报告

操作系统实验报告(二)实验题目:进程调度算法实验环境:C++实验目的:编程模拟实现几种常见的进程调度算法,通过对几组进程分别使用不同的调度算法,计算进程的平均周转时间和平均带权周转时间,比较各种算法的性能优劣。

实验内容:编程实现如下算法:1.先来先服务算法;2.短进程优先算法;3.时间片轮转调度算法。

设计分析:程序流程图:1.先来先服务算法2.短进程优先算法3.时间片轮转调度算法实验代码:1.先来先服务算法#include <iostream.h>#define n 20typedef struct{int id; //进程名int atime; //进程到达时间int runtime; //进程运行时间}fcs;void main(){int amount,i,j,diao,huan;fcs f[n];cout<<"请输入进程个数:"<<endl;cin>>amount;for(i=0;i<amount;i++){cout<<"请输入进程名,进程到达时间,进程运行时间:"<<endl; cin>>f[i].id;cin>>f[i].atime;cin>>f[i].runtime;}for(i=0;i<amount;i++) //按进程到达时间的先后排序{ //如果两个进程同时到达,按在屏幕先输入的先运行for(j=0;j<amount-i-1;j++){ if(f[j].atime>f[j+1].atime){diao=f[j].atime;f[j].atime=f[j+1].atime;f[j+1].atime=diao;huan=f[j].id;f[j].id=f[j+1].id;f[j+1].id=huan;}}}for(i=0;i<amount;i++){cout<<"进程:"<<f[i].id<<"从"<<f[i].atime<<"开始"<<","<<"在"<<f[i].atime+f[i].runtime<<"之前结束。

进程调度模拟设计.时间片轮转、优先级法

学号:课程设计进程调度模拟设计——题目时间片轮转、优先级法学院计算机科学与技术学院专业班级姓名指导教师吴利君2013 年 1 月16 日课程设计任务书学生姓名:指导教师:吴利君工作单位:计算机科学与技术学院题目: 进程调度模拟设计——时间片轮转、优先级法初始条件:1.预备内容:阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有深入的理解。

2.实践准备:掌握一种计算机高级语言的使用。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.模拟进程调度,能够处理以下的情形:⑴能够选择不同的调度算法(要求中给出的调度算法);⑵能够输入进程的基本信息,如进程名、优先级、到达时间和运行时间等;⑶根据选择的调度算法显示进程调度队列;⑷根据选择的调度算法计算平均周转时间和平均带权周转时间。

2.设计报告内容应说明:⑴需求分析;⑵功能设计(数据结构及模块说明);⑶开发平台及源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他方法(如果有,简要说明该方法);时间安排:设计安排一周:周1、周2:完成程序分析及设计。

周2、周3:完成程序调试及测试。

周4、周5:验收、撰写课程设计报告。

(注意事项:严禁抄袭,一旦发现,一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日进程调度模拟设计——时间片轮转、优先级法一、需求分析无论是批处理系统、分时系统还是实时系统,用户进程数目一般都多余处理机数,这将直接导致用户进程相互争夺处理机。

另外,系统进程也同样需要使用处理机。

进程调度虽然是系统内部的低级调度,但进程调度算法的优劣直接影响作业调度的性能,因此一个好的调度策略对处理机的处理速度是至关重要的。

模拟调度实验报告(3篇)

第1篇一、实验背景进程调度是操作系统核心功能之一,它负责在多道程序环境下,按照一定的策略对进程进行调度,以确保系统资源的合理分配和高效利用。

为了加深对进程调度算法的理解,本次实验采用模拟的方式,实现了先来先服务(FCFS)、时间片轮转(RR)和动态优先级调度(DP)三种算法,并对实验过程进行了详细记录和分析。

二、实验目的1. 理解进程调度的基本原理和不同调度算法的特点。

2. 掌握进程控制块(PCB)的设计与实现。

3. 通过模拟实验,验证三种调度算法的执行效果。

三、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 2019四、实验内容1. 定义进程控制块(PCB)进程控制块是操作系统用于描述和管理进程的实体,它包含了进程的基本信息。

本实验中,PCB包含以下字段:- 进程ID:唯一标识一个进程。

- 到达时间:进程进入就绪队列的时间。

- 需要运行时间:进程完成所需的时间。

- 已运行时间:进程已运行的时间。

- 状态:进程当前的状态(就绪、运行、阻塞、完成)。

2. 实现三种调度算法(1)先来先服务(FCFS)算法FCFS算法按照进程到达就绪队列的顺序进行调度,先到先服务。

具体实现如下:- 将进程按照到达时间排序,形成就绪队列。

- 遍历就绪队列,依次执行进程,直到进程完成或被阻塞。

(2)时间片轮转(RR)算法RR算法将CPU时间划分为时间片,每个进程运行一个时间片后,让出CPU,等待下一个时间片。

具体实现如下:- 设置一个时间片大小。

- 将进程按照到达时间排序,形成就绪队列。

- 遍历就绪队列,每个进程执行一个时间片,如果进程未完成,则将其加入就绪队列队尾。

(3)动态优先级调度(DP)算法DP算法根据进程的优先级进行调度,优先级高的进程优先执行。

具体实现如下:- 设置一个优先级阈值,当进程的优先级高于阈值时,将其加入就绪队列。

- 遍历就绪队列,选择优先级最高的进程执行,直到进程完成或被阻塞。

操作系统综合实验报告--作业调度算法模拟

for(int j=i+1;j〈n;j++)
{
if(p[j]。subtime<=p[i]。ftime)
k++;

doublemaxrratio=(p[i].ftime-p[i+1]。subtime)/(1。0*p[i+1]。runtime);
int ps=i+1;
for(int m=i+1;m<i+k;m++)
p[i].subtime=(p[i].subtime)/100*60+p[i]。subtime%100;
cout<〈”运行时间:";
cin〉>p[i]。runtime;
p[i]。runtime=(p[i]。runtime)/100*60+p[i].runtime%100;
cout〈〈”\n”;
}
}
void output(job*p,int n)
if(i==0)
p[i].ftime=p[i]。subtime+p[i].runtime;
else
p[i].ftime=p[i].runtime+p[i—1]。ftime;
for(int j=i+1;j〈n;j++)

if(p[j]。subtime<=p[i].ftime)
k++;
}
double minstime=p[i+1]。runtime;
p[i]。ftime=p[i—1]。ftime+p[i]。runtime;
/*这里要特别小心,刚开始没考虑到下一个的开始时间可能大于上一个
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验二 作业调度模拟程序 专业:08信息管理与信息系统 姓名:黄赞润 学号:200806054113

一、 实验目的

(1)加深对作业调度算法的理解; (2)进行程序设计的训练。 二、 实验内容和要求 用高级语言编写一个或多个作业调度的模拟程序。 单道批处理系统的作业调度程序。作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素。 作业调度算法:采用先来先服务(FCFS)调度算法,即按作业到达的先后次序进行调度。总是首先调度在系统中等待时间最长的作业。每个作业由一个作业控制块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. 完成报告书,内容完整,规格规范。

三、 实验方法、步骤及结果测试 1. 源程序名:压缩包文件(zip)中源程序名 run.c 可执行程序名:run.exe

2. 原理分析及流程图 程序主要为带指针的结构体存储 struct jcb { char name[10]; int artime;/*到达shijian*/ int rqtime;/*服务*/ int sttime;/*调度*/ int fntime;/*完成*/ float tat;/*周转*/ float taw;/*带权*/ float r;/*优先权*/ char statut;/*状态*/ struct jcb *link;/*结构体指针*/,调用相关功能的子函数,实现程序! 流程图: 开始

初始化所有作业, 并选择进行作业的方式。 时间为0

输入作业数, 作业到达时间等

时间time+1 未到达状态且

已到达?

switch选择作业方式 FSFC工作 SJF工作方式 HRN工作方式

1 2

3

排序,输出排序后工作顺序

按时间长短排序

状态到达 计算优先权值,并按值排序 状态到达

作业数不为0

否 void start()//输入作业数和选择作业方式,调用input和run子函数 void input()//子程序--输入作业数据 void run(int m)// 开始运算,通过for(i=0;i业数。判断到达且状态为未到达的作业。并把状态转为到达,然后通过switch对M进行判断选择,m=1调用fcfs,m=2为sjf,m=3调用hrn。

WN* fcfs(int m)// 对作业进行排序。返回指针*t WN* sjf(int m)/ /对作业要求时间进行由小到大排序,返回*min WN* hrn(int m) // 调用jisuanr,计算权值,然后对作业优先权值进行由小到大排序,返回*min

输出状态分别为’U’,’A’,’R’,’F’的作业。

输出全部完成作业,并计算带全周转时间和平均带权周转时间。

结束

计算调度时间 完成时间 周转时间 带权周转时间 Time=rqtime+time void jisuanr()// 计算作业优先权值。 running(WN *p,int m)// 将FCFS的*p或者SJF 和HRN的*min传递到running,然后进行A状态转换到R状态,计算调用时间等。 void print(int m)// 输出各状态作业。

void print2(WN *pr,int m)// 输出最后结果 void last()// 计算平均TAT 平均TAW main()// 主函数 { start();

last(); printf("\n结束\n"); getchar(); getchar(); }

算法实现: 存储结构为带指针的结构体, 关键函数:包括三种作业调度方式。与关于作业数的总循环。 主要算法实现:通过do{}while();函数做关于指针的遍历循环,通过子函数调用,实现程序逻辑。

3. 主要程序段及其解释: 首先通过struct jcb{ };定义带指针结构体,主函数只有main() { start();

last(); printf("结束"); }

其他由子函数相互调用实现。 通过 for(i=0;i通过 do{ if(p->statut=='u'&&p->artime<=time) {

p->statut='a'; p=p->link;

iden=0; } else p=p->link ; }while(p!=NULL); 对已经到达的作业进行从’U’(未到达)到’A’(到达)状态转化,其中iden为标记是否有作业到达,为1的话则表示无作业到达,执行 if(iden) { i--; time++; } 直到有作业到达,iden变为0

通过 switch(m) { case 1: p=fcfs(m);/*running*/ running(p,m); break; case 2: min=sjf(m);/*running*/ running(min,m); break; case 3: min=hrn(m);/*running*/ running(min,m); break; } 实现选择调度方式,并通过running子函数运行作业,其中min皆为由子函数调回的最短作业指针和最小权值指针。

通过void jisuanr()/*计算优先权值*/ { WN *s; s=head; do{ if(s->statut=='a')

s->r=(float)(time-s->artime+s->rqtime)/s->rqtime ; s=s->link ; }while(s!=NULL); }

通过running(WN *p,int m) 运行作业并计算 { p->sttime=time; p->statut='r'; /*a->r*/ p->fntime=p->sttime+p->rqtime; p->tat=(float)p->fntime-p->artime; p->taw=(float)p->tat/p->rqtime; atat=atat+p->tat; ataw=ataw+p->taw; print(p,m); p->statut='f'; /*r->f*/ time = p->rqtime+time; printf("按回车继续"); getch(); }

其中有A到R(运行中)和R到F(完成)的状态转化。 通过void print2(WN *pr,int m) { p = head;/*完成*/ printf("\n\n系统时间为=%d", time); printf("\n全部作业已经完成:\n"); do{ if(p->statut == 'f') {

if(m == 3){

printf("%s\t%d\t%d\t%d\t%d\t%4.2f\t%4.2f\t%f\n", p->name, p->artime , p->rqtime , p->sttime , p->fntime, p->tat, p->taw, p->r);

相关文档
最新文档