进程互斥同步问题
- 记录型信号量
题型1(单生产者,单消费者,单缓)
1.由三个进程get,copy和put以及两个缓冲区buffer1和buffer2完成 一项输入/输出操作。进程get的功能是把一张卡片上的信息从读卡机
上读进buffer1;进程copy的功能是把buffer1中的信息复制到buffer2;进程put的功能是取出buffer2中的信息并从打印机上打印输出。试
用P、V操作完成这三个进程间的尽可能并发正确执行的关系(用程序或框图表示),并指明信号量的作用和初值
伪代码:
#定义信号量
var mutexB1,mutexB2,emptyB1,emptyB2,fullB1,fullB2:semaphore:=(1,1,1,1,0,0)
begin
parbegin:
get进程:repeat
//等待2个资源
wait(mutexB1)
wait(emptyB1)
buffer1:=get(card)
//释放资源
signal(mutexB1)
//现在第一个缓冲区已经满了
signal(fullB1)
copy进程:repeat
wait(mutexB2)
wait(mutexB1)
wait(fullB1)
wait(emptyB2)
//拷贝操作
buffer2:=copy(buffer1)
//释放资源
signal(mutexb2)
signal(mutexb1)
signal(emptyB1)
signal(fullB2)
Put进程:repeat
wait(mutexB2)
wait(fullB2)
printf(buffer2)
//释放资源
signal(emptyB2)
signal(mutexB2)
parend
题型2(多人,多缓)
2.某寺庙,有小和尚、老和尚若干。有一水缸,由小和尚提水入缸老和尚饮用。水缸可容十桶水,水取自同一井中。水井径窄,每次只能容一桶
取水。水桶总数为3个。每次入、取水仅为一桶,且不可同时进行。试给出有关取水、入水的算法描述
伪代码:PV
var mutexSJ(水井互斥),mutexSG(水缸互斥[每次入、取水仅为一桶,且不可同时进行]),emptyTCount,canSGEmptyCount(进剩余),canSGFullCount(现在):semaphore:=(1,1,3,10,0)
parbegin
小和尚:
P(canSGEmptyCount)//看水井是不是空的
P(emptyTCount)//先看有空桶没有
P(mutexSJ)
拿桶取水
V(mutexSJ)//释放水井
P(mutexSG)//访问水缸互斥
装水到水缸
V(mutexSG)
V(canSGFullCount)//增加一个填充容量
老和尚:
P(mutexSG)
P(canSGFullCount)
P(emptyTCount)//需要一个空桶来喝水
和尚喝水
V(mutexSG)
V(canSGEmptyCount)
V(emptyTCount)//释放桶