收藏 分享(赏)

操作系统实验报告——进程同步与互斥.doc

上传人:精品资料 文档编号:10582601 上传时间:2019-12-02 格式:DOC 页数:12 大小:1.41MB
下载 相关 举报
操作系统实验报告——进程同步与互斥.doc_第1页
第1页 / 共12页
操作系统实验报告——进程同步与互斥.doc_第2页
第2页 / 共12页
操作系统实验报告——进程同步与互斥.doc_第3页
第3页 / 共12页
操作系统实验报告——进程同步与互斥.doc_第4页
第4页 / 共12页
操作系统实验报告——进程同步与互斥.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

1、进程同步与互斥实验报告实验序号:01 实验项目名称:进程同步与互斥学 号 姓 名 专业、班实验地点 指导教师 时间一、实验目的1、掌握基本的进程同步与互斥算法,理解生产者-消费者问题。2、学习使用 Windows 2000/XP 中基本的同步对象,掌握相关 API 的使用方法。3、了解 Windows 2000/XP 中多线程的并发执行机制,实现进程的同步与互斥。4、设计程序,实现生产者-消费者进程(线程)的同步与互斥;二、实验环境Windows 2000/XP + Visual C+ 6.0 三、实验内容以生产者-消费者模型为依据,在 Windows 2000/XP 环境下创建一个控制台进程

2、,在该进程中创建 n 个线程模拟生产者和消费者,实现进程(线程)的同步与互斥。四、设计思路和流程框图生产者进程的功能:生产东西,供消费者消费;消费者进程的功能:消费生产者生产的东西。生产者生产产品并存入缓冲区供消费者取走使用,消费者从缓冲器内取出产品去消费。在生产者和消费者同时工作时,必须禁止生产者将产品放入已装满的缓冲器内,禁止消费者从空缓冲器内取产品。五、源程序(含注释)清单#include#include#include#include#include/定义一些常量;/本程序允许的最大临界区数;#define MAX_BUFFER_NUM 10/秒到微秒的乘法因子;#define INT

3、E_PER_SEC 1000/本程序允许的生产和消费线程的总数;#define MAX_THREAD_NUM 64/定义一个结构,记录在测试文件中指定的每一个线程的参数struct ThreadInfointserial; /线程序列号char entity; /是 P 还是 Cdouble delay; /线程延迟intthread_requestMAX_THREAD_NUM; /线程请求队列intn_request; /请求个数;/全局变量的定义/临界区对象的声明,用于管理缓冲区的互斥访问;CRITICAL_SECTION PC_CriticalMAX_BUFFER_NUM;int Buf

4、fer_CriticalMAX_BUFFER_NUM; /缓冲区声明,用于存放产品;HANDLE h_ThreadMAX_THREAD_NUM; /用于存储每个线程句柄的数组;ThreadInfo Thread_InfoMAX_THREAD_NUM; /线程信息数组;HANDLE empty_semaphore; /一个信号量;HANDLE h_mutex; /一个互斥量;DWORD n_Thread = 0; /实际的线程的数目;DWORD n_Buffer_or_Critical; /实际的缓冲区或者临界区的数目;HANDLE h_SemaphoreMAX_THREAD_NUM; /生产者

5、允许消费者开始消费的信号量;/生产消费及辅助函数的声明void Produce(void *p);void Consume(void *p);bool IfInOtherRequest(int);int FindProducePositon();int FindBufferPosition(int);int main(void)/声明所需变量;DWORD wait_for_all;ifstream inFile;/初始化缓冲区;for(int i=0;i n_Buffer_or_Critical;inFile.get();printf(“输入文件是:n“);/回显获得的缓冲区的数目信息;pri

6、ntf(“%d n“,(int) n_Buffer_or_Critical);/提取每个线程的信息到相应数据结构中;while(inFile)inFile Thread_Infon_Thread.serial;inFile Thread_Infon_Thread.entity;inFile Thread_Infon_Thread.delay;char c;inFile.get(c);while(c!=ninFile.get(c);n_Thread+; /回显获得的线程信息,便于确认正确性;for(j=0;jserial;m_delay = (DWORD)(ThreadInfo*)(p)-del

7、ay *INTE_PER_SEC);Sleep(m_delay);/开始请求生产printf(“Producer %2d sends the produce require.n“,m_serial);/确认有空缓冲区可供生产,同时将空位置数 empty 减 1;用于生产者和消费者的同步;wait_for_semaphore = WaitForSingleObject(empty_semaphore,-1);/互斥访问下一个可用于生产的空临界区,实现写写互斥;wait_for_mutex = WaitForSingleObject(h_mutex,-1);int ProducePos = Fin

8、dProducePosition();ReleaseMutex(h_mutex);/生产者在获得自己的空位置并做上标记后,以下的写操作在生产者之间可以并发;/核心生产步骤中,程序将生产者的 ID 作为产品编号放入,方便消费者识别;printf(“Producer %2d begin to produce at position %2d.n“,m_serial,ProducePos);Buffer_CriticalProducePos = m_serial;printf(“Producer %2d finish producing :n “,m_serial);printf(“ position

9、 %2d :%3d n“ ,ProducePos,Buffer_CriticalProducePos);/使生产者写的缓冲区可以被多个消费者使用,实现读写同步;ReleaseSemaphore(h_Semaphorem_serial,n_Thread,NULL);/消费者进程void Consume(void * p)/局部变量声明;DWORD wait_for_semaphore,m_delay;intm_serial,m_requestNum; /消费者的序列号和请求的数目;intm_thread_requestMAX_THREAD_NUM;/本消费线程的请求队列;/提取本线程的信息到本地

10、;m_serial = (ThreadInfo*)(p)-serial;m_delay = (DWORD)(ThreadInfo*)(p)-delay *INTE_PER_SEC);m_requestNum = (ThreadInfo *)(p)-n_request;for (int i = 0;ithread_requesti;Sleep(m_delay);/循环进行所需产品的消费for(i =0;ithread_requesti =-1;if(!IfInOtherRequest(m_thread_requesti)Buffer_CriticalBufferPos = -1;/标记缓冲区为空

11、;printf(“Consumer%2d finish consuming %2d:n “,m_serial,m_thread_requesti);printf(“ position %2d :%3d n“ ,BufferPos,Buffer_CriticalBufferPos);ReleaseSemaphore(empty_semaphore,1,NULL);elseprintf(“Consumer %2d finish consuming product %2dn “,m_serial,m_thread_requesti);/离开临界区LeaveCriticalSection(六、测试结果

12、以及实验总结1、通过实验进一步了解了基本的进程同步与互斥算法,理解生产者-消费者问题2、掌握了相关 API 的使用方法。3、了解到进程是一个可以拥有资源的基本单位,是一个可以独立调度和分派的基本单位。而线程是进程中的一个实体,是被系统独立调度和分配的基本单位,故又称为轻权(轻型)进程(Light Weight Process)。4、了解到同步对象是指 Windows 中用于实现同步与互斥的实体,包括信号量(Semaphore)、互斥量(Mutex)、临界区(Critical Section)和事件(Events)等。本实验中使用到信号量、互斥量和临界区三个同步对象。成绩备注:实验报告文档的名称:姓名_实验编号 (例如:张三_1、张三_2) ;实验报告发送到:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报