进程调度程序.docx

上传人:b****7 文档编号:9918939 上传时间:2023-02-07 格式:DOCX 页数:32 大小:335.63KB
下载 相关 举报
进程调度程序.docx_第1页
第1页 / 共32页
进程调度程序.docx_第2页
第2页 / 共32页
进程调度程序.docx_第3页
第3页 / 共32页
进程调度程序.docx_第4页
第4页 / 共32页
进程调度程序.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

进程调度程序.docx

《进程调度程序.docx》由会员分享,可在线阅读,更多相关《进程调度程序.docx(32页珍藏版)》请在冰豆网上搜索。

进程调度程序.docx

进程调度程序

进程调度程序

摘要

进程管理是操作系统中的重要功能,用来创建进程、撤消进程、实现进程状态转换,它提供了在可运行的进程之间复用CPU的方法。

在进程管理中,进程调度是核心,因为在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态,当就绪进程个数大于处理器数目时,就必须依照某种策略决定哪些进程优先占用处理器。

本文通过两种算法模拟实现了进程之间的调度。

关键词:

创建进程;先来先服务;优先级调度

 

目录

1绪论1

2模块代码算法2

2.1创建进程2

2.2创建PCB2

2.3CPU调度与分配模块2

2.4CPU模拟运行模块3

2.5可强占优先进程调度模块4

3函数调用关系图7

3.1总体流程图7

3.2可强占优先调度流程图8

3.3先来先服务调度流程9

4测试结果10

5结论13

参考文献14

致谢15

附录16

1绪论

在操作系统中,调度的实质是一种资源分配,调度算法即指:

根据系统的资源分配策略所规定的资源分配算法。

对于不同的系统和系统目标,通常采用不同的调度算法,如在批处理系统中,为照顾为数众多的短作业,采用短作业有限调度算法;在分时系统中,为保证系统具有合理的响应时间,采用轮转法进行调度。

采用算法时,则要考虑多方面因素,以便达到最佳效果。

做好这个课程设计,有利于加深对操作系统进程调度知识的理解。

在这次进程调度程序设计中采用两种算法,最高优先级数优先的调度算法和先来先服务算法,对多个进程进行调度,每个进程有三个基本状态,初始状态为就绪状态、运行状态和结束状态。

最高优先级数优先的调度算法中,程序的某进程运行时间以时间片为单位计算,各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。

在优先级数优先的调度算法中,优先级数的值设计为100与运行时间的差值,即Pro_time-process->needtime,进程每执行一次,优先数减3,CPU时间片数加1,进程还需要的时间片数减1,对于遇到优先数一致的情况,采用先来先服务策略解决。

基于这种思想设计下面的程序流程图,在流程图的基础上采用c++语言和进程调度算法设计了进程运行程序。

2模块代码算法

2.1创建进程

structProcessPcb,定义PCB相关变量

processPcb(){next=NULL;}

charpro_name[20];//进程的名字

inttime_submit;//提交时间,从时间为1开始计时

inttime_exe;//进程所需的运行时间

intpro_id;//进程ID(系统生成)

intpro_priority;//进程优先级

inttime_start;//开始执行的时间

inttime_end;//结束的时间

inttime_wait;//等待的时间

intpro_state;//进程的状态(就绪,执行,完成)

inttime_left;//还需多少时间单位,初始化为所需的执行时间

inttime_turn;//周转时间

doubletime_aver;//带权周转时间

2.2创建PCB

CpuModel{

CpuModel(){pcbnum=0;}

voidcpurun();//cpu模拟运行函数

boolGetPcb();//进程输入函数

voidShowPcb();//将输入的进程展示出来

voidPriModel();//可强占的优先进程调度模式

voidFcfsModel();//先到先服务调度模式

ProcessPcbPcbList[100];//按提交时间排的未就绪进程队列()

}

2.3CPU调度与分配模块

classCpuModel

{public:

CpuModel()

{pcbnum=0;

}

voidcpurun();//cpu模拟运行函数

boolCreatePcb();//进程输入函数

voidShowPcb();//将输入的进程展示出来

voidPriModel();//可强占的优先进程调度模式

voidFcfsModel();//先到先服务调度模式

private:

ProcessPcbPcbList[100];//按提交时间排的未就绪进程intpcbnum;//进程数量

intfreetime;//cpu空闲时间

intallturn;//总周转时间

floatallaver;//总带权周转时间

};

2.4cpu模拟运行模块

voidCpuModel:

:

cpurun()

{intchoose=0;

while

(1)

{cout<<"***主菜单***"<

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

cout<<"***1:

创建进程***"<

cout<<"***2:

显示已创建的进程***"<

cout<<"***3:

可强占的优先进程调度***"<

cout<<"***4:

先到先服务调度***"<

cout<<"***5:

退出系统***"<

cout<<"\n***请选择:

";

cin>>choose;

cout<

switch(choose)

{case1:

CreatePcb();//创建进程

break;

case2:

ShowPcb();//显示已创建的进程

break;

case3:

PriModel();//可强占的优先进程方式

break;

case4:

FcfsModel();//先到先服务调度方式

break;

case5:

return;//结束程序

}

cout<

}

}

2.5可强占优先进程调度模块

voidCpuModel:

:

PriModel()

{cout<<"********可强占的优先进程调度过程如下********\n";

freetime=0;//初始化系统空闲时间为0

inttime=0;//时间

intnextid=0;

intpnum=0;//已就绪进程数目

ProcessPcb*head;//就绪队列

ProcessPcb*pcb,*pcb1,*pcb2;

head=(ProcessPcb*)malloc(sizeof(ProcessPcb));

head->next=NULL;

while(head->next!

=NULL||pnum

{Sleep(1000);

time++;

cout<<"*Time:

第"<

}

while(pnum

{pcb=(ProcessPcb*)malloc(sizeof(ProcessPcb));

*pcb=PcbList[pnum++];

pcb->next=head->next;

head->next=pcb;

}

if(head->next==NULL)

{cout<<"没有可运行的进程"<

freetime++;

}

else

{pcb2=head;

pcb=head->next;

pcb1=head->next;

while(pcb1->next!

=NULL)

{if(pcb->pro_priority<=pcb1->next->pro_priority)

{pcb2=pcb1;

pcb=pcb1->next;

}

pcb1=pcb1->next;

}

if(pcb->time_left==pcb->time_exe)

{pcb->time_start=time;

pcb->pro_state=EXECUTE;

}

pcb->pro_priority=pcb->pro_priority-3;

pcb->time_left--;

cout<<"进程编号:

"<pro_id<<"<pro_name<<"提交时间:

"

<time_submit<<"执行时间:

"<time_exe

<<"\n开始时间:

"<time_start

<<"还剩时间:

"<time_left<<"优先级数:

"

<pro_priority<

 

 

3函数调用关系图

3.1总体流程图

 

 

3.2可强占优先调度流程图

 

 

图3.2可强占优先调度流程图

 

3.3先来先服务调度流程

 

 

图3.3先来先服务调度流程图

 

4测试结果

1)创建进程:

图4.1创建进程

2)显示创建进程:

图4.2显示创建进程

3)可强占的优先进程调度过程:

图4.3可强占的优先进程调度过程

图4.4可强占的优先进程调度过程

4)先来先服务进程调度过程:

图4.5先来先服务进程调度过程

图4.6先来先服务进程调度过程

图4.7先来先服务进程调度过程

5)退出系统:

图4.8退出系统

 

5结论

课程设计是一门实践性较强的课程,通过在课堂里接受老师对知识的讲解,以及我们在课后对这些知识的理解,通过课程设计我们可以对知识做到学以致用的目的。

在这次操作系统课程设计中,我们小组所要实践练习的是关于进程的调度,进程的调度有多种不同的算法,如先来先服务、优先级调度、时间片轮转、短进程优先最短剩余时间优先和最高响应比优先调度算法。

由于算法的不同体现出处理器对各个在就绪队列中进程调度的先后次序,体现了处理机的利用效率高低以及在就绪队列中各个进程调度的先后次序。

在这次课程设计的过程中,遇到了许多的问题,通过请教同学,上网查资料等途径一一解决,通过这次操作系统的课程设计,加深了对进程调度的理解。

在这次课程设计过程中,不同设计阶段出现了不同的问题。

在总体设计阶段由于要将两种算法程序合写成一个代码程序,通过使用switch选择语句得以解决。

程序在进行调试阶段出现了stdio.h:

Nosushfileordirectory问题,原因就是没有安装库文件,通过上网进行查找,由于运行环境缺少头文件资源,解决的方法是下载该文件sudoapt-getinstalllibc6-dev,才可以使得程序正确运行。

总体来说我认为操作系统这门学科在计算机科学当中是非常重要的,这次操作系统的课程设计收获颇丰,复习了许多东西,也从新学会了许多东西,我想这也许就是课程设计的最终目的吧。

 

 

参考文献

[1]汤子瀛,哲凤屏.《计算机操作系统》,西安电子科技大学出版社,1998.

[2]王清,李光明.《计算机操作系统》,冶金工业出版社,1995.

[3]孙钟秀.操作系统教程,高等教育出版社,1999.

[4]曾明.Linux操作系统应用教程,陕西科学技术出版社,2000.

[5]张丽芬,刘立雄.《操作系统实验教程》,清华大学出版社,1990.

[6]孟静.操作系统教程--原理和实例分,高等教育出版社,2001.

[7]周长林.计算机操作系统,高等教育出版社,1992.

[8]张坤.操作系统实验教程,清华大学出版社,1994.

 

致谢

在这次操作系统课程设计中,我们是三名同学一组,三个同学共同来完成一个题目,我们小组做的是进程调度算法,采用最高优先级数优先的调度算法和先来先服务算法来完成进程的调度运行。

由于作业任务的繁重,再加上课设过程中遇到了许多的困难,如在程序撰写、代码的调试与运行以、资料查找、整体设计过程中整体图形的构思和代码的调试与在ubuntu中的运行中遇到了许多的问题,幸好在我们小组同学积极配合查阅资料以及郭文娟老师的帮助师的住下才能够顺利的完成这次课程设计作业。

在这里感谢我们组的同学的积极配合以及他们解决问题的能力,感谢郭文娟老师的热切的辅导,让我们在有限的时间里做完这次课程设计作业。

再次感谢与本次课设息息相关的各位老师和同学们,谢谢你们的积极参与与配合。

 

附录

#include

#include

#include

#include

#include

usingnamespacestd;//进程的状态

#defineUNREADY0//未就绪

#defineREADY1//就绪

#defineEXECUTE2//执行

#defineEND3//完成

structProcessPcb

{ProcessPcb()

{

next=NULL;

}

charpro_name[20];//进程的名字

inttime_submit;//提交时间,从时间的1开始计时

inttime_exe;//进程所需的运行时间

intpro_id;//进程ID(系统生成)

intpro_priority;//进程优先级

inttime_start;//开始执行的时间

inttime_end;//结束的时间

inttime_wait;//等待的时间

intpro_state;//进程的状态(就绪,执行,完成)

inttime_left;//还需多少时间单位,初始化为需的执行时间

inttime_turn;//周转时间

doubletime_aver;//带权周转时间

ProcessPcb*next;

};

classCpuModel

{public:

CpuModel()

{pcbnum=0;

}

voidcpurun();//cpu模拟运行函数

boolCreatePcb();//进程输入函数

voidShowPcb();//将输入的进程展示出来

voidPriModel();//可强占的优先进程调度模式

voidFcfsModel();//先到先服务调度模式

private:

ProcessPcbPcbList[100];

intpcbnum;//进程数量

intfreetime;//cpu空闲时间

intallturn;//总周转时间

floatallaver;//总带权周转时间

};

#include

voidCpuModel:

:

cpurun()

{intchoose=0;

while

(1)

{cout<<"***主菜单***"<

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

cout<<"***1:

创建进程***"<

cout<<"***2:

显示已创建的进程***"<

cout<<"***3:

可强占的优先进程调度***"<

cout<<"***4:

先到先服务调度***"<

cout<<"***5:

退出系统***"<

cout<<"\n***请选择:

";

cin>>choose;

cout<

switch(choose)

{case1:

CreatePcb();//创建进程

break;

case2:

ShowPcb();//显示已创建的进程

break;

case3:

PriModel();//可强占的优先进程方式

break;

case4:

FcfsModel();//先到先服务调度方式

break;

case5:

return;//结束程序

}

cout<

}

}

boolcmp(ProcessPcba,ProcessPcbb)

{if(a.time_submit

returntrue;

returnfalse;

}

intisnumber(chara[])

{intlen=strlen(a);

inti,num=0;

if(a[0]>'0'&&a[0]<='9')

num=a[0]-'0';

elsereturn-1;

for(i=1;i

{if(a[i]>='0'&&a[i]<='9')

num=num*10+a[i]-'0';

elsereturn-1;

}

returnnum;

}

boolCpuModel:

:

CreatePcb()

{charnum[10];

cout<<"\n***请输入你想建立的进程个数:

";

cin>>num;//输入进程个数

pcbnum=isnumber(num);

if(pcbnum<=0)

{cout<<"***输入有错***\n";

return0;

}

inti;

for(i=0;i

{cout<<"***请依次输入第"<

cout<<"*******名字:

";

cin>>PcbList[i].pro_name;

cout<<"***提交时间:

";

cin>>num;

PcbList[i].time_submit=isnumber(num);

if(PcbList[i].time_submit<=0)

{cout<<"***输入有错***\n";

return0;

}

cout<<"***执行时间:

";

cin>>num;

PcbList[i].time_exe=isnumber(num);

if(PcbList[i].time_exe<=0)

{cout<<"***输入有错***\n";

return0;

}

PcbList[i].time_left=PcbList[i].time_exe;//设置剩余执行时间

PcbList[i].pro_state=UNREADY;//设置状态为未就绪

PcbList[i].pro_priority=100-PcbList[i].time_exe;

cout<

}

sort(PcbList,PcbList+pcbnum,cmp);//按提交时间排序

for(i=0;i

PcbList[i].pro_id=i+1;//设置Id,根据提交时间

return1;

}

voidCpuModel:

:

ShowPcb()

{inti;

cout<<"\n***所需执行的进程信息如下***\n";

for(i=0;i

cout<<"进程编号:

"<

"

<

"<

<<"执行时间:

"<

"

<

cout<

}

voidCpuModel:

:

PriModel()

{cout<<"********可强占的优先进程调度过程如下********\n";

freetime=0;//初始化系统空闲时间为0

inttime=0;//时间

intnextid=0;

intpnum=0;//已就绪进程数目

ProcessPcb*head;//就绪队列

ProcessPcb*pcb,*pcb1,*pcb2;

head=(ProcessPcb*)malloc(sizeof(ProcessPcb));

head->next=NULL;

while(head->next!

=NULL||pnum

{Sleep(1000);

time++;//时间片为1

cout<<"*Time:

第"<

while(pnum

{pcb=(ProcessPcb*)malloc(sizeof(ProcessPcb));

*pcb=PcbList[pnum++];

pcb->next=head->next;//插在head之后

head->next=pcb;

}

if(head->next==NULL)

{cout<<"没有可运行的进程"<

freetime++;

}

else

{pcb2=head;

pcb=head->next;

pcb1=head->next;

while(pcb1->next!

=NULL)

{if(pcb->pro_priority<=pcb1->next->pro_priority)

pcb2=pcb1;

pcb=pcb1->next;

}

pcb1=pcb1->next;

}

if(pcb->time_left==pcb->time_exe)//该进程是否已开始

{pcb->time_start=time;//设置开始时间

pcb->pro_state=EXECUTE;//设置状态为执行

}

pcb->pro_priority=pcb->pro_priority-3;

pcb->time_left--;//剩余执行时间减去时间片

cout<<"进程编号:

"<pro_id<<"进程名字:

"

<pro_name<<"提交时间:

"

<time_submit<<"执行时间:

"<time

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

当前位置:首页 > 高等教育 > 研究生入学考试

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

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