进程调度模拟说明书.docx
《进程调度模拟说明书.docx》由会员分享,可在线阅读,更多相关《进程调度模拟说明书.docx(27页珍藏版)》请在冰豆网上搜索。
![进程调度模拟说明书.docx](https://file1.bdocx.com/fileroot1/2023-5/21/890b85c1-2437-4d3e-9be4-59a575d84a7a/890b85c1-2437-4d3e-9be4-59a575d84a7a1.gif)
进程调度模拟说明书
*****************
实践教学
******************
兰州理工大学
计算机与通信学院
2012年秋季学期
操作系统课程设计
题目:
进程调度模拟实验
专业班级:
计算机
(2)班
姓名:
温天波
学号:
10240220
指导教师:
李睿
成绩:
目录
1、设计目的意义......................................................3
1.1、目的意义...................................................3
1.2、实现目标...................................................3
2、设计方案思想......................................................4
3、程序功能模块设计..................................................4
3.1、总体模块...................................................4
3.2、部分模块...................................................5
3.3、详细功能描述...............................................7
4、程序总控流程图....................................................7
5、函数的调用关系....................................................9
6、测试数据及测试结果...............................................9
7、设计体会及收获...................................................13
8、参考资料.........................................................14
9、源代码...........................................................15
摘要
在操作系统的运行中,进程调度模拟实验是验证有N个进程并发执行时的优选择方法,是系统性能达到最优的组合。
进程的调度算法有:
采用最高优先级的优先算法(即把处理机分配给优先级最高的进程)和先来先服务算法。
每一个进程都有一个控制块PCB。
进程控制块包含进程名,优先级,到达时间需要运行时间,已用CPU时间,进程状态等。
进程的优先级及需要的运行时间可以实现的人为定义,进程的运行时间片以时间片为单位进行运算,在进行模拟调度的过程中可以创建进程和输入时间。
其基本流程的操作主要以流程和界面解释为主。
从而验证系统性能最大化的发挥。
进程的运行时间以
每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。
关键字:
进程,进程控制块(PCB),优先数,调度算法
1、设计目的意义
1.1、目的意义
通过课程设计理解进程调度的概念,深入了解进程控制的功能、进程的创建、删除以及进程各个状态间的转换过程;实现先来先服务、时间片轮转、最短作业优先、优先级调度算法对进程进行的调度过程;通过观察有关的队列结构的内容的动态变化过程深入体会各个调度算法的特点;从而能够更好的巩固从书本上学到的知识。
编程过程中需要建立队列等结构进行各种操作,通过该次课程设计,我们更加从实用的角度对《数据结构》课程内容进行更深入理解和更熟练的应用。
使用C++语言进行编程,通过对调度功能的编程实现,不但能有效训练我们对编程语言的熟练使用,还能促进我们独立思考解决问题、以及独立查新获取知识的能力。
1.2、实现目标
一个进程的生命期可以划分为一组状态,这些状态刻画了整个进程。
系统根据PCB结构中的状态值控制过程。
在进程的生命期内,一个进程至少具有5种基本状态,它们是:
初始态、执行状态、等待状态、就绪状态和终止状态。
通过系统设计,实现进程相关数据结构的创建和查看功能;实现多种进程调度算法:
先来先服务算法、优先级调度算法、时间片轮转法等;实现对执行进程的阻塞,对等待进程的唤醒等功能。
进程的转换过程如下:
2、计方案思想
本程序用两种算法(最高优先级数优先的调度算法和先来先服务算法)对多个进程进行调度,每个进程有三个状态,初始状态为就绪状态。
最高优先级数优先的调度算法中,程序的某进程运行时间以时间片为单位计算。
各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。
在优先级数优先的调度算法中,优先级数的值设计为100与运行时间的差值,即Pro_time-process->needtime。
进程每执行一次,优先数减3,CPU时间片数加1,进程还需要的时间片数减1。
对于遇到优先数一致的情况,采用先来先服务策略解决。
进程根据外界条件的不断变化引起状态的改变,可以利用系统时间片的大小、进程执行时间、进入主存的时间、系统内存大小、以及调度算法的选择来作为条件对进程进行调度。
通过在对话框中添加按钮、文本编辑框、列表等控件,并为控件关联相应的变量和消息函数,实现各个控件内部以及控件之间的协同工作,并使用定时器进行时间的设置,从而完成系统所要求的进程调度工作。
Windows应用程序,操作系统,计算机硬件之间的相互关系如下:
3、程序功能模块设计(程序功能模块划分及层次等)
3.1、总体模块
3.2、部分模块
3.3、详细功能描述
根据需要设置系统内存的大小
选择不同的进度调度算法进行进程调度模拟
设置进程的各种属性值创建进程
根据进程不同状态放在不同的位置显示进程调度过程中的动态变化情况
在某一时间点击按钮进行进程调度模拟
进程调度模拟过程中可以暂停调度过程,查看进程的状态变化过程
通过双击状态列表中的某个进程可以查看进程的各属性值
对执行进程、就绪进程进行强制“阻塞”操作
对等待进程进行强制“就绪”操作
将没有执行完毕的进程进行强制“杀死”操作
4、程序总控流程图
优先级数调度先来先服务
退出程序
1.可强占优先调度算法实现过程流程图:
2FCFS算法实现过程流程图:
5、函数的调用关系
设计创建进程的结构类型定义和结构变量说明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;//带权周转时间
创建PCB类classCpuModel,定义程序中使用的各函数:
CpuModel(){pcbnum=0;}
voidcpurun();//cpu模拟运行函数
boolGetPcb();//进程输入函数
voidShowPcb();//将输入的进程展示出来
voidPriModel();//可强占的优先进程调度模式
voidFcfsModel();//先到先服务调度模式
ProcessPcbPcbList[100];//按提交时间排的未就绪进程队列()
主函数调用已定义的各函数,完成进程模拟。
6、测试数据及测试结果
1.开始运行,显示:
2.输入进程数,各进程属性:
关于提交时间执行时间等,将检测输入是否数字,不是数字即退出程序。
3.显示各进程属性,以及关于调度算法的选择项:
此处的优先级数,是用100减去执行时间。
对于优先级数相同,则默认FIFO。
4.测试可强占的优先进程调度:
一次调度完成,将计算此次运行中CPU的利用率。
5.可强占的优先进程调度算法结束,回到算法选择界面:
6.先到先服务调度算法运行情况:
7.选择3,回车,退出程序。
7、设计体会及收获
这次的课程设计给我们很大的收获,使我们对操作系统的基本知识有了进一步的提高,并在实践中对各种概念有了进一步的深化,开始的时候总觉得很简单的课程设计,不过在实际的动手操作中没有想象中的那么轻松。
程序的设计思想的精巧的重要性,是不管怎么说都不为过的,好的设计可以让大家很快的明白你的思想,而且很方便的来实现它。
良好的编程习惯,它可以使你的程序很方便的被别人阅读,也很方便的被更改,所以可以的话,尽可能多的写出注释,没有人会闲你写的太多。
尽可能多的和小组成员讨论,自己写的东西可能存在逻辑上的失误,而自己可能并不知道,或者完成了后才发现自己根本没有符合要求。
在多人一起协调工作的时候,队员的交流是非常重要的,接口的说明和思想的交流都是很关键的部分。
基本的语言功底一定要扎实,通过课程设计,我们有把C++复习了一下,并编程能力也有一定得提高。
从使用的角度对数据结构等课程有了更深入的认识和掌握。
体验了使用MFC开发的过程,很好的巩固了从书本上学到的知识,对更深入的学习VisualC++很有帮助。
尤其在编程过程中得到很多很实用的编程经验。
课程设计结束了,不只学到了设计进程的创建以及状态如何转换的思想,重要的是有了多人合作的经验,这是平时上课或是书本上无法获得的宝贵财富。
8、参考文献
王明,《 Linux操作系统应用教程》陕西科学技术出版社.2006.12
张丽芬,刘利雄.《操作系统实验教程》.清华大学出版社.2011.2
孟静,《操作系统教程--原理和实例分析》等教育出版社.2010.6
周长林,《计算机操作系统教程》等教育出版社.2011.4
张尧学,《计算机操作系统教程》,清华大学出版社.2010.6
任满杰,《操作系统原理实用教程》,电子工业出版社2010.8
9源代码
#include
#include
#include
#include
#include
usingnamespacestd;
//进程的状态
#defineUNREADY0//未就绪
#defineREADY1//就绪
#defineEXECUTE2//执行
#defineEND3//完成
//进程的PCB结构类型定义和结构变量说明
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;
};
//封装CPU调度与分配程序模块。
进程类
classCpuModel
{
public:
CpuModel(){pcbnum=0;}
voidcpurun();//cpu模拟运行函数
boolGetPcb();//进程输入函数
voidShowPcb();//将输入的进程展示出来
voidPriModel();//可强占的优先进程调度模式
voidFcfsModel();//先到先服务调度模式
private:
ProcessPcbPcbList[100];//按提交时间排的未就绪进程队列
intpcbnum;//进程数量
intfreetime;//cpu空闲时间
intallturn;//总周转时间
floatallaver;//总带权周转时间
};
#include
//cpu模拟运行函数
voidCpuModel:
:
cpurun()
{
if(!
GetPcb())//进程输入函数
return;
ShowPcb();//展示所需执行进程信息
intchoose=0;
while
(1)
{
cout<<"***请选择需要模拟的CPU调度算法!
***"<cout<<"***1:
可强占的优先进程调度***"<cout<<"***2:
先到先调度***"<cout<<"***3:
退出系统***"<cout<<"\n***请选择:
";
cin>>choose;
cout<switch(choose)
{
case1:
PriModel();//可强占的优先进程方式
break;
case2:
FcfsModel();//先到先服务调度方式
break;
default:
return;//结束程序
}
cout<}
}
//按进程提交时间排序的比较函数
boolcmp(ProcessPcba,ProcessPcbb)
{
if(a.time_submitreturntrue;
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:
:
GetPcb()
{
charnum[10];
cout<<"***进程调度模拟实验***\n";
cout<<"***计算机科学与技术二班***\n";
cout<<"***温天波***\n";
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;//设置优先级,
//优先级=100-执行时间
cout<}
sort(PcbList,PcbList+pcbnum,cmp);//按提交时间排序
for(i=0;iPcbList[i].pro_id=i+1;//设置Id,根据提交时间
return1;
}
//展示所需执行进程信息
voidCpuModel:
:
ShowPcb()
{
inti;
cout<<"\n***所需执行的进程信息如下***\n";
for(i=0;icout<<"进程编号:
"<"
<"<<<"执行时间:
"<"
<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;//head指针不用,head->next开始为就绪队列
//模拟cpu开始工作
while(head->next!
=NULL||pnum{
Sleep(1000);
time++;//时间片为1
cout<<"*Time:
第"<