pv操作的经典习题

1、有一阅览室,共有100个座位。读者进入时必须先在一种登记表上登记,该表为每一座位列一个表目,包括座号和读者姓名。读者离开时要注销掉登记内容。试用wait和signal原语描述读者进程的同步问题。

semaphore empty = 100;// 记录空座位
semaphore mutex = 1;// 作为互斥的访问登记和注销操作
void reader()
{
    while(true)
    {
        wait(empty);
        wait(mutex);
        // 登记
        signal(mutex);
        // read
        wait(mutex);
        // 注销
        signal(mutex);
        signal(empty);
    }
}


2、有一只铁笼子,每次只能放入一只动物,猎手向笼子里放入老虎,农民向笼子里放入猪;动物园等待取笼子里的老虎,饭店等待取笼子里的猪。现请用wait和signal操作写出能同步执行的程序。

semaphore box = 1;// 记录笼子是否为空
semaphore tiger = 0,pig = 0;// 作为老虎和猪的同步信号量
void hunter()
{
    while(true)
    {
        wait(box);
        // 放入老虎
        signal(tiger);
    }
}
void farmer()
{
    while(true)
    {
        wait(box);
        // 放入猪
        signal(pig);
    }
}
void zoo()
{
    while(true)
    {
        wait(tiger);
        // 取走老虎
        signal(box);
    }
}
void restaurant()
{
    while(true)
    {
        wait(pig);
        // 取走猪
        signal(box);
    }
}


3、某车站售票厅,任何时刻最多可容纳20名购票者进入,当售票厅中少于20名购票者时则厅外的购票者可立即进入,否则需在外面等待。若把一个购票者看作一个进程,请回答下列问题

(1)用PV操作管理这些并发进程时,应怎样定义信号量?写出信号量的初值以及信号量各种取值的含义。

(2)若欲购票者最多为n个人,写出信号量可能的变化范围(最大值和最小值)。

(1)定义一信号量S,初始值为20。

S>0,S的值表示可继续进入售票厅的人数;

S=0,表示售票厅中已有20名顾客(购票者);

S<0,|S|的值为等待进入售票厅的人数。

(2)由于s的值表示的是在售票厅有多少个座位,因此最大值为s(表示没有人)最小值为s-n(根据n来决定)

4、在公共汽车上,司机负责开车、停车和驾驶,售票员负责门的开门、关门和售票。基本操作规则是只有停车后售票员才能开门只有售票员关门后司机才能开车。汽车初始状态处于行驶之中。当只有1个司机、2个售票员、2个门、每个售票员负责一个门时的协调操作。请使用P、V原语实现售票员与司机之间的协调操作说明每个信号量的含义、初值和值的范围。【燕山大学 2006复试】

semaphore full1 = 0,full2 = 0;// 作为司机和售票员的同步信号量
semaphore door1 = 1,door2 = 1;//作为记录门的同步信号量
void driver()
{
    while(true)
    {
        wait(door1);// 只有售票员关门后司机才能开车
        wait(door2);
        // 启动车辆;
        // 正常行车;
        // 到站停车;
        signal(full1);//只有停车后售票员才能开门
        signal(full2);
    }
}
void seller1()
{
    while(true)
    {
        wait(full1);//只有停车后售票员才能开门
        // 开门
        // 关门
        signal(door1);
        // 售票
    }
}
void seller2()
{
    while(true)
    {
        wait(full2);//只有停车后售票员才能开门
        // 开门
        // 关门
        signal(door2);
        // 售票
    }
}


5、某银行有人民币储蓄业务由n个柜员负责有1台取号机。每个顾客进入银行后先取一个号若有人取号则需等他人取完后才能取,取到号后等待叫号当一个柜员人员空闲下来就叫下一个号。试用P、V操作正确编写柜台人员和顾客进程的程序。【昆明理工大学 2006】

semaphore mutex = 1;// 互斥信号量 充当一台取号机的作用
semaphore empty = 1;// 叫号机的使用
semaphore full = 0;// 顾客和服务人员的同步信号量
semaphore sell = n;// 记录是否有空闲的顾客
void customer()
{
    while(true)
    {
        wait(mutex);
        // 取号
        signal(mutex);
        // 等待叫号
        signal(full);
        wait(sell);
    }
}
void seller()
{
    while(true)
    {
        wait(full);
        wait(mutex);
        // 叫号
        signal(mutex);
        // 服务
        signal(sell);
    }
}


6、在一间酒吧里有三个音乐爱好者队列,第一个音乐爱好者只有随身听,第二个只有音乐磁带,第三个只有电池,而要听音乐就必须有随身听,音乐磁带和电池这三种物品。酒吧老板一次出售这三种物品中的任意两种,当一名音乐爱好者得到这三种物品并听完乐曲后,酒吧老板才能再一次出售这三种物品中任意两种,于是第二名音乐爱好者得到这三种物品。并开始听乐曲,全部买卖就这样进行下去。使用P,V操作正确解决这一买卖。(北京大学1999)

semaphore s = 1;// 作为是否有顾客来的标志
bool flag1,flag2,flag3 = true;// 标识是否有资源
semaphore s1 = 0,s2 = 0,s3 = 0;// 作为和爱好者进行同步的信号量
void boss()
{
    while(true)
    {
        wait(s);
        if(flag2&flag3)
            signal(s1);
        else if(flag1&flag3)
            signal(s2); 
        else
            signal(s3); 
    }
}
void hobby1()
{
    while(true)
    {
        wait(s1);
        // 购买物品听乐曲
        signal(s);// 可以有顾客去你们店了
    }
}
void hobby2()
{
    while(true)
    {
        wait(s2);
        // 购买物品听乐曲
        signal(s);// 可以有顾客去你们店了
    }
}
void hobby3()
{
    while(true)
    {
        wait(s3);
        // 购买物品听乐曲
        signal(s);// 可以有顾客去你们店了
    }
}

————————————————
版权声明:本文为CSDN博主「frewenwang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fuziwang/article/details/79884501

  • 3
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值