ch3-3经典的进程同步问题.ppt.Convertor
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.3 经典的进程同步问题3.3.1 生产者-消费者问题3.3.2 读者-写者问题3.3.3 哲学家进餐问题3.3.4 理发师问题
1
生产者-消费者问题
生产者--消费者问题是操作系统中并发进程内在关系的一种抽象
生产者进程可以是计算进程、发送进程;而消费者进程可以是打印进程、接收进程等等
2
生产者消费者问题
①一个生产者、一个消费者共享一个缓冲区
②一个生产者、一个消费者共享多个缓冲区
③多个生产者、多个消费者共享多个缓冲区
④多个生产者、多个消费者共享一个缓冲区
⑤多个生产者、一个消费者共享多个缓冲区
⑥一个生产者、多个消费者共享多个缓冲区
3
一个生产者、一个消费者
共享一个缓冲区的解(1)
var B : integer;
empty : semaphore;
full : semaphore;
empty : = 1;
full := 0;
4
一个生产者、一个消费者
共享一个缓冲区的解(2)
process consumer
Begin
L2:
P(full);
Product:= B;
V(empty);
Consume a product;
Goto L2;
end;
Process producer
begin
L1:
Produce product;
P(empty);
put B product in;
V(full);
Goto L1;
end;
5
多个生产者、多个消费者
共享多个缓冲区的解(1)
n个生产者和m个消费者,连接在一个有k个单位缓冲区的有界缓冲池上
只要缓冲区未满,Pi生产的产品就可投入缓冲区;
只要缓冲区不空,消费者进程Cj就可从缓冲区取走并消耗产品
Pi和Cj是并发进程(i=1 n,j=1 m),Pi作为生产者生产产品,Cj作为消费者消费产品6
多个生产者、多个消费者
共享多个缓冲区的解(2)
var B:array[0..k-1] of item;
empty:semaphore:=k;
full:semaphore:=0;
mutex:semaphore:=1;
in,out:integer:= 0;
cobegin
7
多个生产者、多个消费者
共享多个缓冲区的解(3)
process producer_i process consumer_j
Begin begin
L1:produce a product; L2:P(full);
P(empty); P(mutex);
P(mutex); Product:= B[out];
B[in]:= product; out:=(out+1) mod k;
in:=(in+1) mod k; V(mutex);
V(mutex); V(empty);
V(full); Consume a product;
Goto L1; Goto L2;
end; end;
coend
9
读者-写者问题
有两组并发进程:读者和写者,共享一个文件F,要求:
允许多个读者可同时执行读操作
任一写者在完成写操作之前不允许其它读者或写者工作
当有读者执行读操作时,不允许其它写者去修改(写)文件
10
解决读者-写者问题的思路
多个读者可同时读
写者与写者之间要互斥
写者与读者之间要互斥
即:
11
解决读者-写者问题的步骤(1)
第一步:
Begin
s:semaphore;
S:=1;
Rc:integer;
Rc:=0;
cobegin
12
解决读者-写者问题的步骤(2) Process Writerj
begin
p(s);
write file F;
V(s) ;
end
Process Readeri
begin
rc:=rc+1
if rc=1 then p(s)
read file F;
rc:=rc-1;
if rc=0 then v(s)
end
coend
end
13
解决读者-写者问题的步骤(3)
存在问题的原因:
忽略了rc也是个供多个读者共享的共享资源
14
解决读者-写者问题的步骤(4)
解决方法:
begin
S,Sr:semaphore;
rc:integer;
S:=1; Sr:=1;
rc:=0;
cobegin
15
解决读者-写者问题的步骤(5) Process Writerj
begin
p(s);
write file F;
V(s)
end;
coend;
end
Process Readeri
begin
p(Sr);
rc:=rc+1;
if rc=1 then p(s);
v(Sr);
read file F;
p(Sr);
rc:=rc-1;
if rc=0 then v(s);
v(Sr);
end
16
解决读者-写者问题的解释
信号量Sr仅用于管理计数器rc的互斥使用
17
哲学家吃通心面问题(1)
有五个哲学家围坐在一圆桌旁,桌中央有一盘通心面,每人面前有一只空盘子,每两人之间放一支筷子。每个哲学家思考、饥饿、然后吃通心面。为了吃面,每个哲学家必须获得两支筷子,且每人只能直接从自己左边或右边去取筷子
18
哲学家吃通心面问题(2)
19
哲学家吃通心面问题(3)
var forki :array[0..4] of semaphore;
forki := 1;
cobegin
process Pi // i=0,1,2,3,4,
begin
L1:
思考;
P(fork[i]);
P(fork[(i+1)mod 5]);
吃通心面;
V(fork[i]);
V(fork[(i+1)mod 5]);
goto L1;
end;
coend;