用信号量进程同步与互斥
1.理解生产者和消费者问题
没有引入信号量时的生产者和消费者进程,什么情况下会出现结果不唯一?什么情况下会出现永远等待?
答:当消费者与生产者同时进行时,会导致结果不唯一,这是进程同步的问题
当生产者的生产第一个产品时,进程意外被中断会导致程序出现永远等待。
用信号解决生产者和消费者的同步与互斥,要求能自己写出来。
int k; typedef anyitem item; item buffer[k]; int i=0,o=0,c=0; process prodicer(){ produce an item in nextp; if(c==k) sleep(producer); buffer[i]=nextp; i=(i+1)%k; counter++; if(counter==1) wakeup(consumer); } process consumer(){ while(true){ if(counter==0) sleep(consumer); nextc=buffer[o]; o=(o+1)%k; counter--; if(counter==k-1) wakeup(producer); } consume the item in nextc; }
2.哲学家吃面问题
semaphore fork[5];
for(int i=0; i<5;i++)
fork[i]=1;
cobegin
process philosopher_i( ){
while(ture){
think( );
P(fork[i]);
P(fork[(i+10%5]);
eat();
V(fork[i]);
V(fork[(i+10%5]);
}
}
coend
3.读写文件问题
int readcount=0;
semaphore writeblock=1,mutex=1;
cobegin
process reader_i() {
P(mutex);
readcount++;
if(readcount==1)
P(writerblock);
V(mutex);
/*读文件*/
P(mutex);
readcount--;
if(readcount==0)
V(writeblock);
V(mutex); }
coend
4.理发师问题
int waiting=0, chairs=n;
semaphore customers=0,barbers=0,mutex=1;
cobegin
process barbers() {
while(ture) {
P(customers);
P(mutex);
waiting--;
V(barbers);
V(mutex);
cuthair(); } }
process customer_i() {
P(mutex);
if(waiting<chairs) {
waiting++;
V(customers);
V(mutex);
P(barbers):
get_haircut();
}
else
V(mutex);
}
coend
5.在一间酒吧里有三个音乐爱好者队列,第一队的音乐爱好者只有随身听,第二队只有音乐磁带,第三队只有电池。而要听音乐就必须随身听、音乐磁带和电池这三种物品俱全。酒吧老板一次出售这三种物品中的任意两种。当一名音乐爱好者得到这三种物品并听完一首乐曲后,酒吧老板才能再一次出售这三种物品中的任意两种。于是第二名音乐爱好者得到这三种物品,并开始听乐曲。全部买卖就这样进行下去。试用P,v操作正确解决这一买卖。
6.某银行有人民币储蓄业务,由n个储蓄员负责。每个顾客进入银行后先取一个号,并且等着叫号。当一个储蓄人员空闲下来,就叫下一个号。请用P,V操作正确编写储蓄人员和顾客进程的程序。
7.下面是两个并发执行的进程。它们能正确运行吗?若不能请举例说明,并改正之。(5分)
parbegin
var X:integer;
process P1 process P2
var y,z:integer: var t,u:integer;
begin begin
x:=1; x:=0:
y:=0: t=0;
if x≥l then y:=y十1; if x≤l then t:=t+2;
z:=y; u:=t;
end; end;
parend.
8.九、在一个盒子里,混装了相等数量的黑棋子和白棋子,现要用自动分拣系统把黑棋子和白棋子分开,该系统由两个并发执行的进程P1和P2组成,其中进程P1专门拣黑子,进程P2专门拣白子。规定两个进程轮流拣子且每个进程每次只拣一个子。当一个进程在拣子时不允许另一个进程去拣子,并设P1先拣。请用P,V操作管理这两个并发进程,使其能正确实现上述功能。