操作系统课程设计报告之和尚喝水孟衡

上传人:第*** 文档编号:56920878 上传时间:2018-10-17 格式:DOCX 页数:16 大小:694.18KB
返回 下载 相关 举报
操作系统课程设计报告之和尚喝水孟衡_第1页
第1页 / 共16页
操作系统课程设计报告之和尚喝水孟衡_第2页
第2页 / 共16页
操作系统课程设计报告之和尚喝水孟衡_第3页
第3页 / 共16页
操作系统课程设计报告之和尚喝水孟衡_第4页
第4页 / 共16页
操作系统课程设计报告之和尚喝水孟衡_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《操作系统课程设计报告之和尚喝水孟衡》由会员分享,可在线阅读,更多相关《操作系统课程设计报告之和尚喝水孟衡(16页珍藏版)》请在金锄头文库上搜索。

1、课程设计报告课程名称:课程名称: 操作系统课程设计设计题目设计题目:进程同步 P、V 操作模拟和尚喝水学学 院:院: 管理工程学院 专专 业:业: 信息管理与信息系统 组组 别:别: 第 组 学生姓名学生姓名: : 孟衡 学学 号号: 1141807103 指导教师指导教师: 张正伟 2目录1 需求分析.21.1 需求概述.21.2 需求设计.32 功能设计.32.1 实现方案42.2 模块说明.52.3 操作的流程图63 开发环境及源程序的主要部分.73.1 开发环境.83.2 源程序.94 测试用例,测试过程及情况分析.104.1 测试用例.134.2 测试过程及情况分析.145 心得体会

2、.153进程 P、V 操作模拟设计和尚喝水1 需求分析需求分析1.11.1 需求概述需求概述一个寺庙里有小老和尚若干,有一口水井由小和尚挑水入缸给老和尚饮用。水缸可以装 10 桶水,水取自同一口井,水井口较窄,每次只可容纳一只桶取水,寺庙里一共有 3 只水桶,每次倒入取用缸中水的量均为 1 桶,且二者不可同时进行。用 P,V 操作实现老和尚、小和尚、取水、用水喝水的同步进程控制,水缸水量用 semaphore 表示,水桶用 pail 表示,水缸容量用 empty 表示。1.21.2 需求设计需求设计以上问题是进程同步的模拟,可以把井中取水、倒水入缸、用水喝水的过程可以看作是一个个进程的操作,这

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

4、始值为 0,当取水时 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_lag empty_lag,psil_lag 表示六个进程是否处于等待状态。处于等待时,变量值为true

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

6、尚用桶喝水 mutex2=1水缸初始量:full=0(最大值 10)水桶数量:pail=3 2.2.3 Print 函数函数用于输出取水用水的情况和有哪些进程处于等待状态。2.32.3 操作的流程图操作的流程图231 取水操作取水操作小和尚水井取水进程的操作流程图:semaphore:pail=0否否Empty_lay 和 pail_lay 是否 为 ture是按等待先后顺序调用执行 mutex1_lay 或 mutex2_lay是mutex1 进程处于等待状态mutex1 调用:pail-1 full+1,Print()函数调用执行完毕并返回6232 用水操作用水操作老和尚用水喝水操作流程图

7、:empty 操作:full=0否否Semaphore_lay 和 pail_lay 是否为 ture是按等待先后顺序调用执行 mutex1_lay 或 mutex2_lay是mutex2 进程处于等待状态mutex2 调用:full-1 empty+1,Print()函数调用执行完毕并返回3 3 开发环境及开发环境及 p p、v v 操作语句的主要部分操作语句的主要部分3.13.1 开发环境开发环境(1)使用系统:Windows 7(2)使用语言:C + +(3)开发工具:VC 6.073.23.2 进程进程 p p、v v 操作原语操作原语Main() cobegin get(); use

8、(); coend Get() /小和尚取水while (true) p(empty) p(count) P(mutex1) 从井中取水; v(mutex1) ;P(mutex2) ;将水倒入缸中;v (mutex2) ;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、水

9、缸容量 empty、水缸无水:full、水桶数量pail 简记为 sem1、sem2、sem3、sem4、sem5、sem6。并规定:假设有 5 个小和尚同时提水入缸,5 个老和尚同时取水喝(每隔一定时间取水一次) 。8#include“windows.h“ #include using namespace std;HANDLE sjing=CreateSemaphore(NULL,1,1,“sem1“);/水井的信号量 HANDLE stong=CreateSemaphore(NULL,2,2,“sem2“);/小和尚用水桶的信号量 HANDLE stong1=CreateSemaphore

10、(NULL,1,1,“sem3“);/老和尚用水桶的信号量 HANDLE sgang=CreateSemaphore(NULL,1,1,“sem4“);/水缸的信号量 HANDLE full=CreateSemaphore(NULL,0,10,“sem5“);/缸中可取水的桶数 HANDLE empty=CreateSemaphore(NULL,10,10,“sem6“);/缸中可容纳的水桶数int count=0; CRITICAL_SECTION cs;DWORD WINAPI youngFunc(LPVOID pArg) int i=(int)pArg; while(1) WaitFor

11、SingleObject(stong,INFINITE);/小和尚先取得水桶 printf(“%d 号小和尚拿到了桶n“,i); WaitForSingleObject(sjing,INFINITE);/小和尚先取得水井 printf(“%d 号小和尚打上了水n“,i); ReleaseSemaphore(sjing,1,NULL);/小和尚释放水井Sleep(1000); WaitForSingleObject(empty,INFINITE);/判断水缸是否已满 WaitForSingleObject(sgang,INFINITE);/取得水缸的使用 printf(“tt%d 号小和尚向缸中

12、倒水n“,i);EnterCriticalSection( count+; printf(“tt 缸中有%d 桶n“,count);LeaveCriticalSection( ReleaseSemaphore(sgang,1,NULL);/释放水缸 ReleaseSemaphore(stong,1,NULL);/释放水桶 printf(“%d 号小和尚放下了桶n“,i); ReleaseSemaphore(full,1,NULL);/水缸中可使用水数量加 1 return NULL; 9DWORD WINAPI oldFunc(LPVOID pArg) int i=(int)pArg; whi

13、le(1) Sleep(4000); WaitForSingleObject(full,INFINITE);/判断水缸是否有水 WaitForSingleObject(stong1,INFINITE);/取得水桶 printf(“ttttt%d 号老和尚拿到了桶n“,i); WaitForSingleObject(sgang,INFINITE);/取得水缸的使用 printf(“ttttt%d 号老和尚喝到了水n“,i);EnterCriticalSection( count-; printf(“tt 缸中有%d 桶n“,count);LeaveCriticalSection( Release

14、Semaphore(sgang,1,NULL);/释放水缸 ReleaseSemaphore(stong1,1,NULL);/释放水桶 printf(“ttttttt%d 号老和尚放下了桶n“,i); ReleaseSemaphore(empty,1,NULL);/水缸中可放水数量加 1 return NULL; int main() HANDLE young5; HANDLE old5; InitializeCriticalSection(for(int i=0;i5;i+) youngi=CreateThread(NULL,0,youngFunc,LPVOID(i),NULL,NULL);

15、 oldi=CreateThread(NULL,0,oldFunc,LPVOID(i),NULL,NULL); HANDLE p2; p0=young; p1=old; WaitForMultipleObjects(5,p,TRUE,INFINITE); getchar();return 0; 10备注:备注:需求分析中给了三个木桶,如果对木桶不进行区分的话,则容易产生 死锁。当小和尚占用了三个水桶,并且水缸中的水已满,这时候老和尚等待水 桶取水,如果没了水桶,老和尚只能等待。小和尚占着水桶,老和尚等待着喝 水,但是老和尚没有水桶没法喝,小和尚也只能一直等待。所以产生了死锁, 所以才将水桶分开解决死锁。4 4 测试用例,测试过程及情况分析测试用例,测试过程及情况分析4.14.1 测试用例测试用例由于程序模拟产生 10 次进程的操作,只需执行相应的函数来自动模拟进 程同步就能得测试结果,所以运行程序并做好记录即可。4.24.2 测试测试过程及情况分析过程及情况分析代码连编展示如下:在 win7 操作系统下利用 vb 60 编译软件实现从源代码到可执行文件的过程。1112第一次运行结果如图 1 为( (图图 1)1)13第二次运行结果如图 2、3 为

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号