进程管理模拟系统实验报告.docx

上传人:b****1 文档编号:266182 上传时间:2022-10-08 格式:DOCX 页数:15 大小:37.51KB
下载 相关 举报
进程管理模拟系统实验报告.docx_第1页
第1页 / 共15页
进程管理模拟系统实验报告.docx_第2页
第2页 / 共15页
进程管理模拟系统实验报告.docx_第3页
第3页 / 共15页
进程管理模拟系统实验报告.docx_第4页
第4页 / 共15页
进程管理模拟系统实验报告.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

进程管理模拟系统实验报告.docx

《进程管理模拟系统实验报告.docx》由会员分享,可在线阅读,更多相关《进程管理模拟系统实验报告.docx(15页珍藏版)》请在冰豆网上搜索。

进程管理模拟系统实验报告.docx

学生实验报告

实验课名称:

操作系统

实验项目名称:

进程管理模拟系统专 业 名 称:

软件工程

班 级:

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

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

当前位置:首页 > 高中教育 > 初中教育

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

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