急性阑尾炎

首页 » 常识 » 预防 » 操作系统概论PV操作
TUhjnbcbe - 2023/10/20 17:13:00
北京治白癜风到哪家医院比较好 http://m.39.net/news/ylzx/bjzkhbzy/

一、PV操作相关概念:

1、临界区:对临界资源的访问,必须互斥地进行,在每个进程中,访问临界资源的那段代码称为临界区。(并发进程中与共享变量有关的程序段。)

2、临界资源:多个进程可以共享系统中的各种资源,其中许多资源一次只能为一个进程所使用,我们把一次仅允许一个进程使用的资源称为临界资源。许多物理设备都属于临界资源,如打印机等。还有许多变量、数据等都可以被若干进程共享,也属于临界资源。

3、信号量:信号量的数据结构为一个值和一个指针,指针指向等待该信号量的进程。信号量的值表示相应资源的使用情况。信号量S=0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个单位资源,因此S的值减1;当S0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。而执行一个V操作意味着释放一个单位资源,因此S的值加1;若S0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。(S0表示有S个资源可用;S=0表示无资源可用;S0则表示S等待队列中的进程个数)

4、同步:指的是为了完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而等待、传递消息所产生的的制约关系。(同步关系是一种协同关系,之前的操作没完成,之后的操作就无法进行)

5、互斥:指的是一个进程进入临界区使用临界资源时,另一个进程必须等待,当占用临界资源的进程退出临界区后,另一个进程才允许去访问此临界资源。例如:打印机、共享变量等临界资源。在多道程序系统环境中,多进程可以共享各类资源,但有些资源一次只能供一个进程使用。(互斥关系是一种竞争关系。)

6、PV操作:PV操作是两种原子操作的组合,分为P操作和V操作。

一、P原语操作:(P操作可理解为获得一个资源)

1)S减1;

2)若S减1后仍大于等于0,则请求的进程继续执行;

3)若S减1后小于0,则进程被阻塞后进入与该信号相对应的队列中,然后转进程调度。

P操作流程

二、V原语操作:(V操作可理解为释放一个资源)

1)S加1;

2)若相加结果大于0,则请求的进程继续执行;

3)若相加结果小于等于0,则从该信号的等待队列中唤醒一个等待进程,然后再返回原进程继续执行或转进程调度。

V操作流程

注意事项:

1)PV操作对于每一个进程来说,都只能进行一次,而且必须成对使用,在PV原语执行期间不允许中断的发生。

2)每个程序中用户实现互斥的P、V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。若有多个分支,要认真检查其成对性。

3)P、V操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环。

4)互斥信号量的初值一般为1。

问题一:生产者消费者问题

1、问题描述

系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用。(注:这里的“产品”理解为某种数据)

生产者、消费者共享一个初始为空、大小为n的缓冲区。

只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待。(缓冲区没满——生产者生产)只有缓冲区不空时,消费者才能从中取出产品,否则必须等待。(缓冲区没空——消费者消费)缓冲区是临界资源,各进程必须互斥地访问。(互斥关系)

2、问题分析

对于一个仓库,仓库的容量是有限的,对应的临界资源是有限的,假设仓库的容量是n。当仓库装满了,就不能允许生产者进行访问,如果仓库满了,生产者再把产品放进仓库就会导致仓库爆仓。与此同时,当库存为零时也不能允许消费者进入。

由于缓冲区是临界资源必须互斥使用,因此需要设置一个互斥信号量mutex,缓冲区有两种状态:进程正在访问和没有进程正在访问,因此可以给mutex赋初值为1。

缓冲区中的大小是生产者和消费者都可以进行操作的,当缓冲区满时,生产者要等待消费者取走产品,按一定次序访问这属于同步关系;当缓冲区空时,消费者要等待生产者生产产品,按一定次序访问这属于同步关系,因此需要设置两个同步信号量,full和empty。

3、逻辑实现

semaphoremutex=1;//互斥信号量,实现对缓冲区的互斥访问

semaphoreempty=n;//同步信号量,实现空闲缓冲区的数量

semaphorefull=0;//同步信号量,标识产品数量,也即非空缓冲区的数量

//生产者

producer(){

  while(1){

生产一个产品;

    P(empty);//消耗一个空闲缓冲区

P(mutex);

把产品放入一个缓冲区;

    V(mutex);

V(full);//增加一个产品

}

  }

//消费者

consumer(){

  while(1){

P(full);//消耗一个产品(非空缓冲区)

P(mutex);

从缓冲区取出一个产品;

V(mutex);

V(empty);//增加一个空闲缓冲区

使用产品;

}

  }

思考:如果改变相邻P操作的顺序会出现什么情况?

若此时缓冲区内已经放满产品,则empty=0,full=n。

生产者执行P(mutex)使得mutex=0,再执行P(empty),由于已经没有空闲缓冲区。因此生产者被阻塞。由于生产者被阻塞,因此切换回消费者进程。消费者进程执行P(mutex),由于mutex=0,即生产者还没有释放对临界资源的“锁”,因此消费者也被阻塞。

这就造成了生产者等待消费者释放空闲的缓冲区,而消费者又等待生产者释放临界区的情况,生产者和消费者循环等待被对方唤醒,出现“死锁”。因此,实现互斥地P操作一定要在实现同步的P操作之后。

问题二:多生产者多消费者问题

1、问题描述

桌子上有一只盘子,每次只能向其中放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,儿子专等着吃盘子中的橘子,女儿专等着吃盘子中的苹果。只有盘子空时,爸爸或妈妈才可向盘子中放一个水果。仅当盘子中有自己需要的水果时,儿子或女儿可以从盘子中取出水果。用PV操作实现上述过程。

2、问题分析

(1)、关系分析。找出题目中描述的各个进程,分析他们之间的同步、互斥关系。

(2)、整理思路。根据各进程的操作流程确定P、V操作的大致顺序。

(3)、设置信号量,设置所需要的信号量并且根据题目要求设置信号量的初值。

对于上述题目我们所确立的关系为:

互斥关系:(mutex=1)

对缓冲区(盘子)的访问要互斥地进行

同步关系:(一前一后)

(1)、父亲将苹果放入盘子后,女儿才能取苹果。

(2)、母亲将橘子放入盘子后,儿子才能取橘子。

(3)、只有盘子为空时,父亲或母亲才能放入水果。

3、逻辑实现

本题中互斥信号量可以省略,本题中缓冲区大小为1,在任何时候,apple、orange、plate三个同步信号量中最多只有一个是1.因此在任何时刻,最多只有一个进程的P操作不会被堵塞,并顺利地进入临界区,如何盘子的容量大于1时,互斥信号量就不能省略。

1
查看完整版本: 操作系统概论PV操作