好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

进程之间得同步互斥与通信理发师问题操作系统课程设计.docx

8页
  • 卖家[上传人]:hua****92
  • 文档编号:287562321
  • 上传时间:2022-05-03
  • 文档格式:DOCX
  • 文档大小:20.31KB
  • / 8 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 进程之间得同步互斥与通信理发师问题操作系统课程设计操作系统课程设计信息科学与工程学院软件实践实训报告2目录1.课程设计目的.32.设计要求.33.问题具体描述.34.设计分析.35.设计分工.46.数据结构说明.47.系统结构说明.48.系统调用说明.49.分工设计说明.510.算法流程图.511.分工代码.612.整体代码.713.程序运行.1014.总结.11信息科学与工程学院软件实践实训报告31.课程设计目的1.内容围绕操作系统原理中最重要的基本概念和基本原理展开2.巩固对原理知识的学习效果3.加深对基本概念的理解4.学习如何将基本原理和实际设计、应用有机结合5.锻炼本专业的基本能力2.设计要求1:进程间通信、并发(同步/互斥)、文件读写2:内存管理、Dll、Windows消息机制、IO(尚未最终定型)3.问题具体描述1.完成N个生产者和M个消费者之间的并发控制,N、M不低于5,数据发送和接收缓冲区大小不小于10个 2.某个生产者进程生产的消息供K个消费者进程消费 K=M 某些消费进程消费多个生产者生产的消息 生产者和消费者之间的对应关系可以在程序开始有一个文件中读入,也可以动态调整。

      3.每个生产进程生产M个消息后结束运行 如果一个消费者进程没有对应的生产者进程在运行后,也结束运行 4.设计分析课程设计的主要目的是了解并且掌握进程之间的同步互斥,和进程之间的通信问题 结合课本上的生产者与消费者问题可以从这方面来实现一个多进程的小系统,并且解决多个进程之间的通信,并发等问题,以此来达到课程设计的目的 理发师问题是将顾客看做生产者,将理发师作为消费者 设置一定数量的椅子的数目来作为缓存区的大小 顾客来到的时候坐在椅子上,将自己作为“产品”,理发师理发的时候从椅子上叫走顾客,相当于消费“产品”,从而达到了课程设计要求的前一个要求 顾客作为生产者,每到来一个就使计数器count增加1,以便让理发师理发(相当于消费)至最后一个顾客(相当于产品) 并且,第1个到来的顾客应负责唤醒理发师;如果不是第1个到达的顾客,则在有空椅子的情况下坐下等待,否则离开理发店(该消息可由计数器count获得) 主要有以下一些函数来实现整个问题的实现过程:(1)用随机函数random()来产生进入理发店的顾客 (2)定义理发师的理发函数cuthair()用来实现理发操作。

      (3)定义顾客被理发的函数gethaircut()用来实现顾客被理发的操作 (4)用顾客线程customer实现对顾客行为的控制 (5)用理发师线程barber实现对理发师行为的控制 (6)定义主函数main实现对两个线程的控制和执行操作 信息科学与工程学院软件实践实训报告45.设计分工成员:李宁侯绍立分工:理发师进程、信号量的设置、理发师函数:xxx顾客进程、顾客函数、主函数:xx6.数据结构说明本程序用到了数据结构中的队列,理发的顾客由随机函数产生,顾客遵从先到先理发的原则,但队列的长度限制为输入的理发店中的椅子的个数,当理发店的椅子没有空位的时候,到来的顾客主动退出加入队列 理发师对队列中的顾客进行先到先服务的原则理发 7.系统结构说明(一)头文件声明#includewindows.h#includeiostream.h#includemath.h(二)定义各种变量intlongwaiting(0);intchairs;charopen_door;charclose_door;intcount(0);intfinish(0);(三)信号量的定义HANDLEMutex=:CreateMutex(NULL,FALSE,Mutex);HANDLEbarbers=:CreateSemaphore(NULL,1,1,barbers);HANDLEcustomers=:CreateSemaphore(NULL,0,3,customers);8.系统调用说明(1)CreateThread():创建线程(2)CreateMutex():找出当前系统是否已经存在指定进程的实例。

      如果没有则创建一个互斥体,用来同步 如果一个线程获取了互斥体,则要获取该互斥体的第二个线程将被挂起,直到第一个线程释放该互斥体 CreateMutex()函数可用来创建一个有名或无名的互斥量对象(3)CreateSemaphore():CreateSemaphore()是系统提供的API,包含在Windows.h中,应用在同步的处理中 作用是创建一个新的信号机,执行成功,返回信号机对象的句柄;信息科学与工程学院软件实践实训报告5零表示出错 一旦不再需要,一定记住用CloseHandle关闭信号机的句柄 它的所有句柄都关闭以后,对象自己也会删除 一旦值大于零,信号机就会触发(发出信号) Semaphore是一个同步问题机制,不论是Event或Mutex,其他Process在执WaitForSingleObject时,就看当时的物件是Signal或UnSignal而决定是否等待,而Semaphore也相同,但是它要变成Signal/UnSignal的状态,却有些不同,它是提供一个计数值,它允许在这个计数值之内,任何执行到WaitForSingleObject的Thread都不会停下来,而且每执行WaitForSingleObject一次,计数值就减一,当计数值变成0时,该Semaphore才会处於UnSignal的状态,而某个ThreadReleaseSemaphore时,便会将计数值增加,以便其他的Thread或本身可得Signal的讯号,而使WaitForSingleObject停止等待。

      (4)ReleaseSemaphore():ReleaseSemaphore()函数的作用是增加信号机的计数 如果成功,就调用信号机上的一个等待函数来减少它的计数 (5)WaitForSingleObject():函数用来检测hHandle事件的信号状态,在某一线程中调用该函数时,线程暂时挂起,如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回;如果超时时间已经到达dwMilliseconds毫秒,但hHandle所指向的对象还没有变成有信号状态,函数照样返回 参数dwMilliseconds有两个具有特殊意义的值:0和INFINITE 若为0,则该函数立即返回;若为INFINITE,则线程一直被挂起,直到hHandle所指向的对象变为有信号状态时为止 (6)ResumeThread():线程恢复函数,使用该函数能激活线程的运行,使CPU分配资源让线程恢复运行 (7)ReleaseMutex():释放由线程拥有的一个互斥体(8)Sleep():睡眠等待9.分工设计说明需要用到的信号量:HANDLEMutex=:CreateMutex(NULL,FALSE,Mutex);实现顾客与理发师对公用缓存区的互斥操作HANDLEbarbers=:CreateSemaphore(NULL,1,1,barbers);HANDLEcustomers=:CreateSemaphore(NULL,0,3,customers);:WaitForSingleObject(customers,INFINITE);等待顾客进程的V(customer)操作:WaitForSingleObject(Mutex,INFINITE);申请操作顾客与理发师公用的缓存区:ReleaseSemaphore(barbers,1,NULL);释放信号量barbers:ReleaseMutex(Mutex);释放信号量Mutex,允许顾客操作缓存区10.算法流程图程序开始键入店中的椅子数信息科学与工程学院软件实践实训报告6尚未营业Mutex理发师线程True顾客线程False椅等待是离开有顾客等待休息否理发师在睡觉则唤醒理发,否则继续是11.分工代码#includewindows.h#includeiostream.h#includemath.hintlongwaiting(0);/等待理发的顾客人数intchairs;/店中椅子的总数目charopen_door;/开门charclose_door;/关门intcount(0);/顾客的序号intfinish(0);/已经理完发的顾客人数DWORDa;HANDLEMutex=:CreateMutex(NULL,FALSE,Mutex);/用来实现进程的互斥HANDLEbarbers=:CreateSemaphore(NULL,1,1,barbers);/定义信号量来进行线程间的是否开始接待顾客信息科学与工程学院软件实践实训报告7同步HANDLEcustomers=:CreateSemaphore(NULL,0,3,customers);/定义信号量来进行线程间的同步intrandom()/定义随机函数来产生顾客,并使两个顾客间的时间少于15秒return(rand()*15000)/RAND_MAX;voidcuthair()/理发师的理发函数,用时15秒:Sleep(15000);cout理发结束!endl;DWORDWINAPIbarber(LPVOIDpParm1)/理发师线程while(true):WaitForSingleObject(customers,INFINITE);/p(customers),等待顾客:WaitForSingleObject(Mutex,INFINITE);/等待互斥量waiting-;/等待的人数减1:ReleaseSemaphore(barbers,1,NULL);/释放信号量:ResumeThread(barbers);/唤醒顾客进程:ReleaseMutex(Mutex);/v(mutex);cuthair();finish+;return0;12.整体代码#includewindows.h#includeiostream.h#includemath.hintlongwaiting(0);/等待理发的顾客人数intchairs;/店中椅子的总数目charopen_door;/开门charclose_door;/关门信息科学与工程学院软件实践实训报告8intcount(0);/顾客的序号intfinish(0);/已经理完发的顾客人数DWORDa;HANDLEMutex=:CreateMutex(NULL,FALSE,Mutex);/用来实现进程的互斥HANDLEbarbers=:CreateSemaphore(NULL,1,1,barbers);/定义信号量来进行线程间的同步HANDLEcustomers=:CreateSemaphore(NULL,0,3,customers);/定义信号量来进行线程间的同步intrandom()/定义随机函数来产生顾客,并使两个顾客间的时间少于15秒return(rand()*15000)/RAND_MAX;voidcuthair()/理发师的理发函数,用时15秒:Sleep(15000);cout理发结束!endl;voidgethaircut()/顾客被理发的函数:Sleep(15001);/顾客被理发的函数,为了和理发师之间有所区别,比理发师理发时间长1毫秒cout第finish个顾客理发完毕,离开endl;DWORDWINAPIcustomer(LPVOIDpParm2)/顾。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.