资源描述
HEN system office room 【HEN16H-HENS2AHENS8Q8-HENH1688】
生产者与消费者实验报告
生产者和消费者实验报告
【实验目的】
1. 加深对进程概念的理解,明确进程和程序的区别。
2. 进一步认识并发执行的实质。
3. 验证用信号量机制实现进程互斥的方法。
4. 验证用信号量机制实现进程同步的方法。
【实验要求】
用c语言编程搭建“生产者和消费者”经典进程通信问题的环境。要求程序运行时,按任意键停止,显示当前系统的各个参数的值。提交实验报告,以及相关程序列表。打包成附件上传。
【实验环境】
Visual C++
【实验内容】
1.了解经典同步问题“生产者和消费者”
生产者与消费者可以通过一个环形缓冲池联系起来,环形缓冲池由几个大小相等的缓冲块组成,每个缓冲块容纳一个产品。每个生产者可不断地每次往缓冲池中送一个生产产品,而每个消费者则可不断地每次从缓冲池中取出一个产品。指针i和指针j分别指出当前的第一个空缓冲块和第一个满缓冲块。
2.分析和理解
(1)既存在合作同步问题,也存在临界区互斥问题
合作同步:当缓冲池全满时,表示供过于求,生产者必须等待,同时唤醒消费者;当缓冲池全空时,表示供不应求,消费者应等待,同时唤醒生产者。
互斥:缓冲池显然是临界资源,所在生产者与消费都要使用它,而且都要改变它的状态。
(2)基于环形缓冲区的生产者与消费者关系形式描述:
公用信号量mutex:初值为1,用于实现临界区互斥
生产者私用信号量empty:初值为n,指示空缓冲块数目
消费者私用信号量full:初值为0,指示满缓冲块数目
整型量i和j初值为0,i指示首空缓冲块序号,j指示首满缓冲块序号
(3)PV原语
var mutex,empty,full:semaphore;
i,j:integer;buffer:array[0...n-1] of item;
i:=j:=1;
Procedure producer;
begin
while true do
begin
produce a product;
P(empty);
P(mutex);
buffer(i):=product;
i:=(i+1) mod n;
V(mutex);
V(full);
end;
end;
Procedure consumer;
begin
P(full);
P(mutex);
goods:=buffer(j);
j:=(j+1) mod n;
V(mutex);
V(empty);
consume a product;
end;
end;
【实验源程序代码】
#include <>
#include <iostream>
const unsigned short SIZE_OF_BUFFER = 10; . ";
std::cerr << "Succeed" << std::endl;
}
. ";
g_buffer[in] = ProductID;
in = (in+1)%SIZE_OF_BUFFER;
std::cerr << "Succeed" << std::endl;
. ";
ConsumeID = g_buffer[out];
out = (out+1)%SIZE_OF_BUFFER;
std::cerr << "Succeed" << std::endl;
. ";
std::cerr << "Succeed" << std::endl;
}
考在“生产者和消费者”经典同步问题中,两个P操作是否可以互换位置,以及两个V操作是否可以互换位置。
在生产者—消费者问题中,如果将两个P操作,即P(full)和P(mutex)互换位置,或者P(empty)和P(mutex)互换位置,都可能引起死锁。考虑系统中缓冲区全满前时,若一生产者进程先执行了P(mutex)操作并获得成功,当再执行P(empty)操作时,它将因失败而进入阻塞状态,它期待消费者执行V(empty)来唤醒自己。在此之前,它不可能执行V(mutex)操作,从而使企图通过P(mutex)进入自己的临界区的其他生产者和所有的消费者进程全部进入阻塞状态,从而引起系统死锁。类似地,消费者进程若先执行P(mutex),后执行P(full),同样可能造成死锁。
V(full)和V(mutex)互换位置,或者V(empty)和V(mutcx)互换位置,则不会引起死锁,其影响只是使临界资源的释放略为推迟一些。
2.思考在“哲学家就餐”经典同步问题中,如何修改程序,可以保证不会发生死锁现象。
(1)至多只允许有四位哲学家同时去拿左边的筷子,最终能保证至少有一位哲学家能够进餐,并在用毕时能释放出他用过的两只筷子,从而使更多的哲学家能够进餐。
(2)仅当哲学家的左、右两只筷子均可用时,才允许他拿起筷子进餐。
(3)规定奇数号哲学家先拿他左边的筷子,然后再去拿右边的筷子,而偶数号哲学家则相反。按此规定,将是1、2号哲学家竞争1号筷子;3、4号哲学家竞争3号筷子。即五位哲学家都先竞争奇数号筷子,获得后,再去竞争偶数号筷子,最后总会有一位哲学家能获得两只筷子而进餐。
5. 思考在“读者与写者”经典同步问题中,如何修改程序,变为“写者优先”的算法。
(写者优先的算法)
var rmutex,wmutex,mutex,s:semaphore=1,1,1,1;
writecount:integer:=0;
reader:begin
repeat
wait(s);
wait(rmutex);
if readcount=0 then wait(wmutex);
readcount:readcount+1;
signal(rmutex);
signal(s);
perform read operation;
wait(rmutex);
readcount:=readcount-1;
if readcount=0 then signal(wmutex);
signal(rmutex);
until false ;
end
writer:begin
repeat
wait(mutex);
if writecount=0 then wait(s);
writecount:writecount+1;
signal(mutex);
wait(wmutex);
perform write operation;
signal(wmutex);
wait(mutex);
writecount:=writecount-1;
if writecount=0 then signal(s);
signal(mutex);
until false ;
end
4. 分析以下进程运行环境中出现的同步和互斥现象,列出相应的变量和参数。理发店理有一位理发师、一把理发椅和n把供等候理发的顾客坐的椅子。如果没有顾客,理发师便在理发椅上睡觉。一个顾客到来时,它必须叫醒理发师。如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,就坐下来等待,否则就离开。
理发师是顾客争用的资源,用信号量barbers表示,初值为0;除此以外,顾客还要争用n张椅子,信号量customers表示等候理发的顾客数,初值为0;最后设置信号量mutex用于这两个活动对资源barbers、customers的互斥,初值为1。另外还需使用一个变量waiter,用于记录等候的顾客的数量。
展开阅读全文