您的位置:首页 > 其它

操作系统中进程同步问题的几个经典问题与解答

2018-03-21 14:44 197 查看
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操作写出父亲、母亲、儿子、女儿进程的同步算法。

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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息