操作系统课程设计报告之和尚喝水孟衡_第1页
操作系统课程设计报告之和尚喝水孟衡_第2页
操作系统课程设计报告之和尚喝水孟衡_第3页
操作系统课程设计报告之和尚喝水孟衡_第4页
操作系统课程设计报告之和尚喝水孟衡_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、程设计报告课程名称:操作系统课程设计设计题目: 进程同步P、 V操作模拟 和尚喝水学院:管理工程学院专业:信息管理与信息系统组别: 第组学生姓名: 孟衡 学号 :1141807103指导教师:张正伟 TOC o 1-5 h z 需求分析3. HYPERLINK l bookmark9 o Current Document 需求概述3. HYPERLINK l bookmark11 o Current Document 需求设计3. HYPERLINK l bookmark13 o Current Document 功能设计4. HYPERLINK l bookmark15 o Current

2、Document 实现方案4. HYPERLINK l bookmark17 o Current Document 模块说明5. HYPERLINK l bookmark19 o Current Document 操作的流程图6.开发环境及源程序的主要部分7. HYPERLINK l bookmark23 o Current Document 开发环境8.源程序 9. HYPERLINK l bookmark27 o Current Document 测试用例,测试过程及情况分析1.0 HYPERLINK l bookmark29 o Current Document 测试用例1.3. HYP

3、ERLINK l bookmark31 o Current Document 测试过程及情况分析1.4心得体会1.5.进程P、 V操作模拟设计和尚喝水需求分析需求概述一个寺庙里有小老和尚若干,有一口水井由小和尚挑水入缸给老和尚饮用。水缸可以装10 桶水,水取自同一口井,水井口较窄,每次只可容纳一只桶取水,寺庙里一共有3 只水桶,每次倒入取用缸中水的量均为1 桶,且二者不可同时进行。用P, V操作实现老和尚、小和尚、取水、用水喝水的同步进程控制,水缸水量用semaphore表示,水桶用pail 表示,水缸容量用empty表示。需求设计以上问题是进程同步的模拟,可以把井中取水、倒水入缸、用水喝水的

4、过程可以看作是一个个进程的操作,这些进程是互斥的,同时也存在一定的同步关系。通过实际编程时来看,就是随机调用其中一个进程的操作,而这些进程的操作相当于程序中的函数调用。而计算机在执行的每一个时刻只能执行一个操作,这就默认了互斥。还有同步模拟是实现函数调用的前提关系,即先决条件。所以这样进程同步模拟就完全能够通过函数的调用来实现。具体每一个操作对应的函数变量关系:水井取水:semaphore小和尚准备取水:mutex1=1水缸喝水:empty老和尚用桶喝水mutex2=1水缸初始量:full=0(最大值10)水桶数量:pail=3功能设计实现方案(1)用一个变量full 表示没水,初始值为0,当

5、取水时full 加 1,用水时full减1。变量full=10 是最大值,当值为10 时表示水缸已经满,此时若进行装水操作,则将处于等待状态;为0 时表示水缸无水,此时若进行用水喝水操作,则操作将处于等待状态。(2)变量mutex1 和 mutex2分别表示小和尚取水和老和尚喝水,初始都为1,semaphore=mutex1+mutex2。(3)用6 个 bool 型的变量full_lag, semaphore_lag, mutex1_lag, mutex2_lagempty_lag, psil_lag 表示六个进程是否处于等待状态。处于等待时,变量值为true。(4)若取水、喝水的进程同时处

6、于等待状态时,用水的操作将自动执行等待取水的操作,执行按等待的先后顺序;若水缸满了、桶全用去喝水了的进程同时候处于等待状态时,取水的操作将自动执行等待喝水的操作,按等待的先后顺序进行。(5)用一个随机的函数产生0 5 的 6 个整数,分别对应六个进程的调用。模块说明main 函数用一个随机的函数产生0 5 的 6 个整数,分别对应六个进程的调用,调用时程序自动输入,本程序共产生了10 次随机的调用进程。6 个进程函数水井取水:semaphore小和尚准备取水:mutex1=1水缸喝水:empty老和尚用桶喝水mutex2=1水缸初始量:full=0(最大值10)水桶数量:pail=32.2.3

7、 Print 函数用于输出取水用水的情况和有哪些进程处于等待状态。操作的流程图31 取水操作小和尚水井取水进程的操作流程图:3 2 用水操作老和尚用水喝水操作流程图:mutex2 进程处于等待状态开发环境及p、v 操作语句的主要部分开发环境( 1)使用系统:Windows 72)使用语言:C + +3)开发工具:VC 6.0进程p、v 操作原语Main()cobeginget(); use(); coend Get() / 小和尚取水while (true)p(empty)p(count)P(mutex1)从井中取水;v(mutex1) ;P(mutex2) ;将水倒入缸中;v (mutex2

8、) ;v (full) ;v (pail) ;Use() / 老和尚 while(true) p (full)p(count)P(mutex2)从缸中取水;v (mutex2) ;v(empty) ;喝水;v (count) ;3.2.1C + + 源代码为了便捷地编写程序,特地把水缸水量semaphore、小和尚准备取水mutex1、从水井中取水mutex2、水缸容量empty、水缸无水:full 、水桶数量pail 简记为 sem1、 sem2、 sem3、 sem4、 sem5、 sem6。并规定: 假设有 5 个小和尚同时提水入缸,5 个老和尚同时取水喝(每隔一定#includewin

9、dows.h#include using namespace std;水井的信号量小和尚用水桶的信号量老和尚用水桶的信号量水缸的信号量缸中可取水的桶数缸中可容纳的水桶数HANDLE sjing=CreateSemaphore(NULL,1,1,sem1);/HANDLE stong=CreateSemaphore(NULL,2,2,sem2);/HANDLE stong1=CreateSemaphore(NULL,1,1,sem3);/HANDLE sgang=CreateSemaphore(NULL,1,1,sem4);/HANDLE full=CreateSemaphore(NULL,0,

10、10,sem5);/HANDLE empty=CreateSemaphore(NULL,10,10,sem6);/ int count=0;CRITICAL_SECTION cs;DWORD WINAPI youngFunc(LPVOID pArg) inti=(int)pArg;while(1)WaitForSingleObject(stong,INFINITE);/小和尚先取得水桶printf(%d号小和尚拿到了桶n,i);WaitForSingleObject(sjing,INFINITE);/小和尚先取得水井printf(%d号小和尚打上了水n,i);ReleaseSemaphore(

11、sjing,1,NULL);/ 小和尚释放水井Sleep(1000);WaitForSingleObject(empty,INFINITE);/判断水缸是否已满WaitForSingleObject(sgang,INFINITE);/取得水缸的使用printf(tt%d 号小和尚向缸中倒水n,i);EnterCriticalSection(&cs); count+; printf(tt 缸中有%d桶 n,count);LeaveCriticalSection(&cs); ReleaseSemaphore(sgang,1,NULL);/ 释放水缸 ReleaseSemaphore(stong,1

12、,NULL);/ 释放水桶 printf(%d 号小和尚放下了桶n,i);ReleaseSemaphore(full,1,NULL);/ 水缸中可使用水数量加1return NULL;DWORD WINAPI oldFunc(LPVOID pArg) inti=(int)pArg;while(1)Sleep(4000);判断水缸是否有水取得水桶WaitForSingleObject(full,INFINITE);/WaitForSingleObject(stong1,INFINITE);/printf(ttttt%d号老和尚拿到了桶n,i);WaitForSingleObject(sgang,

13、INFINITE);/ 取得水缸的使用printf(ttttt%d号老和尚喝到了水n,i);EnterCriticalSection(&cs);count-;printf(tt 缸中有 %d桶 n,count);LeaveCriticalSection(&cs);ReleaseSemaphore(sgang,1,NULL);/ 释放水缸ReleaseSemaphore(stong1,1,NULL);/ 释放水桶printf(ttttttt%d号老和尚放下了桶n,i);ReleaseSemaphore(empty,1,NULL);/ 水缸中可放水数量加1return NULL;int main(

14、)HANDLE young5;HANDLE old5;InitializeCriticalSection(&cs);for(inti=0;i5;i+)youngi=CreateThread(NULL,0,youngFunc,LPVOID(i),NULL,NULL);oldi=CreateThread(NULL,0,oldFunc,LPVOID(i),NULL,NULL);HANDLE p2;p0=young;p1=old;WaitForMultipleObjects(5,p,TRUE,INFINITE);getchar();return 0;备注: 需求分析中给了三个木桶,如果对木桶不进行区分

15、的话,则容易产生死锁。 当小和尚占用了三个水桶,并且水缸中的水已满,这时候老和尚等待水桶取水,如果没了水桶,老和尚只能等待。小和尚占着水桶,老和尚等待着喝水,但是老和尚没有水桶没法喝,小和尚也只能一直等待。所以产生了死锁,所以才将水桶分开解决死锁。4 测试用例,测试过程及情况分析测试用例由于程序模拟产生10 次进程的操作,只需执行相应的函数来自动模拟进程同步就能得测试结果,所以运行程序并做好记录即可。测试过程及情况分析代码连编展示如下:在 win7 操作系统下利用vb 6.0 编译软件实现从源代码到可执行文件的过程1为(图 1)2、 3 为:( 图 2) ( 图 3) 5 课程设计总结和心得总

16、结: 本次操作系统的课程设计主要解决的是进程中信号量机制的P、 V操作问题,在次中过程中通过对信号量问题、pv 原语问题、进程同步和互斥问题的分析解决,让我对操作系统课程的知识认识地透彻了,并总结出了一些规律方法。一、利用信号量和PV操作实现进程互斥的一般模型是:进程 P1 进程 P2 进程 PnP(S); P(S); P(S);临界区 ; 临界区 ; 临界区 ;V(S); V(S); V(S); TOC o 1-5 h z 其中信号量S 用于互斥,初值为1。二、使用PV操作实现进程互斥时应注意:实现互斥的P、 V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。若有多个分支,要认

17、真检查其成对性。P、 V操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环。互斥信号量的初值一般为1。三、利用信号量和PV操作实现进程同步:PV操作同步机制,即用一个信号量与一个消息联系起来,当信号量的值为0 时,表示期望的消息尚未产生;当信号量的值非0 时,表示期望的消息已经存在。用PV操作实现进程同步时,调用P操作测试消息是否到达,调用V操作发送消息。四、使用PV操作实现进程同步时应注意:分析进程间的制约关系,确定信号量种类。在保持进程间有正确的同步关系情况下,哪个进程先执行,哪些进程后执行,彼此间通过什么资源( 信号量 )进行协调,从而明确要设置哪些信号量。信号量的初值与相应资源的数量有关,也与P、 V操作在程序代码中出现的位置有关。同一信号量的P、 V操作要成对出现,但它们分别在不同的进程代码中。心得: 因为想给自己一个挑战,所以我选择了一个人来独自完成本次设计的课题,期间虽然自己的专业知识不够硬屡屡在代码编写时碰壁,但是功夫不负有心人,经过多次试

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论