操作系统作业三:PV操作

文章目录

作业1

题目:桌上有一空盘,只允许存放一个水果。爸爸专向盘中放橙子,妈妈专向盘中放苹果,女儿专等吃橙子,儿子专等吃苹果。规定当盘空时一次只能放一个水果供吃者自用,请用PV操作实现爸爸、妈妈、女儿、儿子四个并发进程的同步。

【答】

设计四个信号量metux,empty、orange、apple;

  • metux表示:爸爸、妈妈、儿子和女儿进程对盘子的互斥使用;
  • empty表示:盘子是否为空;
  • apple表示:是否可以取苹果;
  • orange表示:是否可以取橙子。

伪代码描述如下:

semaphore empty=1,mutex=1,apple=0,orange=0; //为四个信号量赋初值

void father(){//爸爸专向盘中放橙子
    do{
    wait(empty); //等待盘子为空
    wait(metux); //等待获取对盘子的操作
    爸爸向盘中放一个橙子;
    signal(mutex); //释放对盘子的操作
    signal(orange); //女儿可以来盘子中取橙子
    }while(TRUE);
}
void mother(){ //妈妈专向盘中放苹果
    do{
    wait(empty);
    wait(metux);
    妈妈向盘中放一个苹果;
    signal(mutex);
    signal(apple);
    }while(TRUE);
}
void daugther(){//女儿专等吃橙子
    do{
    wait(orange); //判断盘子中是否有橙子
    wait(metux); //等待获取对盘子的操作
    女儿取出盘中的橙子;
    signal(mutex); //释放对盘子的操作
    signal(empty); //盘子空了,可以继续放水果了
    }while(TRUE);
}
void son(){//儿子专等吃苹果
    do{
    wait(apple);//判断盘子中是否有苹果
    wait(metux);
   儿子取出盘中的苹果;
    signal(mutex);
    signal(empty); //盘子空了,可以继续放水果了
    }while(TRUE);
}
void main() { //四个并发进程的同步执行
code begin
father();mother();son();daugther();
code end
}

作业2

题目:假设有个南北向的桥,仅能容同方向的人顺序走过,相对方向的两个人则无法通过。现在桥南北端都有过桥人。现把每个过桥人当成一个进程,用P,V操作实现管理。

【答】

设计3个信号量 mutex,north,south;

  • mutex : 对桥的使用互斥
  • north : 北方能否过桥
  • south : 南方能否过桥

读者写者问题,异步互斥,同步不互斥

伪代码描述如下:

int countSN=0;//正在从南到北过桥的人数量
int countNS=0;//正在从北到南过桥的人数量
semaphore mutexSN=1;//用于保护countSN
semaphore mutexNS=1;//用于保护countNS
semaphore bridge=1;//用于互斥地访问桥

void NORTH(){//北方的人过桥
	do{
	   P(mutexNS);
 	   if(countNS==0)
 	   {
 	   		P(bridge);
 	   }
 	   countNS++;
 	   V(mutexNS);
 	   过桥;
 	   P(mutexNS);
 	   countNS--;
 	   if(countNS==0)
 	   {
 	   		V(bridge);
 	   }
 	   V(mutexNS);
 	   }while(TRUE);
}

void SOUTH(){//南方的人过桥
	do{
	   P(mutexSN);
 	   if(countSN==0)
 	   {
 	   		P(bridge);
 	   }
 	   countSN++;
 	   V(mutexSN);
 	   过桥;
 	   P(mutexSN);
 	   countSN--;
 	   if(countSN==0)
 	   {
 	   		V(bridge);
 	   }
 	   V(mutexSN);
 	   }while(TRUE);
}
void main() { //2个并发进程的同步执行
code begin
NORTH();SOUTH();
code end
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值