1、用记录型信号量解决以下问题,用类C语言编写进程同步算法。
司机 P1 售票员 P2
REPEAT REPEAT
启动 关门
正常运行 售票
到站停 开门
UNTIL FALSE UNTIL FALSE
semaphore s1,s2;
s1=0; //门
s2=0; //车
P1() //司机
{
wait(s1);
启动
正常行驶
到站
signal(s2);
}
P2()//售票员
{
关门;
signal(s1);
售票
wait(s2);
开门;
}
2、 设有四个并发执行的进程P1、P2、P3、p4,其前趋图如下,试用信号量实现这四个进程同步。
解: semaphore s1=0,s2=0,s3=0,s4=0;
P1() {P1; signal(s1);signal(s2);}
P2() {wait(s1);P2;signal(s3);}
P3() {wait(s2);P3;signal(s4);}
P4() {wait(s3);wait(s4);P4;}
3.桌子上有一只盘子,最多可容纳两个水果,每次只能放人或取出一个水果。
爸爸专向盘子中放苹果(apple),妈妈专向盘子中放桔子(orange),两个儿子专
等吃盘子中的桔子,两个女儿专等吃盘子中的苹果。请用P、V操作来实现爸爸
、妈妈、儿子、女儿之间的同步与互斥关系。
盘子为临界资源,设互斥信号量mutex表示四进程必须互斥访问盘子
。因可放两个水果,则empty初值为2;apple表示盘子中apple的数量
,orange表示盘子中orange的数量,初值均为0。
semaphore mutex=1;
int empty=2;
int apple=0;
int orange=0;
void father()
{
while(1)
{
p(empty);
p(mutex);
put an apple;
v(mutex);
v(apple);
}
}
void mother()
{
while(1)
{
p(empty);
p(mutex);
put an orange;
v(mutex);
v(orange);
}
}
void son()
{ while(1)
{
p(orange);
p(mutex);
get an orange;
v(mutex);
v(empty);
}
}
void daughter()
{
while(1)
{
p(apple);
p(mutex);
get an apple;
v(mutex);
v(empty);
}
}
4.桌子上有一只盘子,每次只能放入一只水果。爸爸专向盘中放苹果,
妈妈专向盘中放桔子,一个儿子专等吃盘中的桔子,一个女儿专等吃
盘中的苹果。请利用P、V操作写出父亲、母亲、儿子、女儿进程的同步算法。
int ef=1, apple=0, orange =0;
ProcessDad()
{
Wait(ef);//盘子中是否空
Wait(mutex);//是否有人在用盘子,f保证盘子被独占。
setApple();
Signal(apple);//通知放了一个苹果
Signal(mutex);
}
ProcessMom()
{
Wait(ef);
Wait(mutex);
setOrange();
Signal(orange);
Signal(mutex);
}
ProcessSon()
{
Wait(orange); //是否有橘子
Wait(mutex); //是否有人在用盘子
eatOrange();
Signal(ef); //通知盘子为空
Signal(mutex);
}
ProcessDaughter()
{
Wait(apple);
Wait(mutex);
eatApple();
Signal(ef);
Signal(mutex);
}
semaphore empty=1;
semaphore full=0;
void Calculate()
{
while(1)
{
wait(empty);
计算;
signal(full);
}
}
void Print()
{
while(1)
{
wait(full);
打印;
signal(empty);
}
}
6.独木桥问题。某条河上只有一座独木桥,以便行人过河。现在河的两边都有人要
过桥,按照下面的规则过桥。为了保证过桥安全,请用P、V操作分别实现正确的管理。
过桥的规则是:同一方向的可连续过桥,某方向有人过桥时另一方向的人 要等待。
将独木桥的两个方向分别标记为A和B;并用整形变量countA和countB分别表示A、B方
向上已在独木桥上的行人数,初值为0;再设置三个初值都1的互斥信号量:SA用来实
现对countA的互斥访问,SB用来实现对countB的互斥访问,mutex用来实现两个方向的
行人对独木桥的互斥使用。则具体描述如下:
semaphore SA,SB,mutex;
SA=1;
SB=1;
mutex=1;
int countA=0;
int countB=0;
void Process_A()
{
wait(SA);
if(countA==0)
{
wait(mutex);
countA+=1;
}
signal(SA);
过独木桥;
wait(SA);
countA-=1;
if(countA==0)
{
signal(mutex);
}
signal(SA);
}
void Process_B()
{
wait(SB);
if(countB==0)
{
wait(mutex);
countB+=1;
}
signal(SB);
过独木桥;
wait(SB);
countB-=1;
if (countB==0)
{
signal(mutex);
}
signal(SB);
}
司机 P1 售票员 P2
REPEAT REPEAT
启动 关门
正常运行 售票
到站停 开门
UNTIL FALSE UNTIL FALSE
semaphore s1,s2;
s1=0; //门
s2=0; //车
P1() //司机
{
wait(s1);
启动
正常行驶
到站
signal(s2);
}
P2()//售票员
{
关门;
signal(s1);
售票
wait(s2);
开门;
}
2、 设有四个并发执行的进程P1、P2、P3、p4,其前趋图如下,试用信号量实现这四个进程同步。
解: semaphore s1=0,s2=0,s3=0,s4=0;
P1() {P1; signal(s1);signal(s2);}
P2() {wait(s1);P2;signal(s3);}
P3() {wait(s2);P3;signal(s4);}
P4() {wait(s3);wait(s4);P4;}
3.桌子上有一只盘子,最多可容纳两个水果,每次只能放人或取出一个水果。
爸爸专向盘子中放苹果(apple),妈妈专向盘子中放桔子(orange),两个儿子专
等吃盘子中的桔子,两个女儿专等吃盘子中的苹果。请用P、V操作来实现爸爸
、妈妈、儿子、女儿之间的同步与互斥关系。
盘子为临界资源,设互斥信号量mutex表示四进程必须互斥访问盘子
。因可放两个水果,则empty初值为2;apple表示盘子中apple的数量
,orange表示盘子中orange的数量,初值均为0。
semaphore mutex=1;
int empty=2;
int apple=0;
int orange=0;
void father()
{
while(1)
{
p(empty);
p(mutex);
put an apple;
v(mutex);
v(apple);
}
}
void mother()
{
while(1)
{
p(empty);
p(mutex);
put an orange;
v(mutex);
v(orange);
}
}
void son()
{ while(1)
{
p(orange);
p(mutex);
get an orange;
v(mutex);
v(empty);
}
}
void daughter()
{
while(1)
{
p(apple);
p(mutex);
get an apple;
v(mutex);
v(empty);
}
}
4.桌子上有一只盘子,每次只能放入一只水果。爸爸专向盘中放苹果,
妈妈专向盘中放桔子,一个儿子专等吃盘中的桔子,一个女儿专等吃
盘中的苹果。请利用P、V操作写出父亲、母亲、儿子、女儿进程的同步算法。
1:盘子是临界资源.要实施互斥. 用信号量 mutex 表示.
2:苹果用 apple 表示. 橘子用 orange 表示.
3:盘子的状态(空,或者满) 用 ef 表示.
semphore mutex=1;int ef=1, apple=0, orange =0;
ProcessDad()
{
Wait(ef);//盘子中是否空
Wait(mutex);//是否有人在用盘子,f保证盘子被独占。
setApple();
Signal(apple);//通知放了一个苹果
Signal(mutex);
}
ProcessMom()
{
Wait(ef);
Wait(mutex);
setOrange();
Signal(orange);
Signal(mutex);
}
ProcessSon()
{
Wait(orange); //是否有橘子
Wait(mutex); //是否有人在用盘子
eatOrange();
Signal(ef); //通知盘子为空
Signal(mutex);
}
ProcessDaughter()
{
Wait(apple);
Wait(mutex);
eatApple();
Signal(ef);
Signal(mutex);
}
5.两个进程合作完成数据计算和打印工作,计算进程未计算完就不
可打印,反之也然,双方共用一个缓冲区,写出此算法。semaphore empty=1;
semaphore full=0;
void Calculate()
{
while(1)
{
wait(empty);
计算;
signal(full);
}
}
void Print()
{
while(1)
{
wait(full);
打印;
signal(empty);
}
}
6.独木桥问题。某条河上只有一座独木桥,以便行人过河。现在河的两边都有人要
过桥,按照下面的规则过桥。为了保证过桥安全,请用P、V操作分别实现正确的管理。
过桥的规则是:同一方向的可连续过桥,某方向有人过桥时另一方向的人 要等待。
将独木桥的两个方向分别标记为A和B;并用整形变量countA和countB分别表示A、B方
向上已在独木桥上的行人数,初值为0;再设置三个初值都1的互斥信号量:SA用来实
现对countA的互斥访问,SB用来实现对countB的互斥访问,mutex用来实现两个方向的
行人对独木桥的互斥使用。则具体描述如下:
semaphore SA,SB,mutex;
SA=1;
SB=1;
mutex=1;
int countA=0;
int countB=0;
void Process_A()
{
wait(SA);
if(countA==0)
{
wait(mutex);
countA+=1;
}
signal(SA);
过独木桥;
wait(SA);
countA-=1;
if(countA==0)
{
signal(mutex);
}
signal(SA);
}
void Process_B()
{
wait(SB);
if(countB==0)
{
wait(mutex);
countB+=1;
}
signal(SB);
过独木桥;
wait(SB);
countB-=1;
if (countB==0)
{
signal(mutex);
}
signal(SB);
}