操作系统课程设计进程调度的模拟实现Word文档下载推荐.docx
《操作系统课程设计进程调度的模拟实现Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计进程调度的模拟实现Word文档下载推荐.docx(26页珍藏版)》请在冰点文库上搜索。
图1-2进程控制块
CpuModel类成员
Cpurun()
Cpu模拟运行函数
CreatePcb()
进程创建函数
ShowPcb()
进程显示函数
PriModel()
实现优先级调度算法
FcfsModel()
实现先来先服务算法
pcbnum
进程数量
freetime
Cpu空闲时间
allturn
总周转时间
allaver
总带权周转时间
PcbList[]
进程就绪队列的实现
图1-3CpuModel类
程序流程图
1.可强占优先调度算法实现过程流程图:
2先来先服务调度算法实现过程流图
3.数据结构设计
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.创建PCB类classCpuModel,定义程序中使用的各函数:
CpuModel{
CpuModel(){pcbnum=0;
voidcpurun();
//cpu模拟运行函数
boolGetPcb();
//进程输入函数
voidShowPcb();
//将输入的进程展示出来
voidPriModel();
//可强占的优先进程调度模式
voidFcfsModel();
//先到先服务调度模式
ProcessPcbPcbList[100];
//按提交时间排的未就绪进程队列()
4.测试结果及分析
1.开始运行,显示:
2.输入进程数,各进程属性:
关于提交时间执行时间等,将检测输入是否数字,不是数字即退出程序。
3.显示已创建的各进程及其属性:
此处的优先级数,是用100减去执行时间。
对于优先级数相同,则默认FIFO。
4.测试可强占的优先进程调度:
一次调度完成,将计算此次运行中CPU的利用率。
5.先到先服务调度算法运行情况:
6.选择5,回车,退出程序。
五.设计心得
在学完操作系统课程之后,一直对进程调度这一块不是很理解,借着做课程设计的机会,我就选择了进程调度模拟编程这个题目,打算在做课程设计的过程中好好的再学习一下这块的知识。
我在做课程设计的过程中,遇到了许多的问题,通过请教同学,上网查资料等途径一一解决。
通过这次操作系统的课程设计,我研究了进程调度的相关知识,加深了对进程调度的理解。
课程设计和平时的实验课比较起来有很大的差距,实验课只是将这一章的一部分内容练习操作一遍,而课程设计需要的是他们综合起来的东西,这要更难一些。
总体来说我认为操作系统这门学科在计算机科学当中是非常重要的,这次操作系统的课程设计收获颇丰,复习了许多东西,也从新学会了许多东西,我想这也许就是课程设计的最终目的吧。
参考文献
[1]刘振安、刘燕君著.《C++程序设计课程设计》.北京:
机械工业出版社,2004
[2][美]AbrahamSilberschatz,PeterBaerGalvin,GregGagne著.郑扣根译.操作系统概念(第六版).北京:
高等教育出版社,2004
[3]陈向群,向勇等.Windows操作系统原理(第二版).北京:
机械工业出版社,2004.
[4]费翔林,李敏,叶保留等.Linux操作系统实验教程.北京:
高等教育出版社,2009
附录:
#include<
iostream.h>
queue>
string>
windows.h>
malloc.h>
usingnamespacestd;
//进程的状态
#defineUNREADY0//未就绪
#defineREADY1//就绪
#defineEXECUTE2//执行
#defineEND3//完成
//进程的PCB结构类型定义和结构变量说明
structProcessPcb
{
ProcessPcb()
{
next=NULL;
}
//提交时间,从时间的1开始计时
inttime_left;
doubletime_aver;
ProcessPcb*next;
};
//封装CPU调度与分配程序模块。
进程类
classCpuModel
public:
CpuModel()
{
pcbnum=0;
}
voidcpurun();
boolCreatePcb();
voidShowPcb();
voidPriModel();
voidFcfsModel();
private:
ProcessPcbPcbList[100];
//按提交时间排的未就绪进程队列
intpcbnum;
//进程数量
intfreetime;
//cpu空闲时间
intallturn;
//总周转时间
floatallaver;
//总带权周转时间
#include<
algorithm>
//cpu模拟运行函数
voidCpuModel:
:
cpurun()
intchoose=0;
while
(1)
{
cout<
<
"
***主菜单***"
endl;
cout<
----------------------------------"
***1:
创建进程***"
***2:
显示已创建的进程***"
***3:
可强占的优先进程调度***"
***4:
先到先服务调度***"
***5:
退出系统***"
\n***请选择:
"
;
cin>
>
choose;
endl;
switch(choose)
case1:
CreatePcb();
//创建进程
break;
case2:
ShowPcb();
//显示已创建的进程
case3:
PriModel();
//可强占的优先进程方式
break;
case4:
FcfsModel();
//先到先服务调度方式
case5:
return;
//结束程序
}
//按进程提交时间排序的比较函数
boolcmp(ProcessPcba,ProcessPcbb)
if(a.time_submit<
b.time_submit)
returntrue;
returnfalse;
//判断是否数字
intisnumber(chara[])
intlen=strlen(a);
inti,num=0;
if(a[0]>
'
0'
&
a[0]<
='
9'
)
num=a[0]-'
;
elsereturn-1;
for(i=1;
i<
len;
i++)
if(a[i]>
a[i]<
num=num*10+a[i]-'
returnnum;
//进程输入函数
boolCpuModel:
charnum[10];
\n***请输入你想建立的进程个数:
cin>
num;
//输入进程个数
pcbnum=isnumber(num);
if(pcbnum<
=0)
***输入有错***\n"
return0;
}
inti;
for(i=0;
pcbnum;
i++)//输入进程信息
***请依次输入第"
i+1<
个进程的信息***"
*******名字:
PcbList[i].pro_name;
***提交时间:
PcbList[i].time_submit=isnumber(num);
if(PcbList[i].time_submit<
=0)
cout<
return0;
***执行时间:
cin>
PcbList[i].time_exe=isnumber(num);
if(PcbList[i].time_exe<
}
PcbList[i].time_left=PcbList[i].time_exe;
//设置剩余执行时间
PcbList[i].pro_state=UNREADY;
//设置状态为未就绪
PcbList[i].pro_priority=100-PcbList[i].time_exe;
//设置优先级,优先级=100-执行时间
sort(PcbList,PcbList+pcbnum,cmp);
//按提交时间排序
PcbList[i].pro_id=i+1;
//设置Id,根据提交时间
return1;
//展示所需执行进程信息
inti;
\n***所需执行的进程信息如下***\n"
cout<
进程编号:
PcbList[i].pro_id<
进程名字:
<
PcbList[i].pro_name<
提交时间:
PcbList[i].time_submit
执行时间:
PcbList[i].time_exe<
优先级数:
PcbList[i].pro_priority<
//可强占的优先进程调度模式
********可强占的优先进程调度过程如下********\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<
pcbnum)
Sleep(1000);
time++;
//时间片为1
*Time:
第"
time<
秒"
//打印
//进程就绪(查看未就绪的进程中在该时间片是否可以进入就绪队列)
while(pnum<
pcbnum&
PcbList[pnum].time_submit<
=time)
pcb=(ProcessPcb*)malloc(sizeof(ProcessPcb));
*pcb=PcbList[pnum++];
//进入就绪队列
pcb->
next=head->
next;
//插在head之后
next=pcb;
}
//查找在time时间片应该运行的进程
if(head->
next==NULL)
没有可运行的进程"
freetime++;
else
pcb2=head;
pcb=head->
pcb1=head->
//查找当前优先级最高的就绪进程
while(pcb1->
=NULL)
if(pcb->
pro_priority<
=pcb1->
next->
pro_priority)
pcb2=pcb1;
pcb=pcb1->
pcb1=pcb1->
//运行优先级最高的进程
if(pcb->
time_left==pcb->
time_exe)//该进程是否已开始
{
time_start=time;
//设置开始时间
pcb->
pro_state=EXECUTE;
//设置状态为执行
pcb->
pro_priority=pcb->
pro_priority-3;
//优先级数减3
time_left--;
//剩余执行时间减去时间片1
//打印该进程信息
pcb->
pro_id<
<
pro_name<
time_submit<
\n开始时间:
还剩时间:
time_left<
//该进程是否执行结束
time_left==0)
pcb2->
next=pcb2->
//将其在就绪队列中出列
time_end=time;
//设置结束时间
time_turn=pcb->
time_end-pcb->
time_submit+1;
//计算周转时间
time_aver=pcb->
time_turn/(double)pcb->
time_exe;
//计算带权周转时间
pro_state=END;
\n进程"
运行结束:
\n进程名字:
<
time_exe<
开始时间:
结束时间:
time_end<
\n周转时间:
time_turn<
带权周转时间:
time_aver<
}
}
//模拟CPU工作结束
\n所有进程运行完毕!
doublec=(time-freetime)/(double)time*100;
\ncpu利用率:
c<
%"
}//可强占的优先进程调度模式结束
//先到先服务调度模式
********先到先服务进程调度过程如下********\n"
ProcessPcbque[100];
intquef=0,quee=0;
//就绪队列的头指针和尾指针
//模拟cpu开始工作
while(quef<
quee||pnum<
Sleep(1000);
//打印
//进程就绪(查看未就绪的进程中在该时间片是否可以进入就绪队列)
while(pnum<
que[quee++]=PcbList[pnum++];
//查找time时间片的运行进程
if(quef==quee)
{
//运行进程
if(que[quef].time_left==que[quef].time_exe)//该进程是否已开始
que[quef].time_start=time;
que[quef].pro_state=EXECUTE;
que[quef].time_left--;
//打印进程信息
que[quef].pro_id<
que[quef].pro_name<
que[quef].time_submit<
que[quef].time_exe
que[quef].time_start<
que[quef].time_left<