进程同步(生产者与消费者)

上传人:新** 文档编号:564439511 上传时间:2022-08-16 格式:DOC 页数:7 大小:219.50KB
返回 下载 相关 举报
进程同步(生产者与消费者)_第1页
第1页 / 共7页
进程同步(生产者与消费者)_第2页
第2页 / 共7页
进程同步(生产者与消费者)_第3页
第3页 / 共7页
进程同步(生产者与消费者)_第4页
第4页 / 共7页
进程同步(生产者与消费者)_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《进程同步(生产者与消费者)》由会员分享,可在线阅读,更多相关《进程同步(生产者与消费者)(7页珍藏版)》请在金锄头文库上搜索。

1、软 件 学 院操作系统实验报告 专 业: 软件工程 班 级: RB软工互152 学 号: 201560160226 学生姓名: 王泽华 指导教师: 韩新超 整理为word格式实验二: 进程同步(生产者与消费者)一实验目的1)理解进程竞争资源的现象,进而理解进程的同步于互斥;2)掌握基本的互斥与同步算法,进一步理解“生产者消费者”模型;3)通过对“生产者消费者”问题编程实现,了解进程创建、同步信号量、互斥信号量、临界区的创建和使用,初步了解并发程序设计方法;4)进一步理解P、V原语和信号量在线程互斥和同步机制中的运用。二实验属性该实验为设计性实验。三实验仪器设备及器材普通PC386以上微机四 实

2、验理论基础1、该实验中使用到相关的windows API 函数:1)create Thread 建立新的线程;2)create Mutex创建一个互斥体;3)create Semaphore 创建一个新的信号量;4)release Mutex释放由线程拥有的一个互斥体;5)release Semaphore 对指定的信号量增加指定的值;6)wait for Single Object 用来检测handle时间的信号状态;7)wait for Multiple Objects true 即等待所有信号量有效再往下执行,false 当其中一个信号量有效时向下执行;8)Close Handle 关闭

3、一个内核对象。2、数据结构用实验一中的进程就绪队列,并在此基础上进行调度,如果队列排序与算法要求不一致则编写一个排序函数。3、进程调度算法:选择一种进程调度算法实现。4、主界面设计:在实验一的界面上增加一个进程调度按钮、被调进程的PCB显示。5、功能测试:从显示出的就绪队列状态和被调进程的PCB,查看操作的正确与否。五.实验步骤整理为word格式(2)结果分析:在每个过程中先做P(mutex),后做V(mutex),二者要成对出现。夹在二者中间的代码段就是该进程的临界区。对同步信号量full和empty的P,V操作同样必须成对出现,但它们分别位于不同的程序中。无论在生产者进程中还是在消费者进程

4、中,两个P操作的次序不能颠倒:应先执行同步信号量的P操作,然后执行互斥信号量的P操作。否则可能造成进程死锁。六. 实验总结计算机操作系统中引入了进程后,极大的改善了系统资源的利用率和提高了系统的吞吐量,但是由于多道环境中同时存在多个进程,它们共享系统资源,各自按照各自的方式执行,给系统造成了混乱,所以系统必须提供一种机制管理进程,使这些并发执行的进程之间能有条不紊地运行,能有效地共享资源和相互合作,使得程序的执行具有可再现性,这就是进程同步的主要任务。整理为word格式七. 附录#include #include #include using namespace std;/ 生产者消费者问题,

5、单个生产者,多个消费者,多个缓冲池/ 使用 信号量 和 关键段 来实现using namespace std;int gi,gj;const int num = 10; / 产生数据的个数const int size = 4; / 缓冲池的大小volatile bool flag = true; / 用于消费者线程之间int bufsize; / 缓冲池CRITICAL_SECTION gc; / 关键段HANDLE empty,full; / Semaphoreunsigned int _stdcall pro(PVOID p) / 生产者线程 for(int i = 0; i = num

6、; i+) WaitForSingleObject(empty,INFINITE); / 线程同步 EnterCriticalSection(&gc); / 线程互斥 bufgi = i; cout 生产者在 gi 号缓冲池放入 bufgi endl; gi = (gi+1)%size; LeaveCriticalSection(&gc); ReleaseSemaphore(full,1,NULL); 整理为word格式 cout 生产者运行结束! endl; return 0;unsigned int _stdcall cus(PVOID p) / 消费者线程 while(true) Wai

7、tForSingleObject(full,INFINITE); / 线程同步 if( flag = false ) / 线程之间的逻辑判断 break; EnterCriticalSection(&gc); / 线程互斥 cout 线程 GetCurrentThreadId() 在缓冲池 gj 获取数据 bufgj endl; if( bufgj = num ) / 结束条件 LeaveCriticalSection(&gc); ReleaseSemaphore(full,1,NULL); flag = false; break; gj = (gj+1)%size; LeaveCritica

8、lSection(&gc); Sleep(50); ReleaseSemaphore(empty,1,NULL); cout 消费者线程 GetCurrentThreadId() 运行结束! endl; return 0;int main()整理为word格式 / 相关变量的定义 const int sz = 3; gi = gj = 0; InitializeCriticalSection(&gc); empty = CreateSemaphore(NULL,4,4,NULL); full = CreateSemaphore(NULL,0,4,NULL); HANDLE handsz; ha

9、nd0 = (HANDLE)_beginthreadex(NULL,0,pro,NULL,0,NULL); / 创建了三个线程 hand1 = (HANDLE)_beginthreadex(NULL,0,cus,NULL,0,NULL); hand2 = (HANDLE)_beginthreadex(NULL,0,cus,NULL,0,NULL); WaitForMultipleObjects(sz,hand,true,INFINITE); / 资源的释放 CloseHandle(full); CloseHandle(empty); DeleteCriticalSection(&gc); for(int i = 0; i sz ; i+) CloseHandle(handi); return 0; 友情提示:本资料代表个人观点,如有帮助请下载,谢谢您的浏览! 整理为word格式

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 其它相关文档

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