互斥信号量问题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2010年01月10日 星期日 下午 05:53信号量机制一般信号量集的几种特殊情况:


Swait(S, d, d),只有一个信号量S,允许每次申请d个资源,若现有资源数少于d,不予分配。
Swait(S, 1, 1),蜕化为一般的记录型信号量(S>1时)或互斥信号量(S=1时)。
Swait(S, 1, 0),当S>=1时,允许多个进程进入某特定区,当S变为0后,阻止任何进程进入特定区,相当于可

控开关。
产者——消费者问题
Var mutex, empty, full: semaphore :=1, n, 0;
buffer: array [ 0, …, n-1] of item;
in, out: integer :=0, 0;
begin
parbegin
producer : begin
repeat

produce an item in nexp;

Swait(empty, mutex);
buffer(in):=nexp;
in:=(in+1) mod n;
Ssignal(mutex, full);
until false;
end
consumer : begin
repeat
Swait(full, mutex);
nextc:=buffer(out);
out:=(out+1) mod n;
Ssignal(mutex, empty);
consume the item in nexc;
until false;
end
parend
end
读者——写者问题:一个数据文件或记录可被多个进程共享。
只要求读文件的进程称为“Reader进程”,其它进程则称为“Writer进程”。
允许多个进程同时读一个共享对象,但不允许一个Writer进程和其他Reader进程或Writer进程同时访问共享对

象。
“读者——写者问题”是保证一个Writer进程必须与其他进程互斥地访问共享对象的同步问题。为实现Reader

与Writer进程间在读或写时的互斥而设置了一个互斥信号量Wmutex。设置整型变量Readcount表示正在读的进程

数目。
由于只要有一个Reader进程在读,便不允许Writer进程去写。因此,仅当Readcount=0,表示尚无Reader进程在

读时,Reader才需要执行Wait(Wmutex)操作。若Wait(Wmutex)操作成功,Reader进程便可去读,相应地,做

Readcount+1操作。
Var rmutex, wmutex :semaphore :=1, 1;
Readcount :integer :=0;
begin
parbegin
Reader : begin
repeat
wait(rmutex);
if Readcount=0 then wait(wmutex);

Readcount :=Readcount +1;
signal(rmutex);

perform read operation;

wait(rmutex);
Readcount :=Readcount -1;
if Readcount=0 then signal(wmutex);
signal(rmutex);
until false;
end
Writer : begin
repeat
wait(wmutex);
perform write operation;
signal(wmutex);
until false;
end
parend
end
哲学家进餐问题1. 利用记录型信号量解决哲学家进餐问题
放在桌子上的筷子是临界资源,在一段时间内只允许一个哲学家使用。为实现对筷子的互斥使用,用一个信号量表示一只筷子,五个信号量构成信号量数组。
Var chopstick: array [0, …, 4] of semaphore;
所有信号量均被初始化为1。第i 位哲学家的活动可描述为:
repeat
wait(chopstick[ i ]);
wait(chopstick[ ( i +1) mod 5] );

eat;

signal(chopstick[ i ]);
signal(chopstick[ ( i +1) mod 5] );

think;
until false;
解决方法:
至多只允许有四位哲学家同时去拿左边的筷子,最终能保证至少有一位哲学家能够进餐,并在用毕后释放出他用过的两只筷子,从而使更多的哲学家能够进餐。---限制并发执行的进程数
仅当哲学家的左右两只筷子均可用时,才允许他拿起筷子进餐。---采用信号量集
规定奇数号哲学家先拿他左边的筷子,然后再去拿右边的筷子;偶数号哲学家则相反。---保证总会有一个哲学家能同时获得两只筷子而进餐2. 利用AND信号量机制解决哲学家进餐问题
Var chopstick: array [0, …, 4] of semaphore:=(1, 1, 1, 1, 1);
Process i
repeat
think;
Swait(chopstick[ ( i +1) mod 5] , chopstick[ i ] );
eat;
Ssignal(chopstick[ ( i +1) mod 5] , chopstick[ i ] );
until false;
关于信号量的进一步说明:1记录型信号量可以用于两个进程,也可以用于多个进程,既可以用于互斥,也可以用于同步。当互斥与同步共存时,一般来说,用于互斥的信号量上的Wait操作总是在后执行。2如果用于互斥,常称为互斥(或公用)信号量,其初值为1。对于两个并发进程,S只有1、0、-1三个取值:

s=1:无进程进入临界区;
s=0:有一个进程进入

临界区;
s=-1: 有一个进程在临界区,另一个进程等待进入临界区。
对于n个并发进程,信号量S可取值的范围是: 1~ -(n-1),当S<0时,表示有一个进程已进入临界区,而且还有|S|个进程正在等待进入临界区,它们处于等待队列中。
对于互斥信号量,每一进程均可对其进行Wait、Signal操作。
如果用于同步,多采用私用信号量,也称为资源信号量,其初值视资源数而定。它联系一组并发进程,只允许拥有它的进程对其实施Wait操作。
作为资源信号量,当S>0时,其值表示可用资源的数量,执行一次Wait操作意味着请求分配一个单位的资源;若S<=0,表示已无资源,申请资源的进程被阻塞,并排入信号量S的等待队列中,执行一次Signal操作,意味着释放一个单位的资源。


相关文档
最新文档