《2022年操作系统作业调度》由会员分享,可在线阅读,更多相关《2022年操作系统作业调度(7页珍藏版)》请在金锄头文库上搜索。
1、实验名称:作业调度实验实验类型 : 验证性实验学时:4 适用对象 : 信息与计算科学专业一、实验目的(黑体,小4 号字)模拟作业调度算法,学习作业在操作系统中的调度过程,加深对作业管理的理解。特别是作业调度的概念、作业调度与进程调度的区别。培养学生程序设计的方法和技巧,提高学生编制清晰、合理、可读性好的系统程序的能力,加深对操作系统课程的理解,拓宽学生的知识领域,锻炼学生的实践技能。二、实验要求(黑体,小4 号字)本实验模拟单处理器系统的作业调度,加深对作业调度算法的理解。用某种语言编写和调试一个作业调度的算法程序,有一些简单的界面,能够运行,仿真操作系统中作业调度的原理和过程。1、 在后备作
2、业队列中输入5 道作业各自需要的时间及存储空间。数据输入格式如下:作业编号作业名称提交时间运行时间存储空间开始时间完成时间等待时间1 JA 02:40 20 30 2 JB 02:50 30 15 3 JC 02:55 10 90 4 JD 03:00 24 10 5 JE 03:05 6 60 2、按先来先服务(FCFS)的原则进行调度,输出作业调度的顺序及各自的等待时间。3、按最短作业优先(SJF)的原则进行调度,输出作业调度的顺序及各自的等待时间。4、按最小作业(存储空间)优先的原则进行调度,输出作业调度顺序及各自的等待时间。5建立 3 个子函数对应3 种算法,在主函数中调用它们并按格式
3、输出相关信息;6按调度顺序输出作业,输出格式为:作业编号、作业名、提交时间、运行时间、存储空间、等待时间三、实验原理(黑体,小4 号字)作业调度算法和进程调度算法。其中作业调度算法主要有先来先服务法FCFS、短作业优先法SJF、最高响应比优先法HRN、定时轮转法和优先数法。在进程调度算法中主要介绍了先来先服务法 FCFS、轮转法RR、多级反馈轮转法和优先数法。需要指出的是:(1)在作业调度和进程调度中同时出现的算法,如FCFS、 RR、优先数法,其使用原理是基本相同的;(2)作业调度算法和进程调度算法应严格与存储管理中的“ 请求淘汰换页算法 ” 相区别,注意不要混淆。实验提示1、根据作业输入数
4、据,定义JCB 结构;struct JCB char JobNum2; char JobName8; ; 2、定义数据结构装载后备作业JCB JobArrayMaxNumber; 3、三种调度算法的设计名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 7 页 - - - - - - - - - 4、C+语言描述顺序建立文件: jcb.h;其中存放:最大作业数;定义数据结构JCB;三个作业调度函数;建立主函数,其中包含:#include #include” jcb.h”voi
5、d mian() JCB jobArrayMaxNumber; 数据输入;调用三种算法并输出调度结果; 四、实验所需仪器、设备、材料PC 机五、实验预习要求、实验条件、方法及步骤1)熟练掌握作业相关的基本概念。2)熟练掌握作业调度的有关算法。3)熟练掌握作业调度算法所需的数据结构和算法流程;4)熟练掌握某一门编程语言,如C、C或者Dephi 等 479 作业调度算法源代码#include stdio.h #include #include #define getpch(type) (type*)malloc(sizeof(type) /#define NULL 0 struct worktim
6、e float Tb; /作业运行时刻float Tc; /作业完成时刻float Ti; /周转时间float Wi; /带权周转时间;struct jcb /*定义作业控制块JCB */ char name10; /作业名float subtime; /作业提交时间float runtime; /作业所需的运行时间char resource; /所需资源float Rp; /后备作业响应比char state; /作业状态struct worktime wt; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 -
7、 - - - - - - 第 2 页,共 7 页 - - - - - - - - - struct jcb* link; /链指针 *jcb_ready=NULL,*j;typedef struct jcb JCB; float T=0;void sort() /* 建立对作业进行提交时间排列函数*/ JCB *first, *second; int insert=0; if(jcb_ready=NULL)|(j-subtime)subtime) /*作业提交时间最短的,插入队首 */ j-link=jcb_ready; jcb_ready=j; T=j-subtime; j-Rp=1; el
8、se /* 插入作业优先数最低,则插入到队尾*/ first=first-link; second=second-link; if (insert=0) first-link=j; void SJFget()/* 获取队列中的最短作业*/ JCB *front,*mintime,*rear; int ipmove=0; mintime=jcb_ready; rear=mintime-link; while(rear!=NULL)if (rear!=NULL)&(T=rear-subtime)&(mintime-runtime)(rear-runtime) front=mintime; mint
9、ime=rear; rear=rear-link; ipmove=1; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 7 页 - - - - - - - - - else rear=rear-link; if (ipmove=1) front-link=mintime-link; mintime-link=jcb_ready; jcb_ready=mintime; void HRNget() /* 获取队列中的最高响应作业*/ JCB *front,*mintime,*
10、rear; int ipmove=0; mintime=jcb_ready; rear=mintime-link; while(rear!=NULL) if (rear!=NULL)&(T=rear-subtime)&(mintime-Rp)Rp) front=mintime; mintime=rear; rear=rear-link; ipmove=1; else rear=rear-link; if (ipmove=1) front-link=mintime-link; mintime-link=jcb_ready; jcb_ready=mintime; void input() /* 建
11、立作业控制块函数*/ int i,num; printf(n 请输入作业数:?); scanf(%d,&num); for(i=0;iname); printf(n 输入作业提交时刻:); scanf(%f,&j-subtime); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 7 页 - - - - - - - - - printf(n 输入作业运行时间:); scanf(%f,&j-runtime); printf(n); j-state=w; j-link=NUL
12、L; sort(); /* 调用 sort 函数 */ int space() int l=0; JCB* jr=jcb_ready; while(jr!=NULL) l+; jr=jr-link; return(l); void disp(JCB* jr,int select) /* 建立作业显示函数,用于显示当前作业*/ if (select=3) printf(n 作业服务时间响应比运行时刻完成时刻周转时间带权周转时间n); else printf(n 作业服务时间运行时刻完成时刻周转时间带权周转时间n); printf( %st,jr-name); printf( %.2ft ,jr-
13、runtime); if (select=3) printf( |%.2f ,jr-Rp); if (j=jr) printf( %.2ft ,jr-wt.Tb); printf( %.2f ,jr-wt.Tc); printf( %.2f t ,jr-wt.Ti); printf( %.2f ,jr-wt.Wi); printf(n); void check(int select) /* 建立作业查看函数*/ JCB* jr; printf(n * 当前正在运行的作业是:%s,j-name); /*显示当前运行作业*/ disp(j,select); jr=jcb_ready; printf
14、(n * 当前就绪队列状态为:n); /*显示就绪队列状态*/ while(jr!=NULL) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 7 页 - - - - - - - - - jr-Rp=(T-jr-subtime)/jr-runtime; disp(jr,select); jr=jr-link; printf(n 作业%s 已完成 .n,j-name); free(j); void running(JCB* jr) /* 建立作业就绪函数(作业运行时间到,置
15、就绪状态 */ if (T=jr-subtime) jr-wt.Tb=T; else jr-wt.Tb=jr-subtime; jr-wt.Tc=jr-wt.Tb+jr-runtime; jr-wt.Ti=jr-wt.Tc-jr-subtime; jr-wt.Wi=jr-wt.Ti/jr-runtime; T=jr-wt.Tc; int main() /* 主函数 */ int select=0,len,h=0; float sumTi=0,sumWi=0; input(); len=space(); printf(nt1.FCFS 2.SJF 3.HRNnn 请选择作业调度算法:?); sc
16、anf(%d,&select); while(len!=0)&(jcb_ready!=NULL) h+; printf(n 执行第 %d 个作业n,h); j=jcb_ready; jcb_ready=j-link; j-link=NULL; j-state=R; running(j); sumTi+=j-wt.Ti; sumWi+=j-wt.Wi; check(select); if (select=2&hlen-1) SJFget(); if (select=3&hlen-1) HRNget(); printf(n 按任一键继续.n); getchar(); getchar(); prin
17、tf(nn 作业已经完成.n); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 7 页 - - - - - - - - - printf(t 此组作业的平均周转时间:%.2fn,sumTi/h); printf(t 此组作业的带权平均周转时间:%.2fn,sumWi/h); getchar(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 7 页 - - - - - - - - -