时间片轮转算法资料.docx

上传人:b****5 文档编号:5597947 上传时间:2022-12-28 格式:DOCX 页数:17 大小:115.41KB
下载 相关 举报
时间片轮转算法资料.docx_第1页
第1页 / 共17页
时间片轮转算法资料.docx_第2页
第2页 / 共17页
时间片轮转算法资料.docx_第3页
第3页 / 共17页
时间片轮转算法资料.docx_第4页
第4页 / 共17页
时间片轮转算法资料.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

时间片轮转算法资料.docx

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

时间片轮转算法资料.docx

时间片轮转算法资料

时间片轮转算法

1.课程设计的目的

通过操作系统课程设计,通过对作业调度算法的设计,深入理解作业调度的原理,从原理分析、物理设计,到功能分析和应用程序的最终实现,让我亲自动手参与一个操作系统的模拟设计,真正理解和掌握操作系统的有关内容,加深对操作系统,软件工程,程序设计语言的理论知识的理解和应用水平;在理论和实验教学基础上进一步巩固已学基本理论及应用知识并加以综合提高;学会将知识应用于实际的方法,提高分析和解决问题的能力,增强对手能力;并更好的理解和消化课本所学的知识,为毕业设计和以后工作打下必要基础。

2.课程设计的开发语言

在本次课程设计中,我们选择了C++语言作为我们所使用的开发语言,开发工具则选用了MicrosoftVisualC++6.0。

MFC借助C++的优势为Windows开发开辟了一片新天地,同时也借助ApplicationWizzard使开发者摆脱离了那些每次都必写基本代码,借助ClassWizard和消息映射使开发者摆脱了定义消息处理时那种混乱和冗长的代码段。

更重要的是利用C++的封装功能使开发者摆脱Windows中各种句柄的困扰,只需要面对C++中的对象,这样一来使开发更接近开发语言而远离系统。

正因为MFC是建立在C++的基础上,所以我强调C/C++语言基础对开发的重要性。

利用C++的封装性开发者可以更容易理解和操作各种窗口对象;利用C++的派生性开发者可以减少开发自定义窗口的时间和创造出可重用的代码;利用虚拟性可以在必要时更好的控制窗口的活动。

而且C++本身所具备的超越C语言的特性都可以使开发者编写出更易用,更灵活的代码。

3.功能描述

时间片轮转的主要思想就是按顺序为每一个进程一次只分配一个时间片的时间。

算法要完成的功能就是将各个进程按照时间片轮转运行的动态过程显示出来。

时间片轮转算法的主要实现过程是首先为每一个进程创建一个进程控制块,定义数据结构,说明进程控制块所包含的内容,有进程名、进程所需运行时间、已运行时间和进程的状态以及指针的信息。

实现的过程即运用指针指向某一个进程,判断当前的进程是否是就绪状态“r”,如果是,则为该进程分配一个时间片,同时,已运行时间加一且要求运行的时间减一,如此循环执行,当某一个进程的所需要运行的时间减少至0时,则将该进程的状态设置为“e”。

然后,将指针指向下一个未运行完成的进程,重复判断,直至所有的进程都运行结束。

4.方案论证

4.1概要设计

4.1.1各模块功能

1)int InitQueue(LinkQueue &Q):

输入进程时,初始化输入的链表。

2)int DestroyQueue(LinkQueue &Q):

运行完后,销毁链表。

3)int EnQueue(LinkQueue &Q,QElemType e):

将进程插入循环队列中。

4)int DeQueue(LinkQueue &Q,QElemType e):

当进程完成后,输出链表中元素。

5)int QueueEmpty(LinkQueue &Q):

判断链表是否为空。

6)void chioce(struct PCB pcb[],int n):

对于输入链表中数的按关键字—到达时间用选择法从小到大进行进行排序。

7)void caidan():

主菜单,包含:

进程的创建和结果和结束。

8)void create():

进程的创建。

9)void main():

实现函数调用的总控制。

4.1.2相关数据类型

1)typedef int QElemType:

自定义类型,定义QElemType为int型。

2)typedef struct QNode

{ QElemType data;

struct QNode *next;

}QNode,*QueuePtr;

采用结构体变量,存队列的相关信息:

QElemType data、struct QNode *next。

同时定义结构体指针*QueuePtr,便于之后书写开辟空间级表示。

系统调用时,每次分配一个QNode那么大的空间进行存储。

3)typedefstructPCB

{charname[10];//进程名

structPCB*next;//循环链指针

intneed_time;//要求运行时间

intworked_time;//已运行时间,初始为0

charcondition;//进程状态,只有“就绪”和“结束”两种状态

intflag;//进程结束标志,用于输出

}PCB;PCB*front,*rear;//循环链队列的头指针和尾指针intN;//N为进程数

定义循环链表的头指针和尾指针。

QueuePtr front,QueuePtr rear。

4)struct PCB

{ int ArrivalTime;

int ServiceTime;

har number;

}m[MaxNum];

采用结构体数组,创建一个进程,包含进程相关信息:

进程名称、进程到达时间、进程服务时间。

4.2.3总体设计

程序总体设计:

首先选择1创建进程,输入进程总数,进程的名称,各进程到达的时间,各进程服务的时间,以及时间片q的值,运行出结果。

选择2将结束运行,如图1所示。

图1 系统总体设计

4.2.4主程序的流程图

主程序流程如图2所示。

图2主程序的流程图

4.1.5程序说明

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

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

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

4.2详细设计

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

进程控制块的格式如表3所示。

表3PCB控制块

进程名

指针

要求运行时间

已运行时间

状态

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

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

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

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

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

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

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

用指针表示轮到运行的进程,如表4描述述所示。

表4进程队列

K1

Q1

K2

Q2

K3

Q3

K4

Q4

K5

Q5

 

K2

 

K3

 

K4

 

K5

 

K1

 

2

 

4

 

3

 

1

 

2

 

0

 

0

 

0

 

0

 

0

 

R

 

R

 

R

 

R

 

R

 

PCB1

 

PCB2

 

PCB3

 

PCB4

 

PCB5

4.3程序详细设计步骤

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

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

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

建立时间片轮转算法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’表示所有进程运行完成,则循环结束。

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

5.程序的运行及结果

1)主菜单:

输入选项1:

进程创建及结果2:

结束,如图5所示。

图5主菜单

2)运行过程:

选择1,创建进程。

输入进程总数,进程的名称a 、b,各进程到达的时间,各进程服务的时间,以及时间片q的值。

当输入进程为2时,各进程到达时间为3,2,各进程服务时间为2,3,以及时间片q=2时的情况,输入情况如图6所示。

图6创建进程

3)输入成功后,按回车键,进程在程序中的具体实现情况即:

时间轮转情况。

进程在调度算法中,计算出的具体的完成时间,周转时间,带权时间,平均周转时间,平均带权周转时间,如图7所示。

图7进程运行结果

3)选择2:

退出界面,如图8。

图8退出界面

6.心得体会

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

初次找到课程设计的题目时,为程序本身的简单而窃喜过;实验过程中也出现了一些难题需要解决,为此去苦苦探索过。

课程设计期间,曾多次登录网站浏览网页,为了弥补一些知识上的纰漏,一次次实践。

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

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

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

但是你会发现就在你的身边,会有那么一批人在背后热心的帮助你,这好像是人生的一种历程,团队的协作和彼此心的交流让我们彼此丰厚起来,这也是我们成长中必不可失的重要部分。

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

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

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

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

7.参考文献

[1]陈莉君等.Linux操作系统原理与应用[M].北京:

清华大学出版社.2012.1

[2]李龙来,吴杰,吕智慧,杨明.基于Web服务的分布式文件系统管理与优化方案[J].计算机工程与设计,2012.

[3]庞丽萍,阳富民.计算机操作系统(第2版)[M].北京:

人民邮电出版社.2014.1

[4]孙洪庆.浅谈对计算机操作系统的认识[J].改革与开放,2011,04:

140.

[5]汤小丹.计算机操作系统(第4版)[M].西安:

电子科技大学出版社.2014.5

 

附录:

#include

#include

#include

typedefintQElemType;

staticconstintMaxNum=100;

typedefstructQNode

{QElemTypedata;

structQNode*next;

}QNode,*QueuePtr;

typedefstruct

{QueuePtrfront;

QueuePtrrear;

}LinkQueue;

structPCB

{intArrivalTime;

intServiceTime;

charnumber;

}m[MaxNum];

intInitQueue(LinkQueue&Q);

intDestroyQueue(LinkQueue&Q);

intEnQueue(LinkQueue&Q,QElemTypee);

intDeQueue(LinkQueue&Q,QElemTypee);

intQueueEmpty(LinkQueue&Q);

voidchioce(structPCBpcb[],intn);

voidcaidan();

voidcreate();

intn,q,FinishedTime[MaxNum],WholeTime[MaxNum];

doubleWeightWholeTime[MaxNum],Average_WT=0,Average_WWT=0;

LinkQueueQ;

voidRR(int*ArrivalTime,int*ServiceTime,intn,intq,LinkQueue&Q);

voidmain()

{while

(1)

{//system("cls");

cout<

caidan();

intn;

cout<<"请选择(1-2):

"<

cin>>n;

if(n<1||n>2)

cout<<"输入有误,请重新输入"<

switch(n)

{case1:

create();break;

case2:

return;

}

}

}

//RR算法的具体实现

voidRR(int*ArrivalTime,int*ServiceTime,intn,intq,LinkQueue&Q)

{

intcountTime=0,e;

chioce(m,n);

if(ArrivalTime[0]==0)

countTime=0;

else

countTime=m[0].ArrivalTime;

intSTime[MaxNum],pushed[MaxNum];

for(inti=0;i

{STime[i]=m[i].ServiceTime;

pushed[i]=0;

}

InitQueue(Q);

EnQueue(Q,0);

pushed[0]=1;

inttime=m[0].ArrivalTime;

while(QueueEmpty(Q)==false)

{

e=DeQueue(Q,e);

if(STime[e]>q)

{

STime[e]=STime[e]-q;

countTime+=q;

}

else

{

countTime+=STime[e];

STime[e]=0;

FinishedTime[e]=countTime;

}

while(time

{

if(STime>0)

{

cout<<"时刻"<

(2)<

进程"<

}

time++;

}

for(i=1;i

{

if(STime!

=0&&i!

=e&&m[i].ArrivalTime

=

0&&i!

=e&&m[i].ArrivalTime==countTime)

{

EnQueue(Q,i);

pushed[i]=1;

}

}

if(STime[e]>0)//判断进程e是否已执行完

{

EnQueue(Q,e);

}

}

for(i=0;i

{//求周转时间和带权周转时间

WholeTime[i]=FinishedTime[i]-m[i].ArrivalTime;

WeightWholeTime[i]=(double)(WholeTime[i]*1.000000/m[i].ServiceTime);

Average_WT+=WholeTime[i];

Average_WWT+=WeightWholeTime[i];

}

Average_WT/=n;//求平均周转时间

Average_WWT/=n;//求平均带权周转时间

//----------------输出----------------

cout<<"-------------------------------------"<

cout<

cout<<"进程运行的结果是:

"<

cout<<"-------------------------------------------------------------------------"<

cout<<"进程名称:

"<<"";

for(i=0;i

cout<

cout<

cout<<"到达时间:

"<<"";

for(i=0;i

cout<

cout<

cout<<"服务时间:

"<<"";

for(i=0;i

cout<

cout<

cout<<"完成时间:

"<<"";

for(i=0;i

cout<

cout<

cout<<"周转时间:

"<<"";

for(i=0;i

cout<

cout<

cout<<"带权周转:

"<<"";

for(i=0;i

cout<

:

fixed)<

(2)<

cout<

cout<<"--------------------------------------------------------------------------"<

cout<<"平均周转时间为:

"<

cout<<"平均带权周转时间为:

"<

}

//初始化链队列Q

intInitQueue(LinkQueue&Q)

{

Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));

Q.front->next=NULL;

return1;

}

//销毁链队列Q

intDestroyQueue(LinkQueue&Q)

{

while(Q.front)

{

Q.rear=Q.front->next;

free(Q.front);

Q.front=Q.rear;

}

return1;

}

//入队

intEnQueue(LinkQueue&Q,QElemTypee)

{

QueuePtrp=(QueuePtr)malloc(sizeof(QNode));

p->data=e;p->next=NULL;

Q.rear->next=p;

Q.rear=p;

return1;

}

//出队,并用e返回出队节点的元素值

intDeQueue(LinkQueue&Q,QElemTypee)

{

QueuePtrp;

if(Q.front==Q.rear)

return0;

p=Q.front->next;

e=p->data;

Q.front->next=p->next;

if(Q.rear==p)

{

Q.rear=Q.front;

}

free(p);

returne;

}

//判断链队列Q是否为空

intQueueEmpty(LinkQueue&Q)

{

if(Q.front==Q.rear)

returntrue;

else

returnfalse;

}

//选择排序,对结构体中的关键字到达时间,按从小到大的顺序排列

voidchioce(structPCBpcb[],intn)

{

inti,j;

structPCBt;

for(j=0;j

{for(i=0;i

if(pcb[i].ArrivalTime>pcb[i+1].ArrivalTime)

{

t=pcb[i];

pcb[i]=pcb[i+1];

pcb[i+1]=t;

}

}

}

voidcaidan()

{

cout<<"*************************主页***********************"<

}

voidcreate()

{

cout<<"请输入进程总数n的值(0

"<

cin>>n;

while(n<0||n>100)

{

cout<<"你输入的n的值不正确,请重新输入!

"<

cin>>n;

}

cout<<"请依次输入各个进程的名称:

"<

for(inti=0;i

cin>>m[i].number;

cout<<"请依次输入各个进程的到达时间(ArrivalTime>=0):

"<

for(i=0;i

{

cin>>m[i].ArrivalTime;

while(m[i].ArrivalTime<0)

{

cout<<"你输入的n的值不正确,请重新输入!

"<

cin>>m[i].ArrivalTime;

}

}

cout<<"请依次输入各个进程的服务时间(ServiceTime>=0):

"<

for(i=0;i

{

cin>>m[i].ServiceTime;

while(m[i].ServiceTime<0)

{

cout<<"你输入的n的值不正确,请重新输入!

"<

cin>>m[i].ServiceTime;

}

}

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

当前位置:首页 > 农林牧渔

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

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