进程管理模拟系统实验报告.docx
《进程管理模拟系统实验报告.docx》由会员分享,可在线阅读,更多相关《进程管理模拟系统实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
![进程管理模拟系统实验报告.docx](https://file1.bdocx.com/fileroot1/2022-10/8/12f991c3-604e-403a-9596-d6a358622688/12f991c3-604e-403a-9596-d6a3586226881.gif)
学生实验报告
实验课名称:
操作系统
实验项目名称:
进程管理模拟系统专 业 名 称:
软件工程
班 级:
24060801
学 号:
2406080111
学 生 姓 名:
綦舰教 师 姓 名:
李芳
2010年06月29日
一、实验项目名称
进程管理模拟系统
组长:
綦舰 组员:
无系统采用语言:
C++
系统支持平台:
windows操作系统(安装visual c++)
二、实验内容
学习进程管理的设计与实现,学习和运用操作系统原理,设计一个操作系统子系统的模拟系统。
通过该系统的设计调试可增加对操作系统实现的感知性。
设计一个允许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
//进程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 //阻塞状态
#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"DataStructure.h"classReadyQueue
{
private:
//就绪队列的头指针PCB*ready_head;
//就绪队列的尾指针PCB*ready_tail;
public:
ReadyQueue();
//默认构造函数
//初始化一个空队列
PCB*getHead();
//获取对象队列的头指针
PCB*getTail();
//获取对象队列的尾指针
voidenterReadyQueue(PCB*pcb);
//传入指向一个进程PCB的指针
//将该进程插入就绪队列
voidexitReadyQueue(PCB*pcb);
//将从就绪队列中调出的进程从队列中删除
//释放该进程空间
~ReadyQueue();
//删除该队列并释放其空间
};
#endif//Ready_Queue_HHHHHHHH
Functions.h文件(定义并实现了main中使用的函数):
//定义了一些在main.cpp中使用的函数
#ifndefFunctions_HHHHHHHH#defineFunctions_HHHHHHHH
#include#include"DataStructure.h"#include"ReadyQueue.h"#include"JamQueue.h"
usingnamespacestd;voidP(int&sem)
//信号量P操作
{
sem-=1;
}
voidV(int&sem)
//信号量V操作
{
if(sem<3)
sem+=1;
else
{
}
}
if(sem>3)
cout<<"资源信号量出错!
"<voidcreateProcess(ReadyQueue&rq) //创建进程函数
//传入就绪队列的对象
//创建一个进程,其id,priority,time由键盘输入,status为READY,prewp和nextwp为NULL
//将该进程放入就绪队列,返回指向这个进程PCB的指针
{
PCB*pcb;pcb=newPCB();
char_id;int _time;
cout<<"请输入进程的ID:
"<>_id;
pcb->id=_id;
cout<<"请输入完成进程所需的运行时间"<>_time;
pcb->time=_time;
pcb->status=READY;pcb->resource=0;
pcb->wheapplied=0;pcb->prewp=NULL;pcb->nextwp=NULL;
rq.enterReadyQueue(pcb);
}
voidshowProcess(ReadyQueuerq,JamQueuejq) //进程运行状态的输出函数
{
cout<<"当前可用的资源数量为:
"<if(NULL==exe)
{
}
else
{
}
cout<<"正在执行的进程为:
"<<"无"<<"完成所需为:
"<<"无"
<<"进程状态:
"<<"无"<cout<<"正在执行的进程为:
"<id<<"完成所需为:
"<time
<<"进程状态:
"<status<PCB*iterator_1;iterator_1=rq.getHead();if(NULL==iterator_1)
cout<<"就绪队列为空。
"<else
{
while(NULL!
=iterator_1)
{
PCB*temp;temp=iterator_1;
cout<<"就绪队列中的进程有:
"<id<<"完成所需为:
"<time
<<"进程状态:
"<status<iterator_1=temp->nextwp;
}
}
PCB*iterator_2;iter