操作系统作业(第2章 进程和线程)PV操作大题

操作系统作业1(第2章 进程和线程)


每题要求三部分内容:(1)进程分析(需要哪几个进程,进程的功能和执行过程简述);(2)所使用的信号量和计数变量功能和初值;(3)用类C语言描述进程算法。

1、有一阅览室,共有100个座位。读者进入时必须先在一种登记表上登记,该表为每一座位列一个表目,包括座号和读者姓名。读者离开时要注销掉登记内容。试用PV操作描述读者进程的同步问题。
(1)分析:
登记本的操作要互斥,空座位是资源,要申请。每个读者对应一个进程。当一个读者进入阅览室时,就为他建立一个进程;当读者离开阅览室时,就终止该进程。各进程的程序代码相同。
(2)信号量:
chair:空座位,初值为100。
mutex: 互斥使用登记表,初值为1。
(3)算法:

semaphore chair=100,mutex=1;
void library( )
 {
	P(chair);
	P(mutex);
	登记;
	V(mutex);
	阅读;
	P(mutex);
	注销登记;
	V(mutex);
	V(chair);
}

2、有一只铁笼子,每次只能放入一只动物,猎手向笼子里放入老虎,农民向笼子里放入猪;动物园等待取笼子里的老虎,饭店等待取笼子里的猪。试用PV操作写出能同步执行的程序。
(1)分析:
笼子只能放一种动物,设置空间资源empty,它同时也是笼子的互斥使用,初值为1;
猎手放老虎前先看看有无空间,若有则抢笼子,放老虎。后向动物园发信号(V (tiger));
农民放猪前先看看有无空间,若有则抢笼子,放猪后向饭店发信号(V (pig));
动物园先看有无老虎,若有则抢笼子,取走老虎后将笼子释放(V (empty));
饭店先看有无猪,若有则抢笼子,取走猪后将笼子释放(V (empty))。
(2)信号量:
空间资源empty,初值为1;
tiger表示笼子中老虎个数,pig表示笼子中猪个数,初值均为0.
(3)算法:

semaphore empty=1,
tiger=0,pig=0;
void hunter( ) {
  while(1)  {
	P(empty);
	放入老虎;
	V(tiger)} 
 }

void  farmer( ) {
  while(1)  {
	P(empty);
	放入猪;
	V(pig)}
} 

void  zoo ( ) {
  while(1){
      P(tiger);
      取出老虎;
      V(empty)}
} 

void restaurant ( ) {
  while(1) {
      P(pig);
      取出猪;
      V(empty)}
}

3、假设有3个并发进程P,Q,R,其中P负责从输入设备上读入信息,并传送给Q,Q将信息加工后传送给R,R负责打印输出。进程P,Q共享一个有m个缓冲区组成的缓冲池;进程Q,R共享一个有n个缓冲区组成的缓冲池(假设缓冲池足够大,进程间每次传输信息的单位均小于等于缓冲区长度),请写出满足上述条件的并发程序。
(1)分析:
这是两次生产者-消费者问题。P,Q,R共三个进程。其中,Q既是PQ中的消费者,又是QR中的生产者。
(2)信号量:
full_pq:PQ缓冲区的可用信息数,初值为0;
full_qr:QR缓冲区的可用信息数,初值为0;
empty_pq: PQ缓冲区的可用空位数,初值为m;
empty_qr: QR缓冲区的可用空位数,初值为n;
mutex_pq:PQ缓冲区的互斥信号量,初值为1;
mutex_qr:QR缓冲区的互斥信号量,初值为1;
(3)算法:

semaphore full_pq=0,empty_pq=m,full_qr=0,empty_qr=n,mutex_pq=1,mutex_qr=1;
void p( )
{
	while(1) 
	{
		P从输入设备上读入信息;
		p(empty_pq);
		p(mutex_pq);
		P把信息放入缓冲区PQ;
		v(mutex_pq);
		v(full_pq);
	}
}

void q( )
{
	while(1) 
	{
		p(full_pq);
		p(mutex_pq);
		Q将信息从缓冲区PQ取出;
		v(mutex_pq);
		v(empty_pq);
		Q将信息加工;
		p(empty_qr);
		p(mutex_qr);
		Q将信息放入缓冲区QR;
		v(mutex_qr);
		v(full_qr);
	  }
}

void r( )
{
while(1) 
{
	p(full_qr);
		p(mutex_qr);
		R将信息从缓冲区QR取出;
		v(mutex_qr);
		v(empty_qr);
	R打印;
   }
}

4、用信号量解决以下的“过独木桥”问题:同一方向的行人可连续过桥,当某一方向有人过桥时,另一方向的行人必须等待;当某一方向无人过桥时,另一方向的行人可以过桥。
(1)分析:每个行人设置一个进程,两个方向是类似的。从A向B方向过桥的进程为A; 从B向A方向过桥的进程为B。该算法相当于读者-写者问题中的读者算法。
每个方向需要用一个计数器,当计数值大于1时,不必申请桥资源,直接过桥。当最后一个人过桥后,释放桥资源。
(2)信号量和计数变量:
信号量bridge:桥资源,初值为1;
信号量mutexa、mutexb:对计数变量num_a、num_b的互斥访问,初值为1
计数变量num_a、num_b:每个方向的过桥人数,初值为0
(3)算法:

semaphore bridge=1, mutexa=1, mutexb=1;
int num_a=0,num_b=0;
void A( )
{
	P(mutexa);
	 	num_a++;
	 	if (num_a==1)  
	P(bridge);
	V(mutexa);
	从A向B方向过桥;
	P(mutexa);
	 	num_a--;
	 	if (num_a==0)  
	V(bridge);
	V(mutexa);
}

void B( )
{
	P(mutexb);
	 	num_b++;
	 	if (num_b==1)  
	P(bridge);
	V(mutexb);
	从B向A方向过桥;
	P(mutexb);
	 	num_b--;
	 	if (num_b==0)  
	V(bridge);
	V(mutexb);
}
  • 4
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值