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);// 可以有顾客去你们店了
	}
}

  • 106
    点赞
  • 720
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
操作系统中的PV操作是指进程之间通过信号量来实现同步和互斥的一种机制。PV操作主要包括信号量的P操作和V操作。 P操作又称为申请操作。当进程需要使用一个资源时,它需要执行P操作。P操作会检查该资源的信号量值,若值大于0,则表示资源可用,进程可以继续执行,并将信号量值减1;若值等于0,则表示资源不可用,进程需要等待。 V操作又称为释放操作。当进程释放一个资源时,它需要执行V操作。V操作会将该资源的信号量值加1。如果有其他进程正在等待该资源,V操作会唤醒其中一个进程,使其继续执行。 下面通过一个简单的例子来说明PV操作的使用: 假设有两个进程P1和P2,它们都需要访问一个临界资源,同时只能有一个进程访问该资源。 1. 初始化一个二进制信号量sem,初始值为1,表示资源可用。 2. P1进程执行时,先执行P操作,检查sem的值。由于sem的值为1,P1可以继续执行,sem的值变为0,表示资源已被占用。 3. P1进程访问资源进行操作。 4. P1进程操作完成后,执行V操作,将sem的值加1。由于没有其他进程等待该资源,操作结束。 5. P2进程执行时,先执行P操作,检查sem的值。由于sem的值为1,P2可以继续执行,sem的值变为0,表示资源已被占用。 6. P2进程访问资源进行操作。 7. P2进程操作完成后,执行V操作,将sem的值加1。由于没有其他进程等待该资源,操作结束。 通过PV操作的使用,可以实现进程之间的同步和互斥。只有当资源可用时,进程才能访问该资源,否则需要等待。这样可以有效避免进程之间的冲突和竞争。对于并发程序的正确执行具有重要意义。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值