采用时间片轮转算法调度程序.docx

上传人:b****5 文档编号:6143608 上传时间:2023-01-04 格式:DOCX 页数:14 大小:35.79KB
下载 相关 举报
采用时间片轮转算法调度程序.docx_第1页
第1页 / 共14页
采用时间片轮转算法调度程序.docx_第2页
第2页 / 共14页
采用时间片轮转算法调度程序.docx_第3页
第3页 / 共14页
采用时间片轮转算法调度程序.docx_第4页
第4页 / 共14页
采用时间片轮转算法调度程序.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

采用时间片轮转算法调度程序.docx

《采用时间片轮转算法调度程序.docx》由会员分享,可在线阅读,更多相关《采用时间片轮转算法调度程序.docx(14页珍藏版)》请在冰豆网上搜索。

采用时间片轮转算法调度程序.docx

采用时间片轮转算法调度程序

采用时间片轮转算法调度程序

号:

名:

业:

指导教师:

日期:

一、需求分析3

1、设计要求:

3

2、解决方案:

3

二、课程设计简介4

1、课程设计题目4

2、课程设计目的4

3、课程设计内容4

4、时间安排4

三、概要设计4

1、基本原理4

2、算法思想设计5

3、数据结构及模块说明:

5

四、主要函数及其说明6

五、调试分析7

1、调试过程及步骤7

2、结果分析(以三个进程数为例)8

六、总结及参考文献9

1、总结:

9

2、参考文献9

附录:

程序源代码9

、需求分析

7、设计要求:

在多道程序或多任务系统中,系统同时处于就绪状态的进程有若干个。

为了使系统中各进程能有条不紊地进行,必须选择某种调度策略,以选择一进程占用处理机。

要求用时间片轮转算法模拟单处理机调度,以巩固和加深处理机调度的概念。

2、解决方案:

(1)、假设系统有5个进程,每个进程用一个进程控制块PCB来表示。

PCB包括:

进程名、链接指针、到达时间、估计运行时间和进程状态。

其中,进程名即进程标识。

链接指针指出下一个到达进程的进程控制块地址,按照进程到达的顺序排队,统设置一个队头和队尾指针分别指向第一个和最后一个进程,新生成的进程放队尾。

估计运行时间:

可由设计者任意指定一个时间值。

到达时间:

进程创建时的系统时间或山用户指定,调度时,总是选择到达时间最早的进程。

进程状态:

为简单起见,假定进程有三种状态,就绪、等待和完成,并假定进程一创建就处于就绪状态,用R表示,当一个进程运行结束时,就将其置成完成状态,用F表示。

当一个进程未运行完成并且时间片不足时,就将其置成等待状态,用W表示。

(2)、为每个进程任意确定一个要求运行时间和到达时间。

(3).按照进程到达的先后顺序排成一个循环队列。

再设一队首指针指向第一个到达进程的首址。

(4)、执行处理机调度时,开始选择队首的第一个进程运行。

另外再设一个当前运行进程的指针,指向当前正运行进程。

(5)、由于本实验是模拟实验,所以对被选中进程并不实际启动运行,而只是执行:

a).佔讣运行时间减时间片长度;b).输出当前运行进程的名字。

用这两个操作来模拟进程的一次运行(即一个时间片)°

(6)、进程运行一次后,以后的调度则将当前指针依次下移一个位置,指向下一个进程,即调整肖前运行指针指向该进程的链接指针所指进程,以指示应运行进程。

同时还应判断该进程的剩余运行时间是否为零。

若不为零,则等待下一轮的运行;若该进程的剩余运行时间为零,则将该进程的状态置为完成状态F,并退岀循环队列插入完成队列。

(7)、若就绪队列不空,则重复上述(5)和(6)步骤直到所有进程都运行完为止。

(8)、在所有设计的调度程序中,应包含显示或打印语句,以便显示或打印每次选中进程的名称及运行一次后队列的变化情况。

二、课程设计简介

r课程设计题目

采用时间片轮转算法调度程序

2、课程设计目的

操作系统课程设计是讣算机专业重要的教学环节,它为学生提供了一个既动手乂动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。

(1)进一步巩固和复习操作系统的基础知识。

(2)培养学生结构化程序、模块化程序设计的方法和能力。

(3)提高学生调试程序的技巧和软件设计的能力。

(4)提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能力。

3、课程设计内容

(1)每一个进程有一个PCB,其内容可以根据具体情况设定。

(2)进程数、进入内存时间、要求服务时间、优先级等均可以在界面上设定。

(3)可读取样例数据(要求存放在外部文件中)进行进程数、进入内存时间、时间片长度、进程优先级的初始化。

(4)可以在运行中显示各进程的状态:

就绪、执行(山于不要求设置互斥资源与进程间的同步关系,故只有两种状态)

(5)采用可视化界面,可在进程调度过程中随时暂停调度,查看当前进程的状态以及相应的阻塞队列。

(6)有性能比较功能,可比较同一组数据在不同调度算法下的平均周转时间。

1)分析设计贮备阶段

2)编程调试阶段

(1天)

(7天)

3)写课程设计报告、考核(2天)

三、概要设计

1.基本原理

采用时间片轮转算法的进程调度程序原理:

系统将所有的输入进程按照先来先服务的原则进行排序并且保存在ready中。

系统调用该算法时,ill于输入进程不可能只有一个,故首先将ready中第一个数据赋值给执行队列run中,每执行一个时间片后都要判断未执行进程中是否有进程到达时间小于系统当前时间,若有则插入执行队列中。

然后继续执行一个时间片,直至所有进程执行完毕。

2、算法思想设计

(1)按先来先服务算法将进程排成就绪队列ready

(2)执行一个时间片后,系统时间加上时间片长度,进行必要判断。

(3)未执行队列中依次把到达时间与系统当前时间判断,若小于则表示已到,插入执行队列run中。

(4)判断当前执行队列是否已完成,如果完成,则显示完成后,将执行队列中

后面元素覆盖前面元素。

如果没有,则重复

(2)(3)和(4),直至所有进

程都执行完毕。

(5)判断是否继续调用别的算法,如果是则重新开始,否则结束。

3、数据结构和流程图:

(1)数据结构

typedefstructnode

{

charname[20];

intround:

intcputime;

intarrivetime;

intneedtime;

intRTime;

charstate;

intcount:

structnode*next:

}PCB;

(2)流程图

四、主要函数及其说明

typedefstructnode

{

charname[20]:

//进程名

intround;//时间片

intcputime;//cpuH寸间

intarrivetime;//到达时间

intneedtime;//需要服务时间

charstate;//运行状态

intcount;//计数

structnode*next;

}PCB;

voidGetFirst()/*取得笫一个就绪队列节点*/

voidOutput()/*输出队列信息*/

voidInsertTime(PCB*in)/*将进程插入到就绪队列尾部*/

voidInsertFinish(PCB*in)/*将进程插入到完成队列尾部*/

voidTimeCreate()/*时间片输入函数*/

voidRoundRun()/*时间片轮转调度算法*/

五、调试分析

7、调试过程及步骤

打开VC++6.0软件,将cpp源文件拖入程序主体中,运行,进入时间片轮转算法主界面。

然后输入进程个数,各个进程的名称、到达时间及运行时间,同时还要定义时间片的大小。

样例中输入的进程数为2个,进程信息分别如下:

请输入要创建的进程数目:

需入进程名字到达时间进程所需时间时间片大小:

a054

b234

进程名

cpu时间需要时间

进程状态

计数器

b

03

W

0

a

05

R

0

进程名

cpu时间需要时间

进程状态

计数器

a

41

W

0

b

03

R

0

进程名

cpu时间需要时间

进程状态

计数器

b

30

F

3

a

41

R

0

进程名

cpu时间需要时间

进程状态

计数器

b

30

F

3

a

50

F

1

a5W

请按任意键继缮•・•

之后再进行三个进程的测试:

请输A要创建的进程数目丁

3

输入进程名字到达时间进程所需时间时间片大小:

a032b142

c352

进程名

CPU时间需要时间

进程状态

计数器

b

04

W

0

C

05

W

0

a

03

R

0

进程名

CPU时间需要时间

进程状态

计数器

C

05

W

0

a

21

W

0

b

04

R

0

进程名

CPU时间需要时间

进程状态

计数器

a

21

W

0

b

22

W

0

c

05

R

0

进程名

CPU时间需要时间

进程状态

计数器

b

22

W

0

c

23

W

0

a

21

R

0

进程名

CPU时间需要时间

进程状态

计数誥

c

23

U

S

at

30

F

1

b

22

R

0

进程名

GPU时间需要时间

进程状态

计数器

a

30

F

1

b

40

F

2

23

R

0

进程名

cpu■时间需要时间

进程状态

计数器

a

30

F

1

b

40

F

2

41

R

0

进程名

cpu时间需要时间

进程状态

计数器

a

30

F

1

b

40

F

2

c50

请按任意键继续•・•■

F

1

2、结果分析(以三个进程数为例)

首先,输入进程数、时间片大小和各个进程的进程名、运行时间及到达时间的信息,进程按照到达时间从小到达顺序,即先运行进程“其状态为R。

时刻为1时,时刻为2时,时刻为3时,时刻为4时,时刻为6时,时刻为7时,时刻为9时,

b进程进入内存。

时间片用完,由于进程b先进入内存,故b进程开始运行。

C进程进入内存。

时间片用完,开始执行C进程。

时间片用完,a进程继续执行。

a进程执行完毕,b进程开始执行。

b进程执行完毕,c进程开始执行。

时刻为11时,时间片用完,内存中仅剩C进程,故继续执行。

时刻为12时,c进程执行完毕,所有进程执行完毕。

六、总结及参考文献

'、总结:

在本次课程设计中,由于C语言和数据结构课程有一段时间并未使用,有些生疏,所以造成了知道时间片轮转算法的内容和基本原理,但是程序不会编的后果,于是将课本温习并且查找相关资料,最后请教老师和同学,终于完成程序的编写。

在这次课程设计是对学习《操作系统》的一次综合考察,锻炼我们综合分析问题、解决问题的能力。

平时上机课都是把代码给我们了,最多要我们修改错误,而现在要我们自己编写有点困难,并且这次课程设计是用C语言编写,C已经有一段时间并未频繁使用,在试验过程中再次捧起c语言的课本和资料。

在和同学的合作和自己努力下,终于把试验给搞定。

因此,要感谢我的指导老师老师、操作系统课程的任课老师还有我的同学。

对时间片轮转算法有了更深的了解:

早期算法中,系统将所有的就绪进程按先来先服务的原则排成一个队列。

每次调度时,把CPU分配给队首进程,并令其执行一个时间片。

其中,时间片的大小对系统性能有很大的影响;选择很小的时间片将有利于短作业,因为它能较快的完成,但会频繁地发生中断、进程上下文的切换,从而增加系统的开销;反之,时间片轮转算法则退化为FCFS算法,无法满足交互式用户的需求。

总的说来知识上的收获很是重要,精神上的丰收也是更加可喜的,让我知道了学无止境的道理。

我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座山峰的后面还有更高的山峰在等着你。

挫折是一份财富,经历是一份拥有。

这次课程设计必将成为我人生旅途上一个非常美好的回忆。

2、参考文献

《操作系统》宗大华,宗涛,陈吉人著北京:

人民邮电出版社,2009

《数据结构》严蔚敬,吴伟民著清华大学出版社,2010

《计算机操作系统》(第三版)汤小丹梁红兵等西安电子科技大学出版社

附录:

程序源代码

#include#include#includetypedefstructnode

charname[20];

intround:

intcputime;

intarrivetime;

intneedtime;

charstate;

intcount;

structnode*next;

}PCB;

PCB*ready=NULL,*run=NULL,*finish二NULL;intnum,i;

voidGetFirst();

voidOutput();

voidInsertTime(PCB*in):

voidInsertFinish(PCB*in);

voidTimeCreate():

voidRoundRun();

intmain(void)

{

printfC请输入要创建的进程数目:

\n〃);

scanf&num);

TimeCreate();

RoundRun();

Output();

}

voidGetFirst()/*取得第一个就绪队列节点*/

{

run=ready;

if(ready!

=NULL)

{

run->state二'R‘;

ready=ready->next;

run->next=NULL;

}

}

voidOutput()/*输岀队列信息*/

{

PCB*p;

p=ready;

printfC进程名\tcpu时间\t需要时间\t进程状态\t计数器\n〃);while(p!

=NULL)

printf(z/%s\t%d\t%d\t\t%c\t\t%d\n,z,p->name,p->cputime,p->needtime,p->state,p->count);

p=p->next:

}

p=finish;

while(p!

=NULL)

{

printfC/%s\t%d\t%d\t\t%c\t\t%d\n,\p->name,p->cputime,p->needtime,p->state,p->count);

p=p->next;

}

p=run;

while(p!

=NULL)

{

printf(z/%s\t%d\t%d\t\t%c\t\t%d\n,z,p->name,p->cputime,p->needtime,p->state,p->count);

p=p->next:

}

}

voidInsertTime(PCB*in)/*将进程插入到就绪队列尾部*/

{

PCB*fst;

fst=ready;

辻(ready=NULL)

{

in->next=ready;

ready=in;

}

else

{

while(fst~>next!

=NULL)

{

fst=fst->next;

}

in->next=fst一>next;

fst->next=in;

}

}

voidInsertFinish(PCB*in)/*将进程插入到完成队列尾部*/

PCB*fst;

fst=finish;

if(finish=NULL)

{

in->next=finish;

finish=in;

}

else

{

while(fst->next!

=NULL)

{

fst=fst-〉next;

}

in->next=fst->next;

fst->next=in;

}

}

voidTimeCreate()/*时间片输入函数*/

{

PCB*tmp;

inti;

printfC输入进程名字到达时间进程所需时间时间片大小:

\『);

for(i=0;i

{

if((tmp二(PCB*)malloc(sizeof(PCB)))==NULL)

{

perror(^malloc77);

exit(l);

}

scanf("%s%d%d%d,z,tmp->name,&(tmp->arrivetime),&(tmp->needtime),&(tmp->round));

getchar();

tmp->cputime=0;

tmp->state二';

//tmp->prio=0;

tmp->count=0;

InsertTime(tmp);

}

voidRoundRun()/*时间片轮转调度算法*/

intflag=1;

GetFirstO;

while(run!

=NULL)

{

Output();

while(flag)

{

run->cputime++;

run->needtime一一;run->count++;

if(run->needtime==0)

{

run->state二'F‘;

InsertFinish(run);

flag=0;

}

elseif(run->count=run->round){

run->state=';

run->count=0;

InsertTime(run);

flag=0;

}

}

flag二1;

GetFirstO;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1