操作系统生产者消费者同步机制.docx
- 文档编号:4020930
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:9
- 大小:68KB
操作系统生产者消费者同步机制.docx
《操作系统生产者消费者同步机制.docx》由会员分享,可在线阅读,更多相关《操作系统生产者消费者同步机制.docx(9页珍藏版)》请在冰豆网上搜索。
操作系统生产者消费者同步机制
计算机操作系统
进程同步
课程名称:
计算机操作系统
姓名:
班级:
学号:
目录
一、实验目的2
二、实验内容3
三、实验要求3
四、实验设计分析3
4.1生产者消费者原理分析3
4.2生产者消费者功能分析3
4.3数据结构分析4
4.4设计实现分析4
4.5实验流程分析4
五、实验过程5
六、实验结果9
七、实验总结9
实验一进程同步
一、实验目的
(1)掌握基本的同步互斥算法,理解生产者和消费者同步的问题模型。
(2)了解linux中多线程的并发执行机制,线程间的同步和互斥。
学会使用同步机制。
二、实验内容
一组生产者向一组消费者提供产品,它们共享一个有界缓冲池,生产者向其中放入产品,消费者从中取得产品。
假定这些生产者和消费者互相等效,只要缓冲池未满,生产者可将产品送入缓冲池;只要缓冲池未空,消费者可从缓冲池取走一个产品。
根据进程同步机制,编写一个解决上述问题的可视化程序,可显示缓冲池状态、放产品、取产品等过程。
三、实验要求
1.用vc++6.0
2.界面友好
3.自定义数据结构
4.实验报告书写请参考附录
四、实验设计分析
4.1生产者消费者原理分析
在同一个进程地址空间内执行的两个线程。
生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。
消费者线程从缓冲区中获得物品,然后释放缓冲区。
当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。
当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。
4.2生产者消费者功能分析
生产者功能描述:
在同一个进程地址空间内执行的两个线程。
生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。
当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。
消费者功能描述:
消费者线程从缓冲区中获得物品,然后释放缓冲区。
当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。
4.3数据结构分析
g_buffer[SIZE_OF_BUFFER]缓冲区队列
ProductID产品号
ConsumeID被消耗的产品号
in产品进缓冲区时的缓冲区下标
out产品出缓冲区时的缓冲区下标
Producer(LPVOID)生产者线程
Consumer(LPVOID)消费者线程
当缓冲池为空时,生产者生产产品in缓冲池in=in+1
当缓冲池为满时,消费者消费产品out缓冲池out=out+1
4.4设计实现分析
1.利用函数CreateMutex(NULL,FALSE,NULL)创建互斥信号量g_hMutex,表示缓冲区当前的状态,若为true时,则表示缓冲区正被别的进程使用。
三个参数表示的意义分别为:
指向安全属性的指针,初始化互斥对象的所有者,指向互斥对象名的指针,
2.利用函数CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL)创建缓冲区满的信号量g_hFullSemaphore,值为true时表示缓冲区已满。
四个参数分别为:
表示是否允许继承、设置信号机的初始计数、设置信号机的最大计数、指定信号机对象的名称(-1是因为计数从开始)
3.利用函数CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL)创建缓冲区空的信号量g_hEmptySemaphore,该值为true时表示缓冲区为空。
4.5实验流程分析
五、实验过程及代码实现
实验代码:
#include
#include
constunsignedshortSIZE_OF_BUFFER=4;//缓冲区长度
unsignedshortProductID=0;//产品号
unsignedshortConsumeID=0;//将被消耗的产品号
unsignedshortin=0;//产品进缓冲区时的缓冲区下标
unsignedshortout=0;//产品出缓冲区时的缓冲区下标
intg_buffer[SIZE_OF_BUFFER];//缓冲区是个循环队列
boolg_continue=true;//控制程序结束
HANDLEg_hMutex;//用于线程间的互斥
HANDLEg_hFullSemaphore;//当缓冲区满时迫使生产者等待
HANDLEg_hEmptySemaphore;//当缓冲区空时迫使消费者等待
DWORDWINAPIProducer(LPVOID);//生产者线程
DWORDWINAPIConsumer(LPVOID);//消费者线程
intmain()
{
//创建各个互斥信号
g_hMutex=CreateMutex(NULL,FALSE,NULL);
g_hFullSemaphore=
CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL);
g_hEmptySemaphore=CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);
constunsignedshortPRODUCERS_COUNT=2;//生产者的个数
constunsignedshortCONSUMERS_COUNT=1;//消费者的个数
constunsignedshortTHREADS_COUNT=PRODUCERS_COUNT+CONSUMERS_COUNT;//总的线程数
HANDLEhThreads[PRODUCERS_COUNT];//各线程的handle
DWORDproducerID[CONSUMERS_COUNT];//生产者线程的标识符
DWORDconsumerID[THREADS_COUNT];//消费者线程的标识符
//创建生产者线程
for(inti=0;i { hThreads[i]=CreateThread(NULL,0,Producer,NULL,0,&producerID[i]); if(hThreads[i]==NULL)return-1; } //创建消费者线程 for(intj=0;j hThreads[PRODUCERS_COUNT+j]=CreateThread(NULL,0,Consumer,NULL,0,&consumerID[j]); if(hThreads[j]==NULL)return-1; } while(g_continue){ if(getchar()){//按回车后终止程序运行 g_continue=false; } } return0; } //生产一个产品。 voidProduce() { std: : cerr<<"生产"<<++ProductID;//<<"...";//cerrC++的一种输出可变为cout std: : cerr<<"产品完毕"< : endl; } //把新生产的产品放入缓冲区 voidAppend() { g_buffer[in]=ProductID; in=(in+1)%SIZE_OF_BUFFER; //输出缓冲区当前的状态 printf("\n当前缓冲区状态为\n"); for(inti=0;i std: : cout< "< if(i==in)std: : cout<<"<--生产"; if(i==out)std: : cout<<"<--消费"; std: : cout< : endl; } } //从缓冲区中取出一个产品 voidTake() { ConsumeID=g_buffer[out]; out=(out+1)%SIZE_OF_BUFFER; //输出缓冲区当前的状态 printf("\n当前缓冲区状态为\n"); for(inti=0;i std: : cout< "< if(i==in)std: : cout<<"<--生产"; if(i==out)std: : cout<<"<--消费"; std: : cout< : endl; } } //消耗一个产品 voidConsume() { std: : cerr<<"消费"< std: : cerr<<"成功"< : endl; } //生产者 DWORDWINAPIProducer(LPVOIDlpPara) { while(g_continue) { WaitForSingleObject(g_hFullSemaphore,INFINITE); WaitForSingleObject(g_hMutex,INFINITE); Produce(); Append(); Sleep(1500); ReleaseMutex(g_hMutex); ReleaseSemaphore(g_hEmptySemaphore,1,NULL); } return0; } //消费者 DWORDWINAPIConsumer(LPVOIDlpPara) { while(g_continue){ WaitForSingleObject(g_hEmptySemaphore,INFINITE); WaitForSingleObject(g_hMutex,INFINITE); Take(); Consume(); Sleep(1500); ReleaseMutex(g_hMutex); ReleaseSemaphore(g_hFullSemaphore,1,NULL); } return0; } 六、实验结果 七、实验总结 本次课程设是关于生产者与消费者之间互斥和同步的问题。 问题的实质是P、V操作,实验设一个共享缓冲区,生产者和消费者互斥的使用,当一个线程使用缓冲区的时候,另一个让其等待直到前一个线程释放缓冲区为止。 我自己认为对于我来说编写这个程序有点困难,因为不知道怎么利用P、V操作来编写生产者和消费者的程序,有点无从下手,通过查找课外资料和网上的资料,对C++和C有了一定的了解,参照参考书上的指点以及网络资源编写出来的.C/C++编程和PV原语的编写更需要平时多加练习才能学好用好。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 生产者 消费者 同步 机制