有关操作系统同步互斥的一些经典问题

本文详细解析了四个经典的进程同步问题:过桥问题、和尚取水问题、奇偶打印问题及苹果橘子问题,通过PV操作和信号量机制确保进程间正确同步与互斥。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.过桥问题:
消除饥饿现象  为公平起见,进一步的改进算法:再增加一个信号量B,初值为1。每个准备上桥的车,都需先争夺信号量B,这样可阻止对面后来的车的上桥机会,从而消除饥饿现象。  

B: 对桥使用权的互斥
S:桥两边的互斥
S1:左边人数计数器count1互斥
S2:右边人数计数器count2互斥
东边的汽车进程:  
P(B);  
P(S1); 
count1 = count1 + 1; 
if (count1 == 1)  
P(S);  
V(S1); 
V(B);  
上桥;  
P(S1);  
count1 = count1 - 1  
if (count1 == 0) 
V(S);  
V(S1) ;   
西边的汽车进程:    
P(B);  
P(S2);   
count2 = count2 + 1;  
if (count2 == 1)  
P(S);  
V(S2);   
V(B);  
上桥; 
P(S2); 
count2 = count2 - 1  
if (count2 == 0)  
V(S);  
V(S2);

2.和尚取水问题:
某寺庙,有小和尚和老和尚若干,有一个水缸,由小和尚提水入缸供老和尚饮用。水缸可以容纳10桶水,水取自同一口井中,由于水井口窄,每次只能容纳一个水桶取水.水桶总数为3个.每次入水、取水仅为一桶,且不可同时进行。
试给出有关取水、入水的算法描述.
信号量:semaphore

Var mutex_well,mutex_vat,empty,full,count,:semaphore 1,1,10,0,3
//mutex_well 表明水井的互斥关系
//mutex_vat表明水缸的互斥关系
//empty将水以桶为单位后,水缸中未有水的桶数
//full将水以桶为单位后,水缸中已由水的桶数
//count可用水桶数
           小和尚:
                P(empty);
                P(mutex_well);
                     P(count);
                     从井中取水;
                     V(mutex_well);
                     P(mutex_vat);
                     送水入水缸;
                     V(mutex_vat);
                     V(count);
                     V(full);
老和尚: 
P(full);
P(mutex_vat);
            P(count);
            从缸中取水;
            V(mutex_vat);
            V(count);
            V(empty);

3.奇偶打印问题:
三个进程R、W1、W2共享一缓冲池B,而B中能存放2个数。R将从输入设备上读入的自然数放到缓冲器B中。若存放的是奇数,则允许W1将其取出打印,如果是偶数,由进程W2取出打印。请利用PV操作保证三个进程间的同步和互斥。

empty=2;缓冲区数量
mutex=1;缓冲区使用权互斥
full1=0;奇数数量
full2=0;偶数数量
void R()
{
    p(empty);
    p(mutex);
    向B中放入自然数;
    v(mutex);
    if(x%2!=0)
    v(full1) 奇数
    else
    v(full2);
}
void W1()
{
  p(full1);
  p(mutex);
  print("x");
  v(mutex);
  v(empty);
}
void W2()
{
  p(full2);
  p(mutex);
  print("x");
  v(mutex);
  v(empty);
}

4.苹果橘子问题
苹果桔子问题:桌上有一只盘子,每次只能放入一只水果;爸爸专向盘子中放苹果(apple),妈妈专向盘子中放桔子(orange),儿子专等吃盘子中的桔子,女儿专等吃盘子里的苹果。请用PV操作和信号量来描述四者的同步动作。

公用信号量 mutex 初值为1,用于实现临界区的互斥。
爸爸的私有信号量 empty1=1, 表示果盘中可以放的水果数目。
妈妈的私有信号量 empty2=1, 表示果盘中可以放的水果数目。
儿子的私有信号量 full1=0,指示盘子中橘子的数量。
女儿的私有信号量 full2=0, 指示盘子中苹果的数量。
Void father()
{
While1)
{
P(empty1)//果盘是否为空。
P(mutex)//是否有其他的人正在使用果盘.
放苹果。
V(mutex)
P(full1)//通知儿子可以去取苹果了。
}
}
Void mother()
{
While(1)
{
P(empty2)
P(mutex)
放橘子。
V(mutex)
P(full2)
}
}
Void son()
{
While(1)
{
P(full1)//果盘中是否有苹果
P(mutex)//是否有其他人在使用果盘。
吃苹果。
V(mutex)
P(empty1)// 通知爸爸可以放苹果了。
}
}
void daughter()
{
While(1)
{
P(full2)
P(mutex)
吃橘子。
V(mutex)
P(empty2)
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值