ch3-3经典的进程同步问题.ppt.Convertor

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档