进程管理模拟系统实验报告Word下载.docx
《进程管理模拟系统实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《进程管理模拟系统实验报告Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
二、实验内容
学习进程管理的设计与实现,学习和运用操作系统原理,设计一个操作系统子系统的模拟系统。
通过该系统的设计调试可增加对操作系统实现的感知性。
设计一个允许n个进程并发运行的进程管理的模拟系统。
该系统包括简单的进程控制、同步及通信机构,其进程调度算法可任意选择。
分析系统所需的数据结构、算法的流程以及化分各个功能模块。
三、实验要求
要求学生熟悉进程概念及进程管理的各部分内容。
要求学生明确进程管理中需要的数据结构、控制机构的基本原理。
将分析程序结果写入“实验结果与分析”中,其中包括:
程序的模块功能、程序的流程。
将对进程管理的实现与概念的联系与体验写入“实验体会与评价”中。
四、实验原理
进程管理包括进程的控制、阻塞、唤醒与撤消。
进程在运行过程中状态在不断的变化。
进程运行过程中,因为竞争资源而需对它们进行同步控制。
所有这些在操作系统中用数据结构PCB来记录,系统通过PCB控制进程的运行。
在单处理机系统中,多道程序的引入,需要进程的调度程序来选择一个进
程进行运行。
比如常用的先来先服务、短进程 优和优先级优先等等,也可以选择它们的结合调度算法。
五、实验设计与流程
实验设计:
(1)设计原理:
本进程管理模拟程序采用先来先服务的进程调度方法,以及分时间片运行的进程执行方法。
创建进程后,将进程设置为就绪状态放入就绪队列,然后系统从就绪队列中掉出一个进程,申请系统资源(进行P操作)。
若申请到资源则分一时间片运行,时间片到后将该进程放回就绪队列;
若没有申请到资源,则对该进程进行现场保护
(用一数据量模拟),将其放入阻塞队列,知道有一占有资源的进程执行完成释放资源后(进行V操作),再将阻塞队列中被阻塞的进程唤醒,调入就绪队列,按照其PCB中保存的处理机状态进行执行。
本进程管理模拟程序适用于N个进程,可在执行阶段任意添加进程。
(2)数据结构:
本进程管理模拟程序所用到的数据结构
//进程PCBstructPCB
{
//进程标示charid;
//进程状态intstatus;
//进程所需运行时间inttime;
//判断是否占有资源的变量,1为占有资源,0为未占有资源(初始化为0)intresource;
//是否申请过资源,1为申请过资源,0为未申请资源(初始化为0)intwheapplied;
//等待队列指针,指向同一状态下的前一个进程PCB*prewp;
//等待队列指针,指向同一状态下的下一个进程PCB*nextwp;
};
//执行进程指针externPCB*exe;
//时间片设定externinttime_slice;
//进程互斥使用的系统资源信号量
externintsemaphore;
//资源信号量
//定义了进程的状态宏
#defineEXECUTE101 //执行状态
#defineREADY 110 //就绪状态
#defineJAM 111 //阻塞状态
系统执行指
针(exe)
无进程执行
就绪队列
限制解除
阻塞队列
资源限制
是否资源限制
否
执行
是
进入阻塞队列
时间片运行结束
分时间片运行
(3)实验流程图如下页所示:
系统进程调度逻辑图:
时间片到
开始
系统运行流程图:
加入就绪队列
创建进程
六、本次实验源程序
DataStructure.h文件(包含程序中用到的所有数据结构和全局变量):
//此文件包含了工程所需的数据结构的定义#ifndefData_Sturcture_HHHHHHHH#defineData_Sturcture_HHHHHHHH
//执行进程指针externPCB*exe;
//时间片设置externinttime_slice;
#endif//Data_Sturcture_HHHHHHHH
JamQueue.h文件(阻塞队列类的定义):
//定义了创建阻塞队列的类JamQueue的接口文件
#ifndefJam_Queue_HHHHHHHH#defineJam_Queue_HHHHHHHH
#include"
DataStructure.h"
classJamQueue
private:
//指向阻塞队列的头指针PCB*jam_head;
//指向阻塞队列的尾指针
PCB*jam_tail;
public:
JamQueue();
//默认构造函数
//初始化一个空队列
PCB*getHead();
//获取对象队列的头指针
PCB*getTail();
//获取对象队列的尾指针
voidenterJamQueue(PCB*pcb);
//传入指向一个进程PCB的指针
//将该进程插入阻塞队列
voidexitJamQueue(PCB*pcb);
//将从阻塞队列中调出的进程从队列中删除
//释放该进程空间
~JamQueue();
//删除该队列并释放其空间
#endif//Jam_Queue_HHHHHHHH
ReadyQueue.h文件(就绪队列类的定义):
//定义了创建就绪队列的类ReadyQueue的接口文件
#ifndefReady_Queue_HHHHHHHH#defineReady_Queue_HHHHHHHH
#include"
classReadyQueue
//就绪队列的头指针PCB*ready_head;
//就绪队列的尾指针PCB*ready_tail;
public:
ReadyQueue();
voidenterReadyQueue(PCB*pcb);
//将该进程插入就绪队列
voidexitReadyQueue(PCB*pcb);
//将从就绪队列中调出的进程从队列中删除
~ReadyQueue();
#endif//Ready_Queue_HHHHHHHH
Functions.h文件(定义并实现了main中使用的函数):
//定义了一些在main.cpp中使用的函数
#ifndefFunctions_HHHHHHHH#defineFunctions_HHHHHHHH
#include<
iostream>
#include"
ReadyQueue.h"
JamQueue.h"
usingnamespacestd;
voidP(int&
sem)
//信号量P操作
sem-=1;
}
voidV(int&
//信号量V操作
if(sem<
3)
sem+=1;
else
if(sem>
cout<
<
"
资源信号量出错!
endl;
voidcreateProcess(ReadyQueue&
rq) //创建进程函数
//传入就绪队列的对象
//创建一个进程,其id,priority,time由键盘输入,status为READY,prewp和nextwp为NULL
//将该进程放入就绪队列,返回指向这个进程PCB的指针
PCB*pcb;
pcb=newPCB();
char_id;
int _time;
请输入进程的ID:
"
cin>
>
_id;
pcb->
id=_id;
请输入完成进程所需的运行时间"
_time;
time=_time;
status=READY;
pcb->
resource=0;
wheapplied=0;
prewp=NULL;
nextwp=NULL;
rq.enterReadyQueue(pcb);
voidshowProcess(ReadyQueuerq,JamQueuejq) //进程运行状态的输出函数
当前可用的资源数量为:
semaphore<
if(NULL==exe)
cout<
正在执行的进程为:
无"
完成所需为:
无"
进程状态:
exe->
id<
time
status<
PCB*iterator_1;
iterator_1=rq.getHead();
if(NULL==iterator_1)
就绪队列为空。
while(NULL!
=iterator_1)
PCB*temp;
temp=iterator_1;
就绪队列中的进程有:
temp->
iterator_1=temp->
nextwp;
PCB*iterator_2;
iter