时间片轮转算法docWord格式文档下载.docx

上传人:b****6 文档编号:20071130 上传时间:2023-01-16 格式:DOCX 页数:11 大小:77.29KB
下载 相关 举报
时间片轮转算法docWord格式文档下载.docx_第1页
第1页 / 共11页
时间片轮转算法docWord格式文档下载.docx_第2页
第2页 / 共11页
时间片轮转算法docWord格式文档下载.docx_第3页
第3页 / 共11页
时间片轮转算法docWord格式文档下载.docx_第4页
第4页 / 共11页
时间片轮转算法docWord格式文档下载.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

时间片轮转算法docWord格式文档下载.docx

《时间片轮转算法docWord格式文档下载.docx》由会员分享,可在线阅读,更多相关《时间片轮转算法docWord格式文档下载.docx(11页珍藏版)》请在冰豆网上搜索。

时间片轮转算法docWord格式文档下载.docx

}PCB;

PCB*front,*rear;

//循环链队列的头指针和尾指针

intN;

//N为进程数

 

(2)主程序的流程图:

进程是否’r’

开始

输入进程数N

输入各进程信息

为每个进程创建PCB并初始化形成一个循环链队列

指针指向循环链队列第一个进程

运行时间+1且剩余时间-1

剩余时间=0?

将进程状态置为’e’(完成)

所有进程是否完成

指针指向队列中下个进程

结束

Y

N

(3)程序说明:

处理器调度总是选择指针指示的进程运行。

由于本实验是模拟处理器调度的功能,所以,对被选中的进程并不实际的启动运行,而是执行:

已运行时间+1来模拟进程的一次运行,表示进程已经运行过一个单位的时间。

3、详细设计

(1)首先每一个进程用一个进程控制块PCB来代表。

进程控制块的格式为:

进程名

指针

要求运行时间

已运行时间

状态

其中,进程名——作为进程的标识,如Q1、Q2等。

指针——进程按顺序排成循环链队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程的指针指出第一个进程的进程控制块首地址。

要求运行时间——假设进程需要运行的单位时间数。

已运行时间——假设进程已经运行的单位时间数,初始值为“0”。

状态——有两种状态,“就绪”和“结束”,初始状态都为“就绪”,用“R”表示。

当一个进程运行结束后,它的状态为“结束”,用“E”表示。

(2)每次运行所设计的处理器调度程序前,为每个进程任意确定它的“要求运行时间”。

把五个进程按顺序排成循环链队列,用指针指出队列连接情况。

用指针表示轮到运行的进程,如下图描述所示:

K1

Q1

K2

Q2

K3

Q3

K4

Q4

K5

Q5

K2

K3

K4

K5

2

4

3

1

R

PCB1

PCB2

PCB3

PCB4

PCB5

(3)程序详细设计步骤:

a.首先建立PCB的数据结构,为了便于正确输出,加上了进程结束标志flag。

输入进程信息(包括进程名和要求运行的时间),并为每个进程创建一个PCB并初始化形成一个循环链队列,用函数creatPCB()来实现。

b.建立函数judge()用来判断进程全部运行结束标志,即当所有进程的状态变为’e’(即完成状态)后,循环结束,表示所有进程都已运行成功。

c.建立时间片轮转算法creatProcess()对进程进行轮转运行,首先指针s指向第一个进程PCB,即s=front,判断该进程的状态是否为’r’(就绪状态),即if(s->

condition=='

r'

),若是则表示此进程尚未执行结束,则执行s->

worked_time++且s->

need_time--,if(s->

need_time==0),则表示此进程已运行结束,将其状态置为结束,即s->

condition='

e'

,并根据状态位输出完成信息,且以后不会再运行此进程。

将指针指向下个进程,s=s->

next,并判断所有进程是否已全部运行结束,没有则重复上面算法。

当所有进程的状态位都变成’e’表示所有进程运行完成,则循环结束。

d.建立主函数main(),输入进程数N,调用初始化循环链队列函数creatPCB()和时间片轮转算法creatProcess(N),每次选中进程的进程名以及运行一次后进程队列的变化,实现处理器的调度。

4、调试分析:

a.调试过程中遇到的问题及解决方案

开始运行到Q5运行完成后显示错误,如下图所示:

原因:

经检查程序发现语句if(s->

condition=='

){printf("

进程%s已经运行完成!

\n\n"

s->

name);

}有错误,因为当某个进程运行完成后,其状态标志已修改为’e’,所以再次循环运行未完成的进程时,当运行到此句时仍会将前面已完成的进程重新输出一遍完成信息,导致输出错误。

解决方案:

为每个进程加上一个结束标志flag,并赋初值为0,当进程运行完成后,将flag改为1,再将后面输出改为if(s->

||s->

flag==0){printf("

s->

flag==0;

},这样在前面进程运行完成输出后,后面再循环时就不会重新输出一遍了。

b.改进设想:

本实验较简单,但还不够完善,如未实现插入进程功能,即进程在运行过程中可以插入其他的进程再运行。

还有未进行进程优先级判别,本实验默认进程的优先级按输入的先后顺序从大到小排列的,还有其他功能等,希望在以后的实验中逐步完善。

5、测试结果:

a.首先输出五个进程的初始状态

b.开始从进程Q1开始按时间片轮转运行进程,Q4先运行完成

c.接着Q1运行完成

d.接着Q5运行完成

e.再Q3运行完成

f.最后Q2运行完成

四、实验总结

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

当执行的时间片用完时,调度程序停止该进程的执行,并将它送往就绪队列的末尾;

然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。

在时间片轮转算法中,时间片的大小对系统性能有很大的影响。

如果选择很小的时间片将有利于短作业,因为它能较快地完成,但会频繁的发生中断、进程上下文的切换,从而增加系统的开销;

反之,如果选择太长时间片,使得每个进程都能在一个时间片内完成,所以,一般定为时间片略大于一次典型地交互所需要的时间。

在完成时间片轮转算法的实现过程中,我们遇到了一些问题,比如怎样运用循环队列,如何设计结构体等等,也积极配合并思考进行解决。

整体来说,我们的算法虽然实现了体现进程动态运行变化的过程,但是相对而言比较简单。

实验中,我们小组不断讨论对算法进行优化,使得运行结果看起来更容易理解,也达到了处理机调度的功能。

做实验让我们对于时间片轮转的思想理解的更加透彻,巩固了理论知识的学习。

实验心得体会:

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

初次得到课程设计的题目时,为程序本身的简单而窃喜过;

实验过程中也出现了一些难题需要解决,为此去苦苦探索过。

课程设计期间,几乎有几天我们完全投入进去了,就像是在做一个相当重要的项目一样的感觉。

曾经跑过图书馆几次,只是为了一种新的想法得到实现,也曾多次登录网站浏览网页,为了弥补一些知识上的纰漏,为此曾洒下了真实的汗水。

当我们的想法得到实现,又学会了新的知识的时候,心中满是欣喜,或许这是实践出真知的真实验证,有付出就有回报的真实写照吧。

其次,我们感受了真诚的友谊。

在实验中,遇到的问题是多方面的,而且有那么一部分是以前学过的C问题,但是已经忘却或是以前没有真正的理解过。

但是你会发现就在你的身边,会有那么一批人在背后热心的帮助你,让你身处困境却感到无限希望。

这好像是人生的一种历程,风风雨雨中我们一起走过,然后为了一些坑坑洼洼彼此真诚的帮助过和无私的付出过。

团队的协作和彼此心的交流让我们彼此丰厚起来,这也是我们成长中必不可失的重要部分。

最后,我认识到了自己的不足。

平心而论,以前真的没有认真的学习过,即使是在听课,可是后来却没有对学习中出现的问题而仔细分析过。

得过且过,迷失了我前进的方向,而现在却又重新敞开了。

不论是以后的学习还是工作,我想这都是很重要的,我们需要不断进步的动力。

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

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

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

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

五、附录

实验源程序如下:

#include"

stdio.h"

conio.h"

malloc.h"

string.h"

#defineNULL0

//链指针

//已运行时间

//进程结束标志

voidcreatPCB(){//为每个进程创建一个PCB并初始化形成一个循环链队列

PCB*p,*l;

l=(PCB*)malloc(sizeof(PCB));

printf("

Pleaseenterprocessnameandtime\n"

);

scanf("

%s%d"

l->

name,&

l->

need_time);

l->

condition='

;

//进程初始状态为就绪

worked_time=0;

next=NULL;

flag=0;

front=l;

for(inti=1;

i<

N;

i++){

p=(PCB*)malloc(sizeof(PCB));

scanf("

p->

p->

p->

next=p;

l=l->

next;

}

rear=l;

rear->

next=front;

}

voidoutput(){//进程输出函数

nameruntimeneedtimestate\n"

for(intj=1;

j<

=N;

j++){printf("

%-4s\t%-4d\t%-4d\t%-c\n"

front->

name,front->

worked_time,front->

need_time,front->

condition);

front=front->

\n"

}

intjudge(PCB*p){//判断所有进程运行结束

intflag=1;

for(inti=0;

i<

N;

i++){

if(p->

condition!

='

){

flag=0;

break;

p=p->

returnflag;

voidcreatProcess(intn){//时间片轮转算法

PCB*s,*p;

inti,j,flag1=0;

s=(PCB*)malloc(sizeof(PCB));

s=front;

\n--------------------------------------------\n"

output();

Pressanykeytocontinue...\n\n"

getch();

//按任意键继续

while(flag1!

=1){

if(s->

s->

worked_time++;

need_time--;

if(s->

need_time==0)

s->

output();

printf("

}

&

&

s->

flag==0){

flag=1;

s=s->

flag1=judge(s);

--------------------------------------------\n"

voidmain(){

Pleaseenterprocessnumber\n"

%d"

&

N);

creatPCB();

creatProcess(N);

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

当前位置:首页 > 高等教育 > 其它

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

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