- 1、本文档共17页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
课程设计报告课程名称:操作系统 班级:1305022 学号:11姓 名:牟黎明指导教师:龚茗茗老师计算机工程学院时间:2016.06.06-2016.06.12一、实验概述1.实验目的1、熟悉临界资源、信号量及PV操作的定义与物理意义。2、了解进程通信的方法。3、掌握进程互斥与进程同步的相关知识4、掌握用信号量机制解决进程间的同步和互斥问题。5、实现生产者——消费者问题,深刻理解进程同步问题。2.实验目标在Linux操作系统下用C实现经典进程同步问题:生产者——消费者问题。3、具体要求如下:1、缓冲区大小为5,初始状态为空。2、2个生产者,随机等待一段时间,往缓冲区中添加数据,若缓冲区已满,等待消费者取走数据之后再添加,重复5次3、2个消费者,随机等待一段时间,从缓冲区中读取数据,若缓冲区为空,等待生产者添加数据之后再读取,重复5次。生产者 Buffer(大小为5) 消费者4、实验工具开发环境:Visual C++ 6.0二、实验过程1、实验题目分析本实验要求利用PV操作实现解决生产者——消费者问题中的同步问题。此问题描述的是2个生产者进程在生产产品并将这些产品提供给消费者进程去消费,在两者之间设置了一个具有5个缓冲区的缓冲池,生产者进程将它所生产的产品放入一个缓冲区,消费者进程可从缓冲区中取走产品去消费,但它们之间必须保持同步,即不允许消费者进程到一个空缓冲区去取产品,也不允许生产者进程向一个已装满且尚未取出的缓冲区中投放产品,并且生产者消费者互斥使用缓冲区,定义信号量来实现互斥使。2、算法流程3、算法实现主要用到生产者函数DWORD WINAPI Producer(LPVOID para)来实现缓冲区产品数量的增加,用DWORD WINAPI Consumer(LPVOID para)来实现缓冲区产品的减少。并用到了CreateThread函数来创建生产者消费者线程,利用线程的句柄以及创建线程是立刻运行的特点来进行生产消费操作。至于PV算法的实现是利用mutex、empty和full,3个信号量来进行控制, empty的值可以看做资源量,即当前缓冲区的大小,初始化为缓冲区的大小,只有empty的数值大于0才可以进行生产, full的数值与empty的值有对应的关系,利用full来控制消费的进行。用mutex来实现信号的同步于互斥,当p(mutex)能申请时,就锁住缓冲区,供自己使用,使用完后,用v(mutex)来释放。4、关键问题 利用生产者进程进行生产,同时消费者进程也能进行消费,但是必须满足同步的条件才可以允许,否则将提示缓冲区满无法进行生产或者缓冲区空无法进行消费的错误,其次,必须对公用的临界资源进行互斥使用,生产者生产时消费者不能使用缓冲区,故程序应该具有判断的功能。若结束当前的生产者——消费者进程,将会提示此次进程中生产消费者分别生产了和消费的产品数目,并统计缓冲区中剩余的产品数目,最后才结束。5、关键代码分析1.定义的变量:#define BUFFER_NUM 5 /* 缓冲区个数 */struct Buffer //临界区{int product[BUFFER_NUM];// 缓冲区int start, end; // 两个指针 相当于 in out 指针}g_buf;typedef HANDLE Semaphore;// 信号量的Windows原型 句柄,唯一标识Semaphore empty, full, mutex;//定义3个信号量,来实现互斥与同步定义PV操作,来实现资源的申请与释放操作(对缓冲区的数目进行操作)#define P(S) WaitForSingleObject(S, INFINITE)//定义c语言stdio.h库中的P操作#define V(S) ReleaseSemaphore(S, 1, NULL) // 定义c语言 stdio.h库中的V操作2.关键函数:①CreateThread函数创建一个在调用进程的地址空间中执行的线程。此函数为API函数,用于创建生产者消费者进程。程序中相关代码:hThread[i] = CreateThread(NULL, 0, Consumer, i, 0, tid);hThread[i] = CreateThread(NULL, 0, Producer, i, 0, tid);②信号量对象(semaphore)信号量对象实现了Dijkstra定义中的通用信号量语义。信号量对象就是资源信号量,初始值的取值在0到指定最大值之间,用于限制并发访问的线程数,也可用于进程、线程间的同步。它的相关API包括:CreateSemaphore、OpenSemaphore和ReleaseSemaphore。本使用中
您可能关注的文档
- 《风向和风速》研讨.ppt
- 部编本一年级语文上《秋天》高清研讨.pptx
- 白酒文献研讨.docx
- 猜猜我是谁写人作文,三年级研讨.pptx
- 《父亲的菜园_1》公开课精品研讨.ppt
- 财会题目研讨.pptx
- 《复式条形统计图》研讨.ppt
- 白若曼中西方建筑对比研讨.pptx
- 财经法规第二章第三节研讨.pptx
- 《傅雷家书》八年级上册长春版研讨.ppt
- 师缘主题课件最新完整版本.pptx
- 基于偏好MOEA_D算法的气发动机多目标优化标定研究.pdf
- 师范技能课件比赛一等奖最新完整版本.pptx
- 师范生初中美术说课课件最新完整版本.pptx
- 师范技能课件图片素材库最新完整版本.pptx
- Unit 2 Making a Difference Understanding ideas The Well that changed the world 教学设计-高中英语外研版(2019)必修第三册.docx
- 师范生技能大赛PPT课件语文最新完整版本.pptx
- 基于扭矩的双燃料发动机控制策略研究.pdf
- 1.2.1 等差数列的概念及其通项公式(教学设计)高二数学(北师大版2019选择性必修第二册).docx
- 师范文化课件最新完整版本.pptx
文档评论(0)