作业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
}