操作系统-PV原语练习

1 吃水果问题:

   桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等待吃盘子中的苹果。

   请用信号量及PV操作来实现爸爸、妈妈、儿子和女儿之间的同步与互斥关系。

{  //初始化
    apple = 0; 标识盘中苹果的个数
    orange = 0; 标识盘中橘子的个数
    metux = 1; 标识盘子的互斥操作
    empty = 2; 标识盘子的容量
}

father(){
    P(empty); 盘子有空位则占去一个,否则等待(先检查同步对象,再检查互斥对象)
    P(mutex); 等待互斥对象
    爸爸放入一个苹果;
    V(mutex); 释放互斥对象
    V(apple); 增加苹果数量
}

mother(){
    P(empty); 盘子有空位则占去一个,否则等待
    P(mutex); 等待互斥对象
    妈妈放入一个橘子;
    V(mutex); 释放互斥对象
    V(orange); 增加橘子数量
}

son1(){
    P(orange); 检查盘中有无橘子
    P(mutex); 等待互斥对象
    儿子1拿一个橘子;
    V(mutex); 释放互斥对象
    V(empty); 盘子多出一个空位
}

son2{
    P(orange);
    P(mutex);
    儿子2拿一个橘子;
    V(mutex);
    V(empty);
}

daughter1(){
    P(apple); 检查盘中有无苹果
    P(mutex); 等待互斥对象
    女儿1拿一个苹果;
    V(mutex); 释放互斥对象
    V(empty); 盘子多出一个空位
}

daughter2(){
    P(apple);
    P(mutex);
    女儿2拿一个苹果;
    V(mutex);
    V(empty);
}

main(){
    cobegin
    father(); mother(); son1(); son2(); daughter1(); daughter2();
    coend
}

2 理发师问题:

    一个理发店有N张沙发接待顾客,有P位理发师(N>P)。顾客到来时,如果还有空沙发,新到的顾客就坐在沙发上;如果没有空沙发,就离开。空闲的理发师为顾客理发;若理发师都在理发,顾客则需等待。

   试用信号量及PV操作实现理发师给顾客理发的问题。 

{//初始化

    sofa = N; 空沙发的数量(变量)

    barber = P; 理发师的数量(信号量)

    customer = 0; 等待中的顾客数量(信号量)

    sofa_mutex = 1; 访问空闲sofa数量的(互斥信号量)

}



barber(){

    P(customer); 判断有无顾客在等待中

    P(barber); 判断是否有理发师正空闲

    安排一名理发师给顾客理发;

    V(barber); 理发完毕,一名理发师空闲

    P(sofa_mutex); 要锁定访问空闲沙发数量

    sofa++; 空闲沙发数量++

    V(sofa_mutex); 释放 

}



custom(){

    P(sofa_mutex); 申请锁定访问空闲沙发数量

    if(sofa > 0){ //如果还有空沙发

        V(sofa_mutex); 释放

        V(customer); 等待的顾客数量++

        P(barber) ;判断有无空闲理发师

        安排一名理发师给顾客理发;

    }

    else{

        V(sofa_mutex);

        顾客离开;

    }

}



main(){

    cobegin

    barber(); custom();

    coend

}
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值