经典PV操作问题详解(最全面的PV资料)

合集下载

PV练习及参考解答

PV练习及参考解答
semaphore S_BuffNum_Q1;
// Q2队列当中的空闲缓冲区个数,初值为m
semaphore S_BuffNum_Q2;
// Q1队列当中的消息数量,初值为n
semaphore S_MessageNum_Q1;
// Q2队列当中的消息数量,初值为0
semaphore S_MessageNum_Q2;
第二步:确定信号量及其值。由于进程A和进程B要互斥进入箱子去拣棋子,箱子是两个进程的公有资源,所以设置一个信号量s,其值取决于公有资源的数目,由于箱子只有一个,s的初值就设为1。
实现:
Semaphore s;//互斥信号量,初值为1
main()
{
cobegin
A();
B();
coend
}
A()
{
while(1)
实现过程:
P(mutex); // mutex的初始值为1 访问该共享数据;
V(mutex);
3)把信号量视为是某种类型的共享资源的剩余个数,实现对一类共享资源的访问。
判断进程间是否互斥,关键是看进程间是否共享某一公有资源,一个公有资源与一个信号量相对应。确定信号量的值是一个关键点,它代表了可用资源实体数。
P原语操作的动作是:
(1)sem减1;
(2)若sem减1后仍大于或等于零,则进程继续执行;
(3)若sem减1后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转进程调度。
V原语操作的动作是:
(1)sem加1;
(2)若相加结果大于零,则进程继续执行;
(3)若相加结果小于或等于零,则从该信号的等待队列中唤醒一等待进程,然后再返回原进程继续执行或转进程调度。
实现:

操作系统--PV操作

操作系统--PV操作

操作系统--PV操作操作系统PV 操作在操作系统中,PV 操作是一种非常重要的同步机制,用于解决进程之间的互斥和同步问题。

这一概念对于理解操作系统的工作原理以及优化多进程的协同工作至关重要。

让我们先来了解一下什么是进程。

进程可以简单理解为正在运行的程序的实例。

在一个操作系统中,通常会有多个进程同时运行,它们可能需要共享资源或者按照特定的顺序执行某些操作。

这时候,就需要一种有效的机制来协调它们,确保系统的正常运行,而 PV 操作就是这样一种机制。

P 操作和 V 操作是两个原语操作。

P 操作又称为 wait 操作,V 操作又称为 signal 操作。

先来说说 P 操作。

当一个进程执行 P 操作时,如果对应的资源可用(也就是信号量的值大于 0),那么它会顺利地获取资源,并将信号量的值减 1。

但如果信号量的值为 0,那么这个进程就会被阻塞,进入等待队列,直到其他进程释放资源,将信号量的值增加,它才有机会再次被唤醒并获取资源。

举个例子,假设有一个打印机资源,多个进程都可能需要使用它。

每个进程在使用打印机之前,都要执行 P 操作。

如果此时打印机空闲(信号量大于 0),进程就能顺利使用;如果打印机正在被其他进程使用(信号量为 0),那么当前进程就会被阻塞等待。

再来看 V 操作。

当一个进程执行 V 操作时,它会将信号量的值增加 1。

如果此时有进程正在等待这个资源(也就是在等待队列中),那么系统会从等待队列中唤醒一个进程,让它获取资源并继续执行。

还是以打印机为例,当一个进程使用完打印机后,它会执行 V 操作,释放打印机资源,使得信号量的值增加 1。

如果有其他进程正在等待打印机,那么其中一个等待进程就会被唤醒并获得使用打印机的机会。

PV 操作的应用场景非常广泛。

比如在生产者消费者问题中,生产者进程负责生产产品并放入缓冲区,消费者进程从缓冲区中取出产品进行消费。

为了保证缓冲区的正确使用,避免出现缓冲区满了生产者还在生产或者缓冲区空了消费者还在消费的情况,就需要使用 PV 操作来实现生产者和消费者之间的同步和互斥。

操作系统信号量与PV操作

操作系统信号量与PV操作

操作系统信号量与PV操作操作系统中的信号量是一种并发控制机制,用于对进程间共享的资源进行同步和互斥操作。

PV操作(也称为P操作和V操作)是信号量的两个基本操作,用于实现对信号量的减操作和增操作。

下面将详细介绍信号量和PV操作的概念、原理和应用。

一、信号量的概念:信号量是一种用于进程间通信和同步的工具,通过对信号量的操作来实现对共享资源的控制。

信号量的初值为非负整数,可以看作是一个计数器。

信号量的值表示可用资源的数量,当值大于0时表示有可用资源,当值为0时表示没有可用资源,当值小于0时表示有进程等待资源。

二、PV操作的原理:PV操作是对信号量进行加减操作,具体含义如下:1. P操作(wait操作):当进程需要使用一个资源时,首先执行P 操作。

P操作将信号量的值减1,如果值小于0,则进程被阻塞,等待资源的释放。

2. V操作(signal操作):当进程使用完一个资源后,需要释放资源,此时执行V操作。

V操作将信号量的值加1,如果值小于等于0,则唤醒等待资源的进程。

三、应用场景:信号量和PV操作在许多操作系统中被广泛应用,常见的应用场景如下:1.进程同步:信号量用于控制多个进程的执行顺序和互斥访问共享资源,确保进程间的顺序执行和资源的正确访问。

例如多个进程需要按照一定的顺序执行,可以使用信号量控制进程的执行顺序;多个进程需要互斥地访问一些共享资源,可以使用信号量进行同步。

2.互斥锁:信号量可以用于实现互斥锁,防止多个进程同时访问临界区。

通过将信号量初值设为1,并在进程需要访问临界区时执行P操作,实现对临界区的互斥访问。

3.生产者-消费者问题:信号量可以用于解决生产者-消费者问题,其中生产者和消费者共享一个有限大小的缓冲区。

通过定义两个信号量,一个表示空缓冲区的数量,一个表示满缓冲区的数量,可以实现生产者和消费者的同步和互斥访问。

4.读者-写者问题:信号量可以用于解决读者-写者问题,其中多个读者可以同时读取共享资源,但只有一个写者能够写入共享资源。

操作系统关于PV操作

操作系统关于PV操作

1.读写操作1、、设有一台计算机,有两条I/O通道,分别接一台卡片输入机和一台打印机。

卡片机把一叠卡片逐一输入到缓冲区B1中,加工处理后在搬到缓冲区B2中,并在打印机上印出,问:①系统要设几个进程来完成这个任务?各自的工作是什么?②这些进程间有什么样的相互制约关系?③用P、V操作写出这些进程的同步算法。

①系统可设三个进程来完成这个任务:R进程负责从卡片输入机上读入卡片信息,输入到缓冲区B1中;C进程负责从缓冲区B1中取出信息,进行加工处理,之后将结果送到缓冲区B2中;P进程负责从缓冲区B2中取出信息,并在打印机上印出。

②R进程受C进程影响,B1放满信息后R进程要等待——等C进程将其中信息全部取走,才能继续读入信息;C进程受R进程和P进程的约束:B1中信息放满后C进程才可从中取出它们,且B2被取空后C进程才可将加工结果送入其中;P进程受C进程的约束:B2中信息放满后P进程才可从中取出它们,进行打印。

③信号量含义及初值:B1full——缓冲区B1满,初值为0;B1empty——缓冲区B1空,初值为0;B2full——缓冲区B2满,初值为0;B2empty——缓冲区B2空,初值为0;R进程C进程P进程B1B22、用P.V操作处理生产者和消费者问题如下:mutex初值为1;empty初值为n;full初值为0生产者消费者L1:生产产品 L2:P(full)P(empty) P(mutex)P(mutex)取出产品产品装入缓冲区 V(empty)V(full) V(mutex)V(mutex) GOTO L2GOTO L1(1)信号量mutex,empty,full的作用是什么?(2)为什么P操作的顺序不能调换?(1)mutex起互斥作用,empty与full为同步作用。

(2)假设进程处于如下运行状态:缓冲区暂时无进程申请,故mutex=1。

缓冲区无空单元,即empty=0,此时生产者进程要放产品,若P(empty)与P(mutex)位置颠倒,先执行P(mutex),顺利通过,再执行P(empty),被阻塞,且该进程不会释放临界区资源,使消费者进程无法进入缓冲区,就不能取走产品,最终导致死锁3、设公共汽车上,司机、售票员的活动分别是:司机售票员启动车辆上乘客正常行车关车门到站停车售票开车门下乘客假设售票员关车门后司机才可启动车辆,到站停车后售票员方可开车门,在汽车不断到站、停车、行驶过程中,这两个活动有什么同步关系?用P.V操作实现它们的同步。

pv操作题目 软考

pv操作题目 软考

PV操作在软考中的深入探讨1. 基本概念PV操作是用于进程同步的两种基本操作。

P操作通常表示为一个进程需要一个资源,而V操作表示释放一个资源。

这两种操作通常用于实现进程间的同步和互斥。

2. PV操作原理PV操作基于信号量机制。

信号量是一个整数值,通常用于表示资源的数量。

P操作会尝试获取资源,减少信号量的值;而V操作会释放资源,增加信号量的值。

如果P操作不能立即获得资源(即信号量为0),则该进程会被阻塞或等待,直到资源可用。

3. PV操作在进程同步中的应用PV操作在进程同步中有着广泛的应用。

例如,在生产者-消费者问题中,生产者用于生成数据,消费者用于消费数据。

通过PV操作,可以确保生产者在没有数据被消费之前不会继续生产,同时确保消费者在没有数据可供消费时不会继续消费。

4. PV操作和互斥量互斥量是一种特殊的信号量,其值只能为0和1。

当一个进程获得互斥量时,其他任何进程都无法获得该互斥量,直到第一个进程释放它。

这使得互斥量可以用于保护某些临界区域,以实现互斥访问。

PV操作和互斥量通常一起使用,以实现更复杂的同步问题。

5. PV操作的编程实现在大多数编程语言中,PV操作可以通过系统调用或库函数实现。

例如,在UNIX系统中,可以使用semop函数进行PV操作。

在实现PV操作时,需要注意避免死锁和饥饿等问题。

6. PV操作的复杂度分析PV操作的复杂度取决于所使用的算法和数据结构。

在一些算法中,例如二叉堆或斐波那契堆,PV操作的平均时间复杂度可以达到O(1)。

然而,在最坏的情况下,PV操作的复杂度可能会达到O(n),其中n是信号量的值。

7. PV操作与信号量信号量是一种同步机制,用于控制多个进程对共享资源的访问。

PV操作是信号量机制中的基本操作,通过它们可以实现对共享资源的互斥访问和同步。

信号量通常用于保护临界区、实现进程间的同步和互斥等。

8. PV操作与死锁预防死锁是操作系统中的一个重要问题,它发生在两个或多个进程无限期地等待对方释放资源的情况。

操作系统PV操作习题

操作系统PV操作习题

操作系统PV操作习题操作系统PV操作习题-----------------------------------------------------1、引言在操作系统中,PV操作(也称作P操作和V操作)是用于进程同步的一种常见机制。

P操作用于获取或申请资源,V操作用于释放资源。

本文将为您提供一些关于PV操作的习题,以帮助您巩固相关的概念和原理。

2、PV操作基本概念2.1 P操作描述P操作的基本概念和含义,以及在实际应用中的具体场景。

2.2 V操作解释V操作的基本概念和含义,并举例说明其在实际问题中的应用。

3、PV操作习题集3.1 习题一、生产者-消费者问题描述一个典型的生产者-消费者问题,并通过使用P操作和V操作对其进行解决。

3.2 习题二、读者-写者问题解释一个典型的读者-写者问题,并使用PV操作来实现对该问题的解决。

3.3 习题三、哲学家就餐问题描述哲学家就餐问题的场景,并说明如何采用PV操作来解决这一问题。

4、常见PV操作错误4.1 死锁解释什么是死锁以及为什么会发生死锁现象,同时提供一些避免死锁的方法。

4.2 饥饿描述什么是饥饿,以及一些可能导致饥饿的常见原因,并提供解决饥饿问题的一些策略。

5、附录本文档附带以下附件:- 习题的解答和详细说明- 相关的代码示例6、法律名词及注释在本文档中,涉及的法律名词及其注释如下:- PV操作:即P操作和V操作,用于进程同步的一种机制。

- 生产者-消费者问题:一种经典的并发控制问题,涉及到生产者和消费者之间的资源竞争。

- 读者-写者问题:一种并发控制问题,涉及到多个读者和写者对共享资源的访问。

- 哲学家就餐问题:一种经典的并发控制问题,涉及到多个哲学家通过共享的餐具进行就餐。

操作系统pv操作

操作系统pv操作

(经典理发师问题)
• 假设后街有家理发店,店里有一个理发师、一把理发椅和 n把等候理发的顾客椅子。 (1).如果没有顾客则理发师便在理发椅上看报纸; (2).当有一个顾客到达时,首先查看理发师在干什么, 如果在看报纸则告诉理发师理发,然后坐到理发椅上开始 理发;如果理发师正在理发,则查看是否有空的椅子可坐, 如果有,他就坐下等待,如果没有,则离开; (3).理发师为一位顾客理完发后,查看是否有人等待, 如有则唤醒一位为其理发,如没有则在理发椅上看报纸; (4).顾客不分优先级
142765
276514 3 427651 514276
6 51427
7 65142
有两个程序,A程序按顺序使用CPU l0s,使用设备甲5s, 使用CPU 5s,使用设备乙10 s,最后使用CPU l0s。B程序 按顺序使用设备甲10s,他用CPU 10s,使用设 备乙5s,使用CPU 5s,使用设备乙10s。在顺序环境下先 执行A程序再执行B程序,CPU的利用率是多少?
原理:规定奇数号的哲学家先拿起他左边的筷子,然后再去 拿他右边的筷子;而偶数号的哲学家则相反.按此规定,将是 1,2号哲学家竞争1号筷子,3,4号哲学家竞争3号筷子.即五个 哲学家都竞争奇数号筷子,获得后,再去竞争偶不到的 哲学家进入阻塞等待队列,根FIFO原则,则先申请的哲学家 会较先可以吃饭,因此不会出现饿死的哲学家。
end;
桌上有一个空的水果盘,盘中一次只能放一个水 果,服务员、男顾客和女顾客共用这个盘子。服 务员向盘中放草莓和香蕉,男顾客专等吃盘中的 草莓,女顾客专等吃盘中的香蕉。规定每次当盘 子空时只能放一个水果供顾客食用。请用信号量 机制实现服务员、男顾客和女顾客三个进程的同 步。
题解:盘子是三个人的公有信号量,设为mutex,初值为1, 服务员的私有信号量设为empty初值为1,男顾客的私有信 号量为ba,初值为0,女顾客的私有信号量为cm,初值为0。 waiter :begin L1: p(empty); p(mutex); 放香蕉或草 莓; v(mutex); 如果放香蕉 则v(ba); 否则v(cm); goto L1; end; Woman:begin L3: p(cm); p(mutex); 取草莓; v(mutex); v(empty); goto L2; end; Man:begin L2: p(ba); p(mutex); 取香蕉; v(mutex); v(empty); goto L2; end;

PV操作应用题

PV操作应用题

理发师问题(Dijkstra 1965) 问题描述:一个理发店由一个有几张椅子的等候 室和一个放有一张理发椅的理发室组成。若没有 要理发的顾客,则理发师就去睡觉;若一顾客走 进理发店且所有的椅子都被占用了,则该顾客就 离开理发店;若理发师正在为人理发,则该顾客 就找一张空椅子坐下等待;若理发师在睡觉,则 顾客就唤醒他,设计一个协调理发师和顾客的程 序。
busman() {while (1) { 关车门; v(s1);
售票;
p(s2); 开车门; 上下乘客; } }
四人之间的关系
爸爸,妈妈要互斥使用盘子,所以两者之 间是互斥关系; 爸爸放的苹果,女儿吃,所以两者是同步 关系; 妈妈放的桔子,儿子吃,所以两者也是同 步关系。
司机—售票员问题 设公共汽ቤተ መጻሕፍቲ ባይዱ上,司机和售票员的活动分别是: 司机: 售票员: 启动车辆 上下乘客 正常行车 关车门 到站停车 售票 开车门 上下乘客 在汽车不断到站,停车,行驶过程中,这两个 活动的同步关系。
• semaphore s1=0;s2=0; • Main() • {cobegin • driver(); • busman(); • coend;} • Driver() • {while (1) • {p(s1); • 启动车辆; • 正常行车; • 到站停车; • V(s2); • } • }
Void customeri(i=1,2,3,…) {p(mutex); If (waiting<CHAIRS) { Waiting++; V(customers); V(mutex); P(leisure); Get_haicut(); } Else V(mutex); }
吃水果问题 • 问题描述:桌上有一只盘子,每次只能放一个水 果,爸爸专向盘中放苹果,妈妈专向盘中放桔子, 儿子专等吃盘里的桔子,女儿专等吃盘里的苹果。 只要盘子空,则爸爸或妈妈可向盘中放水果,仅 当盘中有自己需要的水果时,儿子或女儿可从中 取出,请给出四人之间的同步关系,并用PV操作 实现四人正确活动的程序。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

经典P、V操作问题详解 lionxcat@gmail.cn 一、基本概念

1. 信号量 struct semaphore { int value; // 仅且必须附初值一次,初值非负 PCBtype* wait_queue; // 在此信号量上阻塞的进程队列 } S; // 信号量实例为S

2. P、V操作 P(S){ S := S-1; if (S<0) 调用进程自己阻塞自己,等待在S的等待队列末尾; } V(S){ S := S+1; if (S≤0) 从S等待队列头释放一进程就绪在就绪队列尾; 调用进程继续执行; }

3. 使用方法

(i). P、V操作成队出现,处理互斥时出现在同一进程中;处理同步时出现在不同进程中。 (ii). 同步P先于互斥P调用,V的顺序无关。

4. 另类P、V操作导致的问题(或信号量的栈实现方法或漏斗法) [习题P174-23] 某系统如此定义P、V操作: P(S): S = S-1; 若S<0,本进程进入S信号量等待队列的末尾;否则,继续执行。 V(S): S=S+1; 若S≤0,释放等待队列中末尾的进程,否则继续运行。 (1)上面定义的P、V操作是否合理?有什么问题? (2)现有四个进程P1、P2、P3、P4竞争使用某一个互斥资源(每个进程可能反复使用多次),试用上面定义的P、V操作正确解决P1、P2、P3、P4对该互斥资源的使用问题。

答: (1)不合理:先进后出;可能“无限等待”,即等待队列头的进程得不到释放。

(2)思路:令每个信号量上的等待队列中始终只有一个进程。解决方案如下:(n个进程) n个进程至多有n-1个等待。设置n-1个信号量,每个进程阻塞在不同的信号量上,使每个等待队列至多有一个进程等待。用循环模拟队列。 Semaphore S[n-1]; // S[i]的初值为i+1 Procedure_i() { int j; DO_PRE_JOB(); for(j=n-2; j>=0; j--) P(S[j]); DO_JOB_IN_CRITICAL_SECTION(); for(j=0;j<=n-2;j++) V(S[j]); …… }

二、经典进程同步问题 总述:进程同步问题主要分为以下几类:一(生产者-消费者问题);二(读者写者问题);三(哲学家就餐问题);四(爱睡觉的理发师问题);五(音乐爱好者问题);六(船闸问题);七(红黑客问题)等。其中前两类都是用于处理进程之间通信的问题:生产者-消费者问题主要实现进程的消息机制,而读者-写者问题用于实现管道通信。哲学家就餐问题是经典的互斥转同步防止死锁的多资源争夺。理发师问题适合I/O或外部设备的管理,如打印调度。红黑客问题是解决不同条件触发事件的思想方法。 I. 生产者—消费者问题(初始缓冲区为空) 问题:生产者生产产品放到缓冲区,消费者从缓冲区取产品消费。 ①单缓冲区[书P119](适合单或多生产消费者): 同步:生产者不能往满缓冲区放产品(S1(1));消费者不能从空缓冲区取产品(S2(0))。 void Producer() { while (true){ 生产一个产品; P(S1); 申请一个空的缓冲区 放到缓冲区; V(S2); 返回一个满的缓冲区 }} void Consumer() { while (true){ P(S2); 申请一个满的缓冲区 从缓冲区取一个产品; V(S1); 返回一个空的缓冲区 消费产品; }} ②环行多缓冲区(或无穷缓冲区)单生产消费者[习题P173-13]: 同步:生产者不能往满缓冲区放产品(S1(n));消费者不能从空缓冲区取产品(S2(0))。n为缓冲区大小。 互斥:设置指示下一个空缓冲区的位置变量(i(0))和指示下一个产品在缓冲区的位置变量(j(0)),由于只有一个生产者和消费者,i和j无须互斥访问。此问题无互斥关系。 void Producer() { while (true){ 生产了一个产品; P(S1); 把产品放入缓冲区; i = (i+1)%n; // 无穷缓冲区无须’%n’ V(S2); }} void Consumer() { while (true){ P(S2); 取一个产品; j = (j+1)%n; // 无穷缓冲区无须’%n’ V(S1); 消费产品; }} ③环行多缓冲区多生产消费者[书P120]: 同步:生产者不能往满缓冲区放产品(S1(n));消费者不能从空缓冲区取产品(S2(0))。n为缓冲区大小。 互斥:设置指示下一个空缓冲区的位置变量(i(0)),生产者之间互斥(mutex1(1));设置指示下一个产品在缓冲区的位置变量(j(0)),消费者之间互斥(mutex2(1))。也可以生产者和消费者之间都互斥(把mutex1和mutex2都换成一个mutex(1))。 void Producer() { while(true){ 生产一个产品; P(S1); 申请一个空的缓冲区 P(mutex1); 一个生产者申请制造产品 放到缓冲区; i = (i+1)%n; 指针移动到下一空的缓冲区 V(mutex1); 释放生产者 V(S2); 释放一个满的缓冲区 }} void Consumer() { while(true){ P(S2); 申请一个满的缓冲区 P(mutex2); 一个消费者申请消费 从第j个缓冲区取一个产品; j = (j+1)%n; 指向下一个满的缓冲区 V(mutex2); 释放消费者 V(S1);释放一个空的缓冲区 消费产品; }}

④用进程通信(信箱通信)的方法解决上述问题[习题P175-27]:

void Producer() { msgbuff mb; //message buffer while (1){ generate sth. to send; receive(consumer, &mb); // 取一空缓冲区 create_message(&mb); // 放产品到缓冲区 send(consumer,&mb); // 生产好的产品发给消费者 }} // send和receive原语见信箱通信问题 void Consumer() { msgbuff mb; // empty message for(int i=0 ; isend(producer, &mb); // 初始化,发n个空缓冲区给生产者 while (1){ receive(producer, &mb); // 收到一个产品 extract message; // 把产品保存下来 send(producer, &mb); // 把空缓冲区再发给生产者 do sth.; // 消费产品 }} ⑤进程消息缓冲通信[书P128]:

问题:发送进程把缓冲区中的消息挂到接收进程的消息链上。 同步:发送进程发送消息数量不限,无消息时接收进程不能取信息,故设置当前消息数量(m-syn(0))。 互斥:发送和接收进程互斥访问消息队列首指针m-q,故设置互斥信号量(m-mutex(1))。 空缓冲区个数为(s-b(n)),设置互斥访问信号量(b-mutex(1))。 send(R,M) // 把消息M发给R { 找到接收进程R,否则错误返回; 申请缓冲区P(s-b); P(b-mutex); 取一空缓冲区; V(b-mutex); 把信息M复制到空缓冲区; receive(A) // 把消息存到地址A { P(m-syn); P(m-mutex); 取一消息复制到A; V(m-mutex); P(b-mutex); 释放消息缓冲区; P(m-mutex); 把缓冲区挂到m-q上; V(m-mutex); V(m-syn); } V(b-mutex); }

⑥进程信箱通信[书P130,06年秋讲义]: 问题:发送进程把信息发到信箱中,接收进程随时取信。 同步:发送进程不能向满信箱中发信(full(0));接收进程不能从空信箱中取信(empty(1))。 send(N,M) // 把信件M发到信箱N中 { 查找信箱N; P(full); 把M送入信箱N; V(empty); } receive(N,X) // 从信箱N中取一封信放到X { 查找信箱N; P(empty); 从信箱N中取一封信放到X; V(full); } ⑦进程通信多发送接收者问题[习题P174-16]: 问题:n1个进程通过m个缓冲区向n2个进程发送消息,每个消息所有接收进程都接收一次。 同步:发送者不能向满缓冲区发信息(mutex_send[m](1)); 接收者不能从空缓冲区接收信息(mutex_receive[m](0))。 互斥:设置指示下一个空缓冲区变量(cur(0)),发送进程互斥访问(mutex_cur(1)); 设置buffer_count[m](0)记录某个缓冲区被读过几次,若某个缓冲区被读过n2次,则可以释放,接收者互斥访问buffer_count(mutex_count[m](1))。 阻塞分析:若接收者试图接收空缓冲区被阻塞在mutex_receive[k]上,则其他要访问同一缓冲区的接收者被堵塞在mutex_count[k]上;若此时发送者向缓冲区k写入信息,则由第一个接收者释放其他接收者。 若有一发送者被阻塞在mutex_send[cur]上,则其他发送者被阻塞在mutex_cur上。 void send() { while (true){ P(mutex_cur); cur = (cur+1)% m; // 若阻塞则表示cur满 P(mutex_send[cur]); 写入buffer[cur]; // cur内容等待被读取 V(mutex_receive[cur]); V(mutex_cur); } } void receive() { While (true){ for (int i=0; iP(mutex_count[i]); buffer_count[i]++; if (buffer_count[i]==1) // 第一次读,有信息吗? P(mutex_receive[i]); // 有信息(或已经有人在访问了),释放其他接收者 V(mutex_count[i]); 从buffer[i]中读; P(mutex_count[i]); if (buffer_count[i]==n2){ // 大家都收过一次了 buffer_count[i] = 0; // buffer_count恢复初值 V(mutex_send[i]); // 释放此缓冲区 } V(mutex_count[i]); } }}

相关文档
最新文档