进程同步机制与互斥生产者消费者问题Word格式文档下载.docx
- 文档编号:20668670
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:14
- 大小:426.56KB
进程同步机制与互斥生产者消费者问题Word格式文档下载.docx
《进程同步机制与互斥生产者消费者问题Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《进程同步机制与互斥生产者消费者问题Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。
我觉得通过我们的不断学习,结合生活中的实际问题,我们就会把操作系统学得更好。
总体来说,通过这次的对操作系统的总结,有收获也有遗憾、不足的地方,但我想,我已经迈入了操作系统的大门,只要我再认真努力的去学习,去提高,肯定能让自己的知识能力更上一层楼.1设计思路及主要代码分析1.1设计思路在这次设计中定义的多个缓冲区不是环形循环的,并且不需要按序访问。
其中生产者可以把产品放到某一个空缓冲区中,消费者只能消费被指定生产者生产的产品。
本设计在测试用例文件中指定了所有生产和消费的需求,并规定当共享缓冲区的数据满足了所有有关它的消费需求后,此共享才可以作为空闲空间允许新的生产者使用。
本设计在为生产者分配缓冲区时各生产者之间必须互斥,此后各个生产者的具体生产活动可以并发。
而消费者之间只有在对同一个产品进行消费时才需要互斥,它们在消费过程结束时需要判断该消费者对象是否已经消费完毕并释放缓冲区的空间。
1-2程序流程1.3基本内容在设计程序时主要有三个主体部分、三个辅助函数和一个数据结构。
其中主体部分为一个主函数main(),用于初始化缓冲区和各个同步对象,并完成线程信息的读入,最后根据该组的线程记录启动模拟线程,并等待所有线程的运行结束后退出程序;
生产者函数Produce()和消费者函数Consume(),生产者和消费者函数运行于线程中完成对缓冲区的读、写动作,根据此处生产消费的模型的特点,生产者和消费者之间通过使用同步对象实现了生产和消费的同步与互斥,是本实验的核心所在。
另外三个辅助性函数被生产者和消费者函数调用,是上述生产和消费函数中对缓冲区进行的一系列处理。
定义一个数据结构,记录在测试文件中指定的每一个线程的参数。
1)用一个整型数组Buffer_Critical来代表缓冲区。
不管是生产产品还是对已有的产品的消费都需要访问该组缓冲区。
2)进程信息Threadinfo数据结构,包含线程的各个信息。
1)在实现本程序的消费生产模型时,具体的通过如下同步对象实现互斥:
1设一个互斥量h_mutex,以实现生产者在查询和保留缓冲区内的下一个位置时进行互斥。
2每一个生产者用一个信号量与其消费者同步,通过设置h_SemaphoreMAX_THREAD_NUM信号量3数组实现,该组信号量用于相应的产品已产生。
同时用一个表示空缓冲区数目的信号量empty_semaphore进行类似的同步,只是缓冲区中是否存在空位置,以便开始生产下一个产品。
4每一个缓冲区用一个同步对象实现该缓冲区上消费者之间的互斥,这通过设置临界区对象数组PC_Ci订icalMAX_BUFFER_NUM实现。
1.4程序代码#include#include#include#include#include#include#defineMAX_EUFFER_NUM10#defineNTE_PER_SEC1000#defineMAX_THREAD_NUM64/定义一个结构,记录在测试文件中指定的每一个线程的参数structThreadinfoserial;
entity;
delay;
程的各个信息int/线程序列号char是P还是Cint线程延迟intthread_requestMAX_THREAD_NUM;
/线程请求队列intn_request;
请求个数;
/每一个缓冲区用一个同步对象实现该缓冲区上消费者之间的互斥,这通过设置临界区对象数组PC_CrilicalMAX_BUFFER_NUM实现。
CRITICAL_SECTIONPC_CriticalMAX_BUFFER_NUM;
/用_个整型数组Buffer_Critical来代表缓冲区。
不管是生产产品还是对已有的产品的消费都需要访问该组缓冲区。
intBuffer_CriticalMAX_BUFFER_NUM;
HANDLEh_ThreadMAX_THREAD_NUM;
ThreadinfoThread_InfoMAX_THREAD_NUM;
/设一个互斥量h_mutex,以实现生产者在查询和保留缓冲区内的下一个位置时进行互斥。
HANDLEh_mutex;
/每一个生产者用一个信号量与其消费者同通过设h_SemaphoreMAX_THREAD_NUM信号量数组实现,该组信号量用于相应的产品已产生。
HANDLEh_SemaphoreMAX_THREAD_NUM;
同时用一个表示空缓冲区数目的信号量empty_semaphore进行类似的同步,只是缓冲区中是否存在空位置,以便开始生产下一个产品。
HANDLEempty_semaphore;
DWORDn_Thread=O;
DWORDn_Buffer_or_Critical;
voidProduce(void*p);
voidConsume(void*p);
boolIflnOtherRuquest(int);
intFindProducePosition();
intFindBufferPosition(int);
函数输入数据,提取线程信息到数据结构中,初始化临界区,创建信号量,创建线程intmain(void)/声明所需变量DWORDwait_for_all;
ifstreaminFile;
/初始化缓冲区for(inti=O;
iMAX_BUFFER_NUM;
i+)Buffer_Criticali=-1;
for(intj=O;
jMAX_THREAD_NUM;
j+)for(intk=O;
kn_Buffer_or_Critical;
inFile,get();
printf(”输入文件是:
n“);
/显示获得的缓冲区数目信息printf(H%d个缓冲区nH,(int)n_Buffer_or_Critical);
while(inFile)inFileThreadJnfon_Thread.serial;
inFileThread_Infon_Threadentity;
inFileThread_Infon_Threaddelay;
charc;
inFile,get(c);
while(c!
=,nf&
!
inFile.eof()inFileThread_Infon_Thread.thread_requestThread_Infon_Thread.n_request+;
n_Thread+;
/显示获得的线程信息,便于确认正确性for(j=0;
j(int)n_Thread;
j+)intTemp_serial=Thread_Infoj.serial;
charTemp_entity=Thread_Infojentity;
intTemp_delay=Thread_Infoj.delay;
printf(H线程2d%c%dTemp_serial,Temp_entity,Temp_delay);
intTemp_request=Thread_Infoj.n_request;
for(intk=O;
kTemp_request;
k+)printf(n%d”,Thread_Infojthread_requestk);
coutendl;
coutMendl;
empty_semaphore=CreateSemaphore(NULL.nBufferorCritical,nBufferorCritical,Hsemaphore_for_emptyH);
/创建在模拟过程中的几个信号量h_mutex=CreateMutex(NULL,FALSE/mutex_for_updateH);
用线程的ID号来为相应的生产线程的产品读写时所使用的同步信号量命名for(j=0;
j+)1Pstd:
string=Hsemaphore_for_produce_H;
inttemp=j;
while(temp)转换为字符charc=(char)(temp%10);
lp+=c;
temp/=10;
h_Semaphorej+l=CreateSemaphore(NULL,O,n_Thread,lp.c_str();
/生产者消费者线程for(i=0;
i(int)n_Thread;
i+)if(Thread_Infoientity=,Pl)h_Threadi=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Produce),&
(Thread_Infoi),O,NULL);
elseh_Threadi=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Consume),&
主线程等待各个线程结束wait_for_all=WaitForMultipleObjects(n_Thread,h_Thread,TRUE,-1);
coutnHendl;
printf(”所有的生产者和消费者已经完成了他们的工作。
卍);
print#”请按任意键退出!
nh);
_getch();
return0;
/确认是否还有对同一产品的消费请求未执行boolIflnOtherRequest(intreq)for(inti=0;
in_Thread;
i+)for(intj=0;
jThread_Infoi.n_request;
j+)if(Thread_Infoithread_requestj=req)returnTRUE;
returnFALSE;
/找岀当前可以进行产品生产的空缓冲区位置;
intFindProducePosition()/用下面这个特殊值表示本缓冲区正处于被写状态;
intEmptyPosition;
for(inti=1;
i=n_Buffer_or_Critical;
i+)if(Buffer_Criticali=-l)EmptyPosition=i;
Buffer_Criticali=-2;
break;
returnEmptyPosition;
intFindBufferPosition(intProPos)intTempPos;
iserial;
m_delay=(DWORD)(Threadinfo*)(p)-delay*INTE_PER_SEC);
Sleep(m_delay);
开始请求生产nn,m_serial);
/确认有缓冲区可以生产,同时将空位置数empty减1;
用于生产者和消费者之间的同步;
wait_for_semaphore=WaitForSingleObject(empty_semaphore,-1);
互斥访问下一个可用于生产的空临界区,实现写写互斥wait_for_mutex=WaitForSingleObject(h_mutex,-l);
intProducePos=FindProducePosition();
ReleaseMutex(h_mutex);
生产者在获得自己的空位置并做上标记后,以下写操作在生产者之间可以并发在核心生产步骤中,程序将生产者的ID作为产品编号放入,方便消费者识别printfC生产者%2d开始生产在位置%2dnn,m_serial,ProducePos);
Buffer_CriticalProducePos=m_serial;
printf(生产者%2d完成生产nH,m_serial);
printf(h位置%2d:
%3d的产品nH,ProducePos,Buffer_CriticalProducePos);
使生产者写的缓冲区可以被多个消费者使用,实现读写同步ReleaseSemaphore(h_Semaphorem_serial,n_Thread,NULL);
消费者进程voidConsume(void*p)wait_for_semaphore,m_delay;
/消费者的序列号和请求的数目intm_serial,m_requestNum;
/本消费线程的请求队列intm_thread_requestMAX_THREAD_NUM/提取本线程信息到本地m_serial=(ThreadInfo*)(p)-serial;
m_requestNum=(ThreadInfo*)(p)-n_request;
for(inti=O;
ithread_requesti;
for(i=0;
ithread_requesti=-1;
辻(!
IflnOtherRequest(m_thread_reques/标记缓冲区为空Bxiffer_CriticalBufferPos=0;
prints消费者%2d消费完成%2dnH,m_serial,m_thread_requesti);
printf(n位置%2d:
%3dnH,BufferPos,Buffer_CriticalBufferPos);
ReleaseSemaphore(empty_semaphore,1,NULL);
elseprintf消费者%2d消费完产品%2dnH,m_serial,m_thread_requesti);
LeaveCriticalSection(&
PC_CriticalBufferPos);
2实验结果及问题分析2-1测试结果测试文件内容为:
1P32P43C414P15C2124运行程序如下图主菜单页面所示:
彈蠶鋤费者己经械了他蹣工作。
Pressany3eytocontinue2.2结果分析由于我们在一个循环中创建了这五个线程,所以认为它们是同时开始运转的。
根据第三列的延迟时间,最早开动作的是thread4生产产品。
它5个缓冲区的位置中生产了产品。
接下来是线程5和1,消费者5要求消费线程1生产的产品,线程1还没有生产,所以先阻塞,然后,线程1发送生产请求,线程1生产完产品放入位置2,消费者5才能够消费,接着消费者5要求消费线程2的产品,此产品还没生产,5线程被阻塞。
到第4秒时,线程2要求生产,产品放入位置3,消费者3消费线程1的产品.此时线程5所要求消费的产品已经都就绪,所以线程5消费被激活,顺利消费线程1,2,4生产者得产品。
所以,由于对每个产品的都是对它的最后一次消费,所以,消费完产品后随即释放该产品所占缓冲区空间。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 进程 同步 机制 生产者 消费者 问题