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->rtimentime)

{

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->rtimentime)

{

(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

本文标签: 作业时间运行调度输入