【1】 桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。
muteApple=0,muteOrange=0,empty=1;
main(){
cobegin
father();
son();
daughter();
coend
}
father(){ son(){ daughter(){
while(1){ while(1){ while(1){
p(empty); p(muteOrange); p(muteApple);
放水果 取桔子 取苹果
if (苹果) v(muteApple); v(empty); v(empty);
else v(muteOrange); 吃桔子 吃苹果
}} }} }}
【2】四个进程A、B、C、D都要读一个共享文件F,系统允许多个进程同时读文件F。但限制是进程A和进程C不能同时读文件F,进程B和进程D也不能同时读文件F。为了使这四个进程并发执行时能按系统要求使用文件,现用PV操作进行管理,请回答下面的问题:
(1)应定义的信号量及初值:
muteAC=1, muteBD=1;
(2)在下列的程序中填上适当的P、V操作,以保证它们能正确并发工作:
A() B() C() D()
{ { { {
p(muteAC); p(muteBD); p(muteAC); v(muteBD);
read F; read F; read F; read F;
v(muteAC); v(muteBD); v(muteAC); v(muteBD);
} } } }
【3】测量控制系统中的数据采集任务把所采集的数据送一单缓冲区;计算任务则 从该缓冲区中取出数据并进行计算。试写出利用信号量机制实现两者共享单缓冲区的同步算法。
empty=1, muteData=0;
collect(){ fetch(){
while(true){ while(true){
采集数据 p(muteData);
p(empty); 从缓冲区取数据
放数据到缓冲区 v(empty);
v(muteData); 计算数据
}} }}
【4】有一阅览室,共有100个座位。读者进入时必须先在一种登记表上登记,该表为每一座位列一个表目,包括座号和读者姓名。读者离开时要注销掉登记内容。试用wait和signal原语描述读者进程的同步问题。
读者:进、登记、占座位、注销、释放座位
mutex=1,//互斥信号量,登记和注销在一个本子上,且只能有一人执行一种操作
empty=100,//空位数
reader(){
while(true){
wait(empty);
wait(mutex);
登记
signal(mutex);
阅览文章
wait(mutex);
注销
signal(mutex)
signal(empty);
}}
【5】在4×100米接力赛中,4个运动员之间存在如下关系,运动员1跑到终点把接力棒交给运动员2;运动员2一开始处于等待状态,在接到运动员1传来的接力棒后才能往前跑,他跑完100米后交给运动员3,运动员3也只有在接到运动员2传来的棒后才能跑,他跑完100米后交给运动员4,运动员4接到棒后跑完全程。请试用信号量机制对其上过程进行分析。
mute1=0, mute2=0, mute3=0;
2等1跑完才能跑,3等2跑完才能跑,4等3跑完才能跑
athlete1(){ athlete2(){ athlete3(){ athlete4(){
run 100m wait(mute1); wait(mute2); wait(mute3);
signal(mute1); run 100m run 100m run 100m
} signal(mute2); signal(mute3); }
} }
【6】在公共汽车上,司机和售票员各行其职,司机负责开车和到站停车;售票员负责售票和开、关车门;当售票员关好车门后驾驶员才能开车行驶。试用wait和signal操作实现司机和售票员的同步。
s1=1, s2=0;
driver(){ conductors(){
while(true){ while(true){
wait(s1)//申请开车变量 关车门
开车 signal(s1);//释放开车变量
正常行驶 售票//关门后才售票
到站停车 wait(s2);//请求开门变量
signal(s2);//释放开门变量 开车门
}} }}
【7】假设有3个并发进程P,Q,R,其中P负责从输入设备上读入信息,并传送给Q,Q将信息加工后传送给R,R负责打印输出。进程P,Q共享一个有m个缓冲区组成的缓冲池;进程Q,R共享一个有n个缓冲区组成的缓冲池(假设缓冲池足够大,进程间每次传输信息的单位均小于等于缓冲区长度),请写出满足上述条件的并发程序。
p: 读信息、申请缓冲池、放信息到PQ缓冲池
Q: 从PQ取信息、释放PQ缓冲池、加工信息、申请QR缓冲池
R: 从QR取信息、释放QR缓冲池、输出信息
dataPQ=0, dataQR=0, //初始PQ、QR缓冲池中数据都为空
bufferPQ=m, bufferQR=n,//初始缓冲池数量
mutePQ=1, //互斥信号量。PQ不能同时访问缓冲池
muteQR=1; //互斥信号量。QR不能同时访问缓冲池
P(){ Q(){ R(){
while(true){ while(true){ while(true){
读取信息 wait(dataPQ); wait(dateQR);
wait(bufferPQ); wait(mutePQ); wait(muteQR);
wait(mutePQ); 从PQ缓冲区取信息 从QR缓冲区取信息
放信息到缓冲池PQ signal(mutePQ); signal(muteQR);
signal(mutePQ); signal(buffePQ); signal(bufferQR);
signal(dataPQ); 加工信息 输出信息
}} wait(bufferQR); }}
wait(muteQR);
放信息到QR缓冲区
signal(muteQR);
signal(dataQR);
}}
【8】有一只铁笼子,每次只能放入一只动物,猎手向笼子里放入老虎,农民向笼子里放入猪;动物园等待取笼子里的老虎,饭店等待取笼子里的猪。现请用wait和signal操作写出能同步执行的程序。
empty=1, //笼子为空
tiger=0, wildBoar=0;//没有动物
hunter(){ zoo(){} farmer(){ restaurant(){
while(true){ while(true){ while(true){ while(true){
wait(empty); wait(tiger); wait(empty); wait(wildBoar);
放老虎 取老虎 放野猪 取野猪
signal(tiger); signal(empty); signal(wildBoar); signal(empty);
}} }} }} }}