进程同步生产者与消费者_第1页
进程同步生产者与消费者_第2页
进程同步生产者与消费者_第3页
进程同步生产者与消费者_第4页
进程同步生产者与消费者_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

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

2、验中使用到相关的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 关闭一个内核对象。2、

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

4、行同步信号量的P操作,然后执行互斥信号量的P操作。否则可能造成进程死锁。6. 实验总结计算机操作系统中引入了进程后,极大的改善了系统资源的利用率和提高了系统的吞吐量,但是由于多道环境中同时存在多个进程,它们共享系统资源,各自按照各自的方式执行,给系统造成了混乱,所以系统必须提供一种机制管理进程,使这些并发执行的进程之间能有条不紊地运行,能有效地共享资源和相互合作,使得程序的执行具有可再现性,这就是进程同步的主要任务。7. 附录#include <iostream>#include <process.h>#include <windows.h>using na

5、mespace std;/ 生产者消费者问题,单个生产者,多个消费者,多个缓冲池/ 使用 信号量 和 关键段 来实现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) / 生产者线程

6、for(int i = 0; i <= num ; i+) WaitForSingleObject(empty,INFINITE); / 线程同步 EnterCriticalSection(&gc); / 线程互斥 bufgi = i; cout << "生产者在 " << gi << " 号缓冲池放入 " << bufgi << endl; gi = (gi+1)%size; LeaveCriticalSection(&gc); ReleaseSemaphore(full

7、,1,NULL); cout << "生产者运行结束!" << endl; return 0;unsigned int _stdcall cus(PVOID p) / 消费者线程 while(true) WaitForSingleObject(full,INFINITE); / 线程同步 if( flag = false ) / 线程之间的逻辑判断 break; EnterCriticalSection(&gc); / 线程互斥 cout << "线程 " << GetCurrentThreadId

8、() << " 在缓冲池 " << gj << " 获取数据 " << bufgj << endl; if( bufgj = num ) / 结束条件 LeaveCriticalSection(&gc); ReleaseSemaphore(full,1,NULL); flag = false; break; gj = (gj+1)%size; LeaveCriticalSection(&gc); Sleep(50); ReleaseSemaphore(empty,1,NULL);

9、 cout << "消费者线程 " << GetCurrentThreadId() << " 运行结束!" << endl; return 0;int main() / 相关变量的定义 const int sz = 3; gi = gj = 0; InitializeCriticalSection(&gc); empty = CreateSemaphore(NULL,4,4,NULL); full = CreateSemaphore(NULL,0,4,NULL); HANDLE handsz; hand0 = (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,tr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论