OS-P、V操作例题

Sa,Sb,Sc是已定义的信号量,初始值为1、0、0;x,y,z是公共变量,下面三个并发程序段执行后,x=19,y=10,z=28;

prA(){
    P(Sc);
    z=x+y;
    V(Sb);
}

prB(){
    y=18;
    P(Sb);
    V(Sa);
    P(Sb); 
    y=z-y;
    V(Sa);
}

prC(){
    P(Sa);
    x=10;
    V(Sb);
    P(Sa);
    X=z-9;
}

解释:

首先弄清P、V的含义,
P:wait(<0阻塞),V:signal(<=0唤醒)
确定信号量的初始值:发现Sa=1;即先从prC开始执行:
{
    P(sa),使Sa=0;->可以执行,得x=10;
    紧接后面V(Sb)且P(Sa),使Sb=1同时prC这个进程发生阻塞;
}
紧接Sb=1,执行prB:
{
    y=18;P(Sb)使Sb=0;然后旁边是V(Sc)且P(Sb):意味着prB进程阻塞和Sc=1;
}
Sc=1,所以执行prA:
{
    P(Sc)使Sc=0;z=x+y=10+18,即z=28;
    接下来V(Sb)使Sb=1;
}
Sb=1即刚刚被阻塞的prB可以执行了:
{
    y=z-y=28-18=10;
    接下来:V(Sa)使Sa=1;
}
Sa=1可以执行刚刚被阻塞的prC:
{
    x=z-9=28-9=19
}、

所以:x=19,y=10,z=28
  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值