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

下载本文档

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

文档简介

课程设计报告课程名称: 操作系统课程设计设计题目:进程同步P、V操作模拟和尚喝水 学 院: 管理工程学院 专 业: 信息管理与信息系统 组 别: 第 组 学生姓名: 孟衡 学 号: 1141807103 指导教师: 张正伟 目录1需求分析21.1需求概述21.2需求设计32功能设计32.1 实现方案42.2模块说明52.3 操作的流程图63开发环境及源程序的主要部分73.1开发环境83.2源程序94测试用例,测试过程及情况分析104.1测试用例134.2测试过程及情况分析145心得体会15进程P、V操作模拟设计 和尚喝水1需求分析1.1需求概述一个寺庙里有小老和尚若干,有一口水井由小和尚挑水入缸给老和尚饮用。水缸可以装10桶水,水取自同一口井,水井口较窄,每次只可容纳一只桶取水,寺庙里一共有3只水桶,每次倒入取用缸中水的量均为1桶,且二者不可同时进行。用P,V操作实现老和尚、小和尚、取水、用水喝水的同步进程控制,水缸水量用semaphore表示,水桶用pail表示,水缸容量用empty表示。1.2需求设计以上问题是进程同步的模拟,可以把井中取水、倒水入缸、用水喝水的过程可以看作是一个个进程的操作,这些进程是互斥的,同时也存在一定的同步关系。通过实际编程时来看,就是随机调用其中一个进程的操作,而这些进程的操作相当于程序中的函数调用。而计算机在执行的每一个时刻只能执行一个操作,这就默认了互斥。还有同步模拟是实现函数调用的前提关系,即先决条件。所以这样进程同步模拟就完全能够通过函数的调用来实现。 具体每一个操作对应的函数变量关系: 水井取水:semaphore小和尚准备取水:mutex1=1 水缸喝水:empty老和尚用桶喝水mutex2=1水缸初始量:full=0(最大值10) 水桶数量:pail=3 2功能设计2.1 实现方案(1)用一个变量full表示没水,初始值为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。(4)若取水、喝水的进程同时处于等待状态时,用水的操作将自动执行等待取水的操作,执行按等待的先后顺序;若水缸满了、桶全用去喝水了的进程同时候处于等待状态时,取水的操作将自动执行等待喝水的操作,按等待的先后顺序进行。(5)用一个随机的函数产生05的6个整数,分别对应六个进程的调用。2.2模块说明2.2.1 main函数 用一个随机的函数产生05的6个整数,分别对应六个进程的调用,调用时程序自动输入,本程序共产生了10次随机的调用进程。2.2.2 6个进程函数 水井取水:semaphore小和尚准备取水:mutex1=1 水缸喝水:empty老和尚用桶喝水mutex2=1水缸初始量:full=0(最大值10) 水桶数量:pail=3 2.2.3 Print函数用于输出取水用水的情况和有哪些进程处于等待状态。2.3 操作的流程图231取水操作小和尚水井取水进程的操作流程图:semaphore:pail=0否否Empty_lay和pail_lay是否为ture是按等待先后顺序调用执行mutex1_lay或mutex2_lay是mutex1进程处于等待状态mutex1调用:pail-1full+1,Print()函数调用执行完毕并返回232用水操作老和尚用水喝水操作流程图:empty操作:full=0否否Semaphore_lay和pail_lay是否为ture是按等待先后顺序调用执行mutex1_lay或mutex2_lay是mutex2进程处于等待状态mutex2调用:full-1empty+1,Print()函数调用执行完毕并返回3开发环境及p、v操作语句的主要部分3.1开发环境 (1)使用系统:Windows 7(2)使用语言:C + +(3)开发工具:VC 6.03.2进程p、v操作原语Main()cobeginget();use();coendGet()/小和尚取水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、水缸容量empty、水缸无水:full、水桶数量pail简记为sem1、sem2、sem3、sem4、sem5、sem6。并规定:假设有5个小和尚同时提水入缸,5个老和尚同时取水喝(每隔一定时间取水一次)。#includewindows.h#includeusing 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,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)WaitForSingleObject(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号小和尚向缸中倒水n,i);EnterCriticalSection(&cs);count+;printf(tt缸中有%d桶n,count);LeaveCriticalSection(&cs);ReleaseSemaphore(sgang,1,NULL);/释放水缸ReleaseSemaphore(stong,1,NULL);/释放水桶printf(%d号小和尚放下了桶n,i);ReleaseSemaphore(full,1,NULL);/水缸中可使用水数量加1return NULL;DWORD WINAPI oldFunc(LPVOID pArg)int i=(int)pArg;while(1)Sleep(4000);WaitForSingleObject(full,INFINITE);/判断水缸是否有水WaitForSingleObject(stong1,INFINITE);/取得水桶printf(ttttt%d号老和尚拿到了桶n,i);WaitForSingleObject(sgang,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() HANDLE young5;HANDLE old5;InitializeCriticalSection(&cs);for(int i=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;备注:需求分析中给了三个木桶,如果对木桶不进行区分的话,则容易产生死锁。当小和尚占用了三个水桶,并且水缸中的水已满,这时候老和尚等待水桶取水,如果没了水桶,老和尚只能等待。小和尚占着水桶,老和尚等待着喝水,但是老和尚没有水桶没法喝,小和尚也只能一直等待。所以产生了死锁,所以才将水桶分开解决死锁。4测试用例,测试过程及情况分析4.1测试用例 由于程序模拟产生10次进程的操作,只需执行相应的函数来自动模拟进程同步就能得测试结果,所以运行程序并做好记录即可。4.2测试过程及情况分析代码连编展示如下: 在win7操作系统下利用vb 6.0编译软件实现从源代码到可执行文件的过程。第一次运行结果如图1为(图1)第二次运行结果如图2、3为: (图2) (图3)5课程设计总结和心得 总结:本次操作系统的课程设计主要解决的是进程中信号量机制的P、V操作问题,在次中过程中通过对信号量问题、pv原语问题、进程同步和互斥问题的分析解决,让我对操作系统课程的知识认识地透彻了,并总结出了一些规律方法。一、利用信号量和PV操作实现进程互斥的一般模型是:进程P1 进程P2 进程Pn P(S); P(S); P(S);临界区; 临界区; 临界区;V(S); V(S); V(S); 其中信号量S用于互斥,初值为1。二、使用PV操作实现进程互斥时应注意:实现互斥的P、V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。若有多个分支,要认真检查其成对性。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

提交评论