admin管理员组文章数量:1532644
2023年12月23日发(作者:)
计算机 学院 计算机科学与技术 专业 07班
姓名 ___ 学号—教师评定 _____________________
实验题目 __________________ 作业调度 ______________________
一、 实验目的
本实验要求学生模拟作业调度的实现, 用高级语言编写和调试一个或多个作业调度的模
拟程序,了解作业调度在操作系统中的作用,以加深对作业调度算法的理解。
二、 实验内容和要求
1、 为单道批处理系统设计一个作业调度程序
(1) 、编写并调试一个单道处理系统的作业调度模拟程序。
(2) 、作业调度算法:分别采用先来先服务( FCFS),最短作业优先(SJF)的调度算法。
(3) 、由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完
成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的
因素。
(4) 、每个作业由一个作业控制块 JCB表示,JCB可以包含如下信息:作业名、提交时间、
所需的运行时间、所需的资源、作业状态、链指针等等。作业的状态可以是等待
运行R(Run)和完成F(Finish)三种状态之一。每个作业的最初状态总是等待
及这组作业的平均周转时间及带权平均周转时间,并比较各种算法的优缺点。
2、 模拟批处理多道操作系统的作业调度
(1) 写并调试一个作业调度模拟程序。
(2)
法。
(3 )在批处理系统中,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个 作业的资源要求,所需要的资源是否得到满足。
作业调度程序负责从输入井选择若干个作业进入主存,为它们分配必要的资源,当它 们能够被进程调度选中时,就可占用处理机运行。作业调度选择一个作业的必要条件是系统 中现有的尚未分配的资源可满足该作业的资源要求。
可满足某个作业的要求也可满足其它一些作业要求,
统将收回该作业所占用的全部资源,
及作业输出结果。
三、 实验设计方案及原理
假设在单道批处理环境下有四个作业 JOB1、JOB2、JOB3、JOB4,已知它们进入系统
但有时系统中现有的尚未分配的资源既
那么,作业调度必须按一定的算法在这
作业调度算法:分别采用先来服务( FCFS)调度算W。
W(Wait)、
CPU时限等
(5) 、对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转 时间,以些作业中作出选择。当作业正常运行完毕或因发生错误非正常终止时,作业进入完成状态, 此时,系并清除有关的JCB。并输出显示作业运行情况
1
的时间、估计运行时间。分别采用先来先服务( FCFS),最短作业优先(SJF)调度算法, 计算出作业的平均周转时间和带权的平均周转时间 。 作业 p 的周转时间: p->ttime=p->ftime-p->atime
作业的平均周转时间: total= 全部进程的周转时间 /进程个数 作业 p 的带权周转时间: p->wtime
=p->ttime/p->ntime 作业的平均带权周转时间: W= 全部进程的带权周转时间 / 进程个数
1先来先服务调度算法(FCFS):每次调度都是从后备作业队列中,选择一个或多个最先
进入 该队列的作业,将它们调入内存, 为它们分配资源、创建进程, 然后放入就绪队列。 在进程调度中采用 FCFS算法时,这每次调度是从就绪队列中, 选择一个最先进入该队列的 进程, 为之分配处理机, 使之投入运行。 该进程一直运行到完成或发生某事件阻赛后, 才放 弃处理机。
2、 最短作业优先(SJF):每次从后备队列中选择一个或若干个估计运行时间最短的作业, 将它们调入内存运行。
对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间, 以及这组作业的平均周转时间及带权平均周转时间,并比较各种算法的优缺点。
3、 多道作业调度算法:将作业按 FCFS 原则排好队,在输入井中按作业到达的先后次序来 挑选作业, 先进入输入井的作业优先被挑选, 当系统中现有的尚未分配的资源不能满足先进 入输入井的作业时, 那么顺序挑选后面的作业, 把不能满足要求的放回输入井尾部等待, 当 作业执行结束进入完成状态时,做好释放资源等善后工作。
四、流程图
1 FCFS算法和SJF算法:2
计算并打印运行作业 P的完成时间ftime , 周转时间ttime ,带权周转时间 wtime
(ftime=btime+ntime;ttime=ftime-atime;wti
me=ttime/ntime )
更改时间量T的值(T=ftime)
继续执行该进
程
(p->rtime)++
撤销进程,指向下一进程
3
2.多道作业调度算法
五、给出程序中源程序名和执行程序名:
源程序名:FCFS and SJF,执行程序名:fcfs and 源程序名:DUODAO 执行程序名: 六、程序清单
和SJF算法
#include "stdio.h"
4
#include
#include
#define getpch(type) (type*)malloc(sizeof(type))
struct jcb{
char name[10];
char state;
int atime;// 作业到达时间
int btime;// 作业开始运行时间
int ftime;// 作业完成时间
int ntime;// 作业估计运行时间
int rtime;// 作业执行时间
int ttime;// 周转时间
float wtime;// 带权周转时间 (周转时间 /估计运行时间)
struct jcb* link;
}*ready=NULL, *p;//ready 指向队头, p 指向正被调度的作业
typedef struct jcb JCB;
int T=0; // 初始化时间量
float total;// 记录所有作业的总时间
double weight;// 记录所有作业的带权周转时间
void sort() /* 建立对作业进行到达时间排列函数 */
{
JCB *first, *second;
int insert=0;
if((ready==NULL)||((p->atime)<(ready->atime))) /* 作业到达时间最短的 ,插入队首 */
{
p->link=ready;
ready=p;
T=p->atime; // 更改时间量
}
else /* 作业比较到达时间 ,插入适当的位置中 */
{
first=ready; second=first->link; while(second!=NULL)
{
if((p->atime)<(second->atime)) /* 若插入作业比当前队尾作业到达时间短 ,*/ { /* 插入到当前队尾作业前面 */
p->link=second; first->link=p;
second=NULL;
insert=1;
}
else /* 插入作业到达时间最长 ,则插入到队尾 */
{
first=first->link; second=second->link;
}
}
5
if (insert==0) first->link=p;
}
}
void shortjob() // 获取队列中的最短作业
{
JCB *pr,*min,*qr;
min=ready;//min 指向作业对头
qr=ready;
pr=ready->link;
while(pr!=NULL)
{
if((pr!=NULL)&&(T>=pr->atime)&&(pr->ntime)<(min->ntime))
{//当插入作业到达时间要比时间量
pr=pr->link;
}
T 小
min=pr; //min 指向 pr qr->link=pr->link;//qr 的下一个指向 pr 的下一个 pr->link=ready;
else //当 pr 的需要时间不小于 min 的需要时间
{ qr=pr;
pr=pr->link;}
ready=min;〃把最终获取的 min的需要时间赋给ready,开始执行
}
}
void input() /* 建立作业控制块函数 */
{
int i;
printf("n 请输入 4 个作业: ");
for(i = 0; i < 4; i++)
{
printf("n 请输入作业号 NO.%d : n",i);
p = getpch(JCB); printf(" 输入作业名: ");
scanf("%s",p->name); printf("n 输入作业到达时间: "); scanf("%d",&p->atime); printf("n 输入作业运行时间: "); scanf("%d",&p->ntime); printf("n"); p->rtime = 0; p->btime=0; p->ftime=0;
p->ttime=0; p->wtime=0; p->state = 'W'; p->link = NULL; sort();
}
}
int space() /* 查看作业个数 */
{
int l = 0;
JCB *pr = ready;
while(pr != NULL)
{
l++;
pr = pr->link;
}
return(l);
}
6
void disp(JCB *pr) /* 建立作业显示函数,用于显示当前作业
{
*/
printf("n qname t state t atime t ntime t btime t rtime t ftime t ttime t wtime n"); printf(" |%s
t",pr->name);
printf(" |%c t",pr->state);
printf(" |%d t",pr->atime);
printf(" |%d t",pr->ntime);
printf(" |%d t",pr->btime);
printf(" |%d t",pr->rtime);
printf(" |%d t",pr->ftime);
printf(" |%d t",pr->ttime);
printf(" |%.2f t",pr->wtime); printf("n");
}
void check() /* 建立作业查看函数 */
{
JCB* pr;
printf("n **** 当前正在运行的作业是 :%s",p->name); /* 显示当前运行作业 */ disp(p);
pr=ready;
printf("n **** 当前就绪队列状态为 :n"); /* 显示就绪队列状态 */ while(pr!=NULL)
{
disp(pr); pr=pr->link;
}
}
void destroy()
{
printf("n 作业 [%s] 已完成。 n",p->name);
free(p);
}
void running(JCB *pr) // 计算各个时间
{
if(T>=pr->atime) pr->btime=T;// 插入作业的到达时间比时间量小, T 为该作业的开始时间 else
pr->btime=pr->atime;// 否则该作业到达时间为它的开始时间 pr->ftime=pr->btime+pr->ntime;
pr->ttime=p->ftime-p->atime; pr->wtime=(float)pr->ttime/(float)pr->ntime;
total+=pr->ttime;
weight+=pr->wtime;
T=pr->ftime;//T 为该上一个作业的完成时间
}
void running1(JCB *pr) //分离出要执行的当前作业
{
if(T>=pr->atime) pr->btime=T;
else pr->btime=pr->atime;
}
void running2(JCB *pr) // 判断运行时间和需要运行时间的关系
{
while(pr->rtime
{
7
pr->state = 'R';
(pr->rtime)=(pr->ntime);
8
}
printf("nn **** 该作业执行完毕时的状态: n"); pr->state='F';
disp(pr);
destroy();
}
int main()
int i,len, h = 0; char ch; total=0;
weight=0;
printf(
printf("
n");
printf(” FCFS算法或SJF算法
printf(
H********************************************************
input();
len = space();
printf("n 选择算法 : ");
scanf("%d",&i);
switch(i)
case 1:
printf("FCFS 算法: n");break;
case 2:
printf("SJF 算法: n");break;
default:printf("FAULSE");
}
if(i==1||i==2)
{
while((len != 0) && (ready != NULL))
{
ch = getchar();
if(i==2) shortjob();
h++;
printf("n The execute number:%dn",h);
p = ready; /* 将队首指针赋给 p*/
ready = p->link; /*ready 指向原 p 的下一个进程 */
p->link = NULL; /*p 的 link 赋空*/ p->state = 'R';
p->btime=p->atime;
running1(p);
check();
9
n");
running(p);
running2(p);
printf("n 按任一键继续 ..."); ch
= getchar();
}
printf("nn 作业已完成。 n");
ch = getchar();
printf("n
****************************************************
**n");
printf("n 平均周转时间: %f",total/(float)4);
printf("n 平均带权周转时间: %lf",weight/(float)4);
printf("n
****************************************************
**n");
}
2.多道作业调度算法: #include "stdio.h" #include
#include
#define getpch(type) (type*)malloc(sizeof(type))
#define source 15 struct jcb{
char username[10];
char jobname[10];
char state;
int atime;// 作业到达时间
int ntime;// 作业估计运行时间
int rtime; // 作业的运行时间
int nsource;// 作业所需系统资源
int asource;// 已分配的资源
int need1;
struct jcb* link;
}*ready=NULL, *p;//ready 指向就绪队列的队头, p 指向正被调度的作业 typedef struct jcb JCB;
int rsource=15;// 剩下资源
int num,i=0;//num 为作业个数, i 为记录不能满足作业要求调度的次数 void destroy(JCB *pr)
{
free(pr);
}
void sort() /* 建立对作业进行到达时间排列函数 */
{
JCB *first, *second;
int insert=0; if((p->nsource<=source)&&(rsource>=0)&&(p->nsource>p->asource))
{// 需要资源要在系统资源范围内, 分配资源要在需要资源范围内,剩下资源不能小于 0
if((ready==NULL)||((p->atime)<(ready->atime))) /* 作业到达时间最短的 ,插入队首 */
{
p->link=ready; ready=p;
}
else /* 作业比较到达时间 ,插入适当的位置中 */
{
first=ready; second=first->link; while(second!=NULL)
{
if((p->atime)<(second->atime)) /* 若插入作业比当前队尾作业到达时间短 ,*/ { /* 插入到当10
前队尾作业前面 */ p->link=second; first->link=p;
second=NULL; insert=1;
}
else /* 插入作业到达时间最长 ,则插入到队尾 */
{
first=first->link; second=second->link;
}
}
if (insert==0) first->link=p;
}
}
else destroy(p);
}
void sort1() /* 对作业进行排列函数 */
{
JCB *first;
if(ready==NULL) /* 如果就绪队列为空 */
{
ready=p; /* 将新建作业放入队列中,将 ready 指向队首作业 */
}
else /*队列中有作业在等待,将新建作业插入到队尾 */
first=ready; /*first 指针指向队首作业 */
while(first->link!=NULL) first=first->link; /*
first->link=p;/* 将 p 指向的作业插入队尾 */
}
}
当 first 指针没有指向队尾时,指针后移 */
void input() /* 建立作业控制块函数 */
{
int i;
printf("n 请输入作业个数 :");
scanf("%d",&num);
for(i=0;i { printf("n 请输入作业号 NO.%d : n",i); p = getpch(JCB); printf(" 输入作业用户名 :"); scanf("%s",p->username); printf("n 输入作业名 :"); scanf("%s",p->jobname); printf("n 输入作业到达时间 :"); scanf("%d",&p->atime); printf("n 输入作业运行时间 :"); scanf("%d",&p->ntime); printf("n 输入作业所需资源 :"); scanf("%d",&p->nsource); printf("n 输入作业已分配资源 :"); scanf("%d",&p->asource); printf("n"); p->need1=p->nsource-p->asource;// 还需要资源 =需要资源 -已分配资源 p->state='W'; p->link=NULL; sort(); } } 11 int space() /* 查看作业个数 */ { int l=0; JCB *pr=ready; while(pr!=NULL) { l++; pr=pr->link; return(l); } void disp(JCB *pr) /* 建立作业显示函数,用于显示当前作业 */ { printf("n 用户 N t 作业 N t 状态 S t 到达 T t 服务 T t 所需 S t 已分 S t 还需 S n"); printf(" |%s t",pr->username); printf(" |%s t",pr->jobname); printf(" |%c t",pr->state); printf(" |%d t",pr->atime); printf(" |%d t",pr->ntime); printf(" |%d t",pr->nsource); printf(" |%d t",pr->asource); printf(" |%d t",pr->need1); printf("n"); } void check() { JCB *pr; printf("n**** 当前正在运行的作业是: %s",p->jobname); disp(p); pr=ready; printf("n**** 当前输入井队列状态为: n"); /* 显示就绪队列状态 */ while(pr != NULL) { disp(pr); pr = pr->link; } } void running(JCB *p)// 对输入井队列中满足资源要求的作业进行服务 { while(p->rtime { (p->rtime)++; } p->state='F'; printf("n**** 作业运行完成后状态 :n"); disp(p); printf("n 用户名 [%s] 的作业 [%s] 已完成。 n",p->username,p->jobname); } 12 void running1()// 计算剩下资源 13 { JCB *pr; for(pr=ready;pr!=NULL;pr=pr->link) {rsource=rsource-pr->asource;} } void running2(JCB *pr) { if(pr->need1<=rsource) { check(); rsource-=pr->need1; pr->asource+=pr->need1; pr->need1 =0; printf("t* ****************************************** printf("n 分配给作业后所剩的资源是: %d n",rsource); running(pr); rsource = rsource + pr->nsource; printf("n 释放后的资源是: %dn",rsource); destroy(pr); } else { printf(" 该作业不能满足要求,调度下一个作业 "); sort1(); i++; } } void main() { int len, h=0;//h 表示执行的次数 int flag=0;// 用来记录排在前面却没被调用的作业个数 char ch; printf( "******************************************************** printf("n"); printf(" 多道作业调度算法 printf( "******************************************************** input(); len = space(); running1(); if(rsource>=0) while((i<=2*num)&&(len!=0)&&(ready!=NULL)) 14 n"); { ch=getchar(); h++; prin tf("The execue nu mber:%dn",h); printf("n系统可分配资源是:%d",rsource); ch=getchar(); p=ready; ready=ready->li nk; p->li nk=NULL; p->state ='R'; runnin g2(p); printf("n 按任一键继续..."); ch=getchar(); } if(i>2) { prin tf("n****** 剩下系统资源不能满足作业需要要求了 n ”); printf("n****** 退出程序"); } else printf("n 作业已完成 n"); ch=getchar(); } else prin tf("nn****因为输入已分配的资源与系统资源不符合错误,所以退出程序 } 七、运行结果 E#[厂4. 皐入作业到达时间:3 输入作业运彳亍命入作业到达时间;2 输入作业运行时间:12 NO 4: 输入作业到达时间:6输人作业运顾2 输入作业运行时间:is15 ); 1. FCFS算法 絲爨: 1Tlie execute ruuwnhei*-1 一*当前正在运行的作业是述 qname :C stAte !R at ime 12 nt ime :12 bt ime 2 i*t ime :0 f time :0 ttime 16 wt ime :0.S0 ****当刖就绪队列状态为= qname ;A qnane ID qname ;B state !U state IU State IW at i(ne :3 at ine :5 at ine :6 nt ime !9 nt ine 118 nt ime bt ime IB bt ime 10 bt iite !0 rt ine ftime 10 Ftine !0 ft ine ;Q vt ine :0 t*t ime :0 tt ime IB ttime 10 11 Ime :0 wt ine : wt ine ut ine !2 :0 —作业执行完毕时的羽 qnane !C state IF at ine :2 窓 nt ine M2 bt ime 12 rt ine :12 Ftime M4 ttime 112 wt ine :1.00 作业[小已完成■ 按「犍继续… The execute number:2 ****当前正在运行的作业是叩 Qname IA state :B at ine :3 nt ime !9 he ime !14 rt ime :0 Ft ime :0 ttime :0 ut ine :0.00 ***-当前就绪队列状态为= qname !D qname :B state ;U state IU at ine :5 at irte :6 nt ime !18 nt ine :2 he ime !0 ht inc :0 rt ime !3 rt ime :0 £ ci」汨 :0 f tine :0 tt ime :0 ttime :0 ut ime !0.00 ut ime :0.00 **该作业执行完毕时的状态, qname state IF at ine :3 nt ine !9 ht ime !14 i't i(ne :9 f tine S23 tt ime :20 i/t ime :2_22 作业5】已完成。 按任一键继续… 16 The exectiite nULinbei*-3 ****当前正在运行的作业是汕 qname iD state :R at iiw :5 ntine IIS bt ime :23 ime 16 f time i@ tt ine :0 ut ime ****当刖就绪队列狀态为: qnane !B state :W at iroe :& nt i»e 12 bt IRE :B l*t ine 10 ft ime 10 tt IRE :0 ut in^ j该作业执行完毕时的状态, qnane !D state :P dtime ntine btine :23 i-t ime 汚 :18 !1S f time :41 tt ine :2& ut ine !2.m 作业[D】己完成* 按任一键继续 The execute number:4 IB state ;R — 当前正在运行的作业是油 qnaneatine 16 ntine :2 bt ine Hl r-tine IQ Ft ime ;0 ttine 10 wt ine :0.00 f当前就绪队列状态为: —该作业执行完毕时的状态= qpname :B sta.t:e SF atine :6 nt ime :2 bt ine :41 rt ime ;2 ft ime ;43 11 ime S37 wt ime S18.50 作业【町已完成。 按任一键纟卓… 作业已完咸。 丄均肿萨时回i 26.250000 平均蒂权周转时间衣5.930556 ■ ■■■■耳■■■■■■*■*■*«・■■■■*■ *■”・ Press any key to continue MM M 算法 17 The execute number-1 当前正在运行的作业是汨 state :n at ime ;2 nt ine Cfnaine IC 112 bt ime ;2 vt ime :0 £time i0 tt ime :0 ut ime 10.00 5当前就绪队列状态为: !A qname !D qnaimie IB state ;V state atime :3 at iinc ntime :9 nt ine bt ine ;S bt ine !Q bt ime vtime :0 rt Ime :a rt ine !0 fcime ;0 ftime !0 f time :0 ttine :0 tt ime :Qi tt ime :0 utime : wt ime :B.00 wt inc 10.00 汚 state IV atine :G Jia nt ine 12 e 十该作业执行完毕时的状态’ qname !C state :F at ime :2 nt ine :12 bt ine 2 vt ime :1Z f timH tt ime :12 ut ime :1.Q0 作业[G已完成。 J按任一键继续… I TJic execute number ****当前正在运行的作业杲汨 qname IB state IB atime 16 nt ime 12 bt ime 11^ rt ime f time tt ime ;0 ;0 ;0 ut ine S0.00 I ****当刖就绪队列状态为= qnarte state :U state IW at ine :3 atime i5 ntine ;9 nt ime 118 btine rt ine Ftine tt ine 出 qname ID 10 bt ime 10 10 rt ime 10 f time 10 tt ime wt ine I0.0B ut ime S0.00 10 10 10 i该作业执行完毕时的状态: qnapie :B state !F at ine !& ntin& btine :14 rtinc 12 12 Ftine !16 ttime !10 wt in»e :5-B0 作业B】已完成。 援任一键继续…- J ________________________________ 18 The execute nunber:3 ****当前正在运行的作业是泪 qnaine :A state SR at line f)t idle !9 ht IRC !16 pt ine !0 f time :0 tt ine !0 !0.0B :3 ****当前就緒队列状态为= qnane 1state ;■ 冷 atine :5 ntine :18 bt ine !0 rt ine :0 f tine :8 tt ine !0 ut ine —该作业执行完毕时的状态; qnaine IA state :F at inc ntime bt ifibe 116 :3 :9 rt ime !9 f tine :25 tt ime 122 wt ime 12:. 44 作业【肋已完成。 瞇续… The execute number:4 卄*当前正在运行的作业是沙 qnane :D state iR atine ntine :5 :18 bt ifie :25 rt ime :0 f time :ttlne :0 wt ifite :0.00 ****当前就绪队列状态为= ****该作业执行芫毕时的状态’ qnane :D state !F at ine :& ntine :1S ht ine :2S 作业[D]已完成■& 按任一键^续•… 作业已完成. rt ine :1S f time :43 ttine :38 wt ime •[匸” 平妁带不 i20.500000 ;2-638889 HHKKXXXHHHHXK 耳耳梵MiXHXXMiKiKiKiKMiNJtKBOtJOOOOOf Press any key to continue 3•多道作业调度算法 19 1请输入作业个数注 输入作业名“ 输入作业到达时间唸 输入作业运行时间詔 输入作业所需资源 输入作业名址 输入作业到达时间注 输入作业运行时间話 输入作业所需资源洛 输入作业已分配竇源£ 1输入作业已分配资源訶 1隸作盍用召名;B‘ 输入作业名汰 输入作业名=1 输入作业到达时间浦 输入作业运行时间汚 1输入作业到达时间柑 输入作业运行时间汚 输入作业所需资源汚 输入作业所需资源認 输入作业已分配资源£ I he execue nunber:i 输入作业已分配竇源沙 调度下一个作业 20 Il he execue n unbe : 2 系统可分配资源是:3 n 当 刖 正在运q亍的 作业是: 用户N 作业卅决态£ 到达T :D 服务T :3 :& 所需宮 !5 已分£ :2 还需S :3 :d !R ****当刖车刖入井队列状态为= 用户N 作业卅状态恳 到达T :C 服务T :4 :6 所需E !6 已分£ :3 还需$ :3 :c !U 1用户N 作业H :B :h 狀态S :U 到达T :6 服务T :5 所需S :8 已分£ :3 还需s :5 阳户H 作业忖狀态£ :A :A 到达T :R :2 服务T :3 所需s :12 已分腐 :4 还需£ :8 ■ 分配给作业后所剩的资源是:0 一*作业运行J 完成后状态: 1用户H 作业H 状态乞 到达T :1) :d !F 所需£ :3 已分£ ;5 还需S S0 :5 !5 用户名匸“的作业已完成。 打放后的资源是:5 按任一键继缘… IT he execuje nunbei' - 3 "系统可分配资源是:5 --“当前正在运行珂作业是= 用户H 作业H 服务T 快态£ 到达T KG :c :B 所需呂 :6 已分g S3 还需£ :3 :4 :6 ****当刖输入井队列狀态为= '用户N 作业忡状态S :B 到达T :6 服务T :5 所需$ :8 :b :U 已分s :3 已分s 14 还需S (5 用户N 作业H 状态& 到达T IA :a :R 服务T :2 :3 4 』 J^LJ 所需£ S12 还需$ 18 [分配给作业后所剩的资源是;2 十作业运行完成后状态匕 |用户H 作业H 状态奪 到达T ;C :c :F 所需E ;4 已分g :6 还需g !0 :6 :6 1用户名【C1的作业"]已完成◎ 释放后的资源是:8 [按任一键M续…- 21 八、结果分析与调试过程小结 22 在调试 FCFS 算法中重要的是怎么按到达时间先后插入就绪队列, 其中还要考虑到当前 有进程在运行的情况的。但由于进程是先来先服务的,所以需要定义另一指针 first 来确定 要进来的进程插入的位置。 在调试SJF算法中,它是基于FCFS算法的基础上,利用shortjob() ready 指针的,但由于 JCB 控 来查询已排好队的作业中所需运行时间最短的作业,从而把把它指向 一开始遗忘了 C 语言中指针的链接,导致程序出现了了一系列的问题,如无法出现 制块等等。在多道作业调度中我总共想到了三个问题,第一个是输入的信息中要防止出错, 就用来 if((p->nsource<=source)&&(rsource>=0)&&(p->nsource>p->asource)) 来判断,如果有错 就不让它进入输入井;第二个是当第一个先到作业因为不能满足要求而不能执行时如何处 置,怎么再次调用它,就再调用一次 sort()函数;第三个是在第二问题上因为调用了 sort(), 会导致不能满足要求的作业一直重复着判断作业这一步骤, 件( i<=2* 作业个数)来缩短循环次数。 也就出现了死循环。 我想了很久 i 来记录着,然后给定条 只找到了个愚蠢的办法,就是每次调用作业若不能满足要求,都用 十、思考题 1、 写出每种算法的调度策略,最后比较各种算法的优缺点。 答:先来先服务算法是根据作业的到达时间先后来排序 ,到达时间短的先运行,优点是实现 简单,利于长作业,缺点是运行时间慢,不利于短作业。 短作业优先算法是先根椐作业的到达时间先后来排序, 然后查找所需运行时间短的先运 行,优点是运行时间快 ,缺点是实现起来比较复杂,对长作业不利。 2、 选择调度算法的依据是什么? 答:如果作业要求的速度不高,而且作业比较小型,那就最好用先来先服务算法。 如果作业要求的速度高,作业流程复杂,那就最好用短作业优先算法。 附加: 关键函数: 对于FCFS算法来说其关键函数是 sort()//按到达时间先后顺序排列,和 running()〃当前 作业执行情况,还有各种时间的计算。其中 sort()中需要考虑当前就绪队列为空,还是有作 (btime),而其 业正在运行的情况,而running()中,我把它分成了三部分,一部分是先将每一个要执行的作 业分离出来,好让它在执行check()的当前执行作业时能显示出开始运行时间 它非输入类时间显示为 '0',直到运行完毕状态才把所有各类时间打印出来;第二部分进行 各类时间的计算;第三部分用来判断运行时间是否达到它所需要运行的时间。 SJF中还有一个关键函数,那就是 shortjob()//获取最短作业,这是在 对于SJF算法 sort()中排好的作 sort() 来说,因为它是基于FCFS算法的基础上的,所以FCFS中的关键函数也是 SJF的关键函数, 但是业中再次查找所需运行时间最短的作业,然后调度它。对于多道作业调度算法来说, 23 函数、sort1()函数、三个running。函数,第一个 sort()是用来判断输入作业信息的正确性, 正确了就按照作业到达时间先后顺序排列; 第二个sort1()是在输入井中判断的作业不能满足 running 函数,它分三部分,第一部 running() 用来判断运行时间是否达到 running2()用来 要求时,利用该函数来把它插在输入井队尾;第三个是 分是 running1() 用来计算剩下可分配资源,第二部分是 执行满足资源要求的作业。 数据结构: 在FCFS和SJF算法中,均采用一个队列来实现作业的调度,首先先判断对头 ready是 作业所需时间,如果没达到就继续运行,直到达到才释放资源,第三部分是 否为空, 为空时直接插入作业, 否则还要判断就绪队列中是否有正在执行的作业, 有的话得 把要插进来的进程插入到适当的位置中, 等所有进程排好队好, 就按照队列先进先出的特点, 总是执行对头的作业,直到队列为空。但在 按到达时间先后排好的队列中,采用 SJF算法中,因为它是短作业优先执行,那么在 shortjob()函数调用所需时间最短的作业,就相当于有 一个虚构的队列将作业按所需运行时间重新排列, 而其本身并不存在。 在多道作业调度算法 中,每个作业由作业控制块 JCB 表示,包含有如下信息:用户名、运行状态、到达时间、 需要的资源, 分配的资源等, 首先作业按作业到达时间先后排成一个队列, 也就是运用到了 队列先进先出的原则,使作业能顺利完成。 24
版权声明:本文标题:操作系统作业调度实验报告 多道批处理 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1703333290a50191.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论