用信号量机制来解决进程的同步与互斥:PV操作

用信号量机制来解决进程的同步与互斥:PV操作


2024年4月21日发(作者:)

用信号量机制来解决进程的同步与互斥:PV操作

首先确定进程间的关系,然后确定信号量及其值。

判断进程间是否互斥的关键:看进程间是否共享某一公有资源,一个公有资源与一个信

号量相对应。确定信号量的值是一个关键点,它代表了可用资源实体数。

举例:票大厅容纳的人数限制为20人,少于20人时购票者可以进入,否则要在厅外等

候。

进程间是同步时:是否存在合作关系,是否需要互通消息

首先判断进程间的关系为同步的,且为各并发进程设置私有信号量,然后为私有信号量

赋初值,最后利用PV原语和私有信号量规定各进程的执行顺序。

举例:公交车上司机与售票员的行为,司机到站停车后,售票员方可开门,售票员关门

后,司机方可开车。

进程同步应用示例讲解:1

桌上有一个盘子,可以存放一个水果。父亲总是把苹果放在盘子中,母亲总是把香蕉放在盘子中;一个儿

子专等吃盘中的香蕉,一个女儿专等吃盘中的苹果。

1)系统要设几个进程来完成这个任务?各自的工作是什么?

2)这些进程间有什么样的相互制约关系?

3)用P,V操作写出这些进程的同步算法(注:标明信号量的含义)。

1)需要四个进程

进程描述:

Father:父亲放置苹果的进程;

Mother:母亲放置香蕉的进程;

Son:儿子吃香蕉的进程;

Daughter:女儿吃苹果的进程。

分析:

四人公用一个盘子;

盘子每次只能放一个水果,当盘子为空时,父母均可尝试放水果,但一次只能有一人成功;

盘中是香蕉,儿子吃,女儿等;

盘中是苹果,女儿吃,儿子等。

2)进程之间既有互斥又有同步关系。

Father进程和Mother进程要互斥的向盘中放水果,应设置一互斥信号量dish,初值为1,表示盘子为空;

Father进程要设置同步信号量apple,用于给Daughter进程传送消息,初值为0,表示还没有消息产生,

即没有放苹果;相应Daughter进程也要向父、母进程传送盘子为空的消息。

Mother进程要设置同步信号量banana,用于给Son进程传送消息,初值为0,表示还没有消息产生,即

没有放香蕉。相应Son进程也要向父、母进程传送盘子为空的消息。

3)信号量设置:

dish:表示盘子是否为空,初值=1;

apple:表示盘中是否有苹果,初值=0;

banana:表示盘中是否有香蕉,初值=0

Father:

{ while( true)

P ( dish );//判断盘子是否空

将苹果放入盘中;

V ( apple );//传消息给女儿进程

}

Mather:

{ while( true)

P ( dish );//判断盘子是否空

将香蕉放入盘中;

V ( banana );//传消息给儿子进程

}

Son::

{ while( true)

P ( banana );//判断是否有香蕉

从盘中取出香蕉;

V ( dish );//传送盘空消息

吃香蕉;}

Daughter::{ while( true)

P ( apple );//判断是否有苹果

从盘中取出苹果;

V ( dish );//传送盘空消息

吃苹果;}

进程同步应用示例讲解:2

生产者与消费者共用一个有n个缓冲单元的缓冲区,生产者向缓冲区中放产品,消费者从缓冲区中取产品

消费。

1)系统要设几个进程来完成这个任务?各自的工作是什么?

2)这些进程间有什么样的相互制约关系?

3)用P,V操作写出这些进程的同步算法(注:标明信号量的含义)。

1)系统需设两个进程

producer进程 :生产产品并向缓冲区中放;

consumer进程 :从缓冲区取产品并消费;

分析:

生产者与消费者共用一个缓冲区,但有n个缓冲单元;

对于缓冲区同一时刻只能有一个进程使用;

有空缓冲单元时,生产者可以放,否则等待;

有满缓冲单元时,消费者可以取,否则等待。

2)两进程间有互斥和同步的关系

producer进程和consumer进程要互斥的访问缓冲区,应设置一互斥信号量mutex,初值为1。

producer进程和consumer进程有同步的关系,当没有满缓冲单元时,consumer进程不能消费,当没有

空缓冲单元时, producer进程不能向缓冲区放。应为他们设置同步信号量empty=n和full=0,用于互传消

息。当empty=0时不能生产,当full=0时不能消费。

3)信号量设置

mutex:保证对缓冲区的互斥访问,初值=1;

empty:表示缓冲区中是否有空缓冲单元,初值=n;

full: 表示缓冲区中是否有满缓冲单元,初值=0。

producer:

{ while(1)

生产一个成品;

P(empty);

P(mutex);

将产品存入缓冲区;

V(mutex);

V(full);

}

consumer:

{ while(1)

P(full);

P(mutex);

将产品从缓冲区取出;

V(mutex);

V(empty);

消费成品;

}

进程同步应用示例讲解:3

设有进程A、B、C分别对单缓冲区S和T进行操作,其中A进程负责从卡片上读取数据并把数据块

输入到缓冲区S, B进程负责从缓冲区S中提出数据块并将数据块送到缓冲区T中,C进程负责从缓冲区

T中取出信息打印。

A进程

问题:

单缓冲区S

B进程

单缓冲区T

C进程

1)这些进程间有什么样的相互制约关系?

2)用P,V操作写出这些进程的同步算法(注:标明信号量的含义)。

分析:两个阶段的生产者和消费者问题。

只有S为空时,A进程才能向S中放数据; 只有S中有数据时,B进程才能取数据;

只有T为空时,B进程才能向T中放数据; 只有T中有数据时,C进程才能取数据。

1)三进程间有互斥和同步的关系

A进程和B进程要互斥的访问缓冲区S,B进程和C进程要互斥的访问缓冲区T。

A进程和B进程有同步的关系,当缓冲区S空时,A进程才能向S中放数据,只有S中有数据时,B

进程才能取数据。应为他们设置同步信号量emptyS=1和fullS=0,用于互传消息。

B进程和C进程有同步的关系,只有当缓冲区T空时,B进程才能向T中放数据,只有T中有数据时,

C进程才能取数据。应为他们设置同步信号量emptyT=1和fullT=0,用于互传消息。

3)信号量设置

emptyS :表示单缓冲区S是否为空,初值为1;

emptyT :表示单缓冲区T是否为空,初值为1;

fullS :表示单缓冲区S是否有数据可处理,其初值0

fullT : 表示单缓冲区T是否有数据可处理,其初值0

{ while(1)

A: B:

{ while(1)

读卡片

P(emptyS );

将数据送入S;

V(fullS ) ;

}

P(fullS );

从S中取数据;

V(emptyS) ;

......

P(emptyT);

将数据送入T;

V(fullT ) ;

C:

{ while(1)

P(fullT);

从T中取数据;

V(emptyT) ;

打印数据;

}

进程同步应用示例讲解:4

}

售票员优先正确运行过程

While(True)

{

(售票员)关车门

(司机)启动公车;

司机进程 售票员进程

While(True) While(True)

{ {

启动公车; 关车门;

驾驶公车; 卖车票;

停止公车; 开车门;

} }

分析:

》确定进程间的关系:司机到站停车后,售票员方可工作。同样,售票员关车门后,司

机才能工作。所以司机与售票员之间是一种同步关系。

》信号量设置:

确定信号量及其值:由于司机与售票员之间要互通消息,司机进程设置一个私有信

号量run,用于判断司机能否进行工作,初值为0。售票员进程设置一个私有信号量stop,

用于判断是否停车,售票员是否能够开车门,初值为0。

售票员进程

司机进售票员进

售票员进程:

司机进程:

{ while(1) { while(1)

p(run); 关车门;

启动车辆; v(run);

正常行车; 卖车票;

到站停车; p(stop);

v(stop); 开车门;

} }


发布者:admin,转转请注明出处:http://www.yc00.com/news/1713673352a2295762.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信