经典的进程同步问题
经典进程同步问题
一、利用记录型信号量
解决哲学家进餐问题
假设每一位哲学家拿筷子的方法都是:先 拿起左边的筷子,再拿起右边的筷子,则第i 位哲学家的活动可描述为:
20
第i位哲学家的活动可描述为: repeat wait(chopstick[i]); wait(chopstick[i+1] mod 5); …. eat; …. signal(chopstick[i]); signal(chopstick[i+1] mod 5); …. think; until false;
full:=full - 1; if full <0 then block; mutex:=mutex-1; if mutex<0 then block; mutex:=mutex+1; if mutex<=0 then wakeup; empty:=empty+1; if empty<=0 then wakeup;
9
Wait操作不能颠倒!! P:wait(empty) wait(mutex)
C:wait(full) wait(mutex)
如果颠倒 P:wait(mutex) mutexl.value=0 wait(empty) 如果此时缓冲池满empty=-1,P阻塞 C:wait(mutex) mutex.value=-1, C阻塞 wait(full) P阻塞在empty队列中,等待一个空缓冲 C阻塞在mutex队列中,等待公共缓冲池访问权
6
consumer://消费者进程 begin repeat wait(full); wait(mutex); nextc:=buffer[out]; out∶=(out+1) mod n; signal(mutex); signal(empty); 消费这件产品; until false; end
进程同步——经典的同步问题
进程同步——经典的同步问题本⽂为博主原创⽂章,未经博主允许不得转载涉及进程同步的⼀些概念:互斥与同步:临界资源(临界区):指⼀次只能允许⼀个进程使⽤的共享资源称为临界资源;同步:指为完成某种任务⽽建⽴的两个和多个进程,这些进程在合作的过程中需要协调⼯作次序进⾏有序的访问⽽出现等待所产⽣的制约关系。
互斥:指两个或多个进程访问临界资源时只能⼀个进程访问,其他进程等待的⼀种相互制约的关系。
信号量与互斥量:信号量:本⾝是⼀个计数器,使⽤P,V两个操作来实现计数的减与加,当计数不⼤于0时,则进程进⼊睡眠状态,它⽤于为多个进程提供共享数据对象的访问。
互斥量:如果信号量只存在两个状态,那就不需要计数了,可以简化为加锁与解锁两个功能,这就是互斥量。
⼀、⽣产者与消费者问题问题描述:⼀组⽣产者进程和⼀组消费者进程共享⼀块初始为空,⼤⼩确定的缓冲区,只有当缓冲区为满时,⽣产者进程才可以把信息放⼊缓冲区,否则就要等待;只有缓存区不为空时,消费者进程才能从中取出消息,否则就要等待。
缓冲区⼀次只能⼀个进程访问(临界资源)。
问题分析:⽣产者与消费者进程对缓冲区的访问是互斥关系,⽽⽣产者与消费者本⾝⼜存在同步关系,即必须⽣成之后才能消费。
因⽽对于缓冲区的访问设置⼀个互斥量,再设置两个信号量⼀个记录空闲缓冲区单元,⼀个记录满缓冲区单元来实现⽣产者与消费者的同步。
问题解决:伪代码实现semaphore mutex=1;semaphore full=0; //满缓冲区单元semaphore empty=N; //空闲缓冲区单元prodecer(){while(1){P(empty);P(mutex);add_source++;V(mutex);V(full);}}consumer(){while(1){P(full);P(mutex);add_source--;V(mutex);V(empty);}}⼆、读者与写者问题问题描述:有读者与写者两个并发进程共享⼀个数据,两个或以上的读进程可以访问数据,但是⼀个写者进程访问数据与其他进程都互斥。
操作系统-经典进程的同步问题
第一章 操作系统引论
2.5.2 哲学家进餐问题 1. 利用记录型信号量解决哲学家进餐问题 经分析可知,放在桌子上的筷子是临界资源,在一段时
间内只允许一位哲学家使用。为了实现对筷子的互斥使用, 可以用一个信号量表示一只筷子,由这五个信号量构成信号 量数组。
6
第一章 操作系统引论
2. 利用AND信号量机制解决哲学家进餐问题 在哲学家进餐问题中,要求每个哲学家先获得两个临界 资源(筷子)后方能进餐,这在本质上就是前面所介绍的AND 同步问题,故用AND信号量机制可获得最简洁的解法。
9
3
第一章 操作系统引论
3. 利用管程解决生产者-消费者问题 在利用管程方法来解决生产者-消费者问题时,首先便 是为它们建立一个管程,并命名为procducerconsumer,或简 称为PC。其中包括两个过程: (1) put(x)过程。 (2) get(x)过程。
4
第一章 操作系统引论
对于条件变量notfull和notempty,分别有两个过程cwait 和csignal对它们进行操作:
1
第一章 操作系统引论
2.5.1 生产者-消费者问题 1. 利用记录型信号量解决生产者-消费者问题 假定在生产者和消费者之间的公用缓冲池中具有n个缓
冲区,这时可利用互斥信号量mutex实现诸进程对缓冲池的 互斥使用;利用信号量empty和full分别表示缓冲池中空缓冲 区和满缓冲区的数量。又假定这些生产者和消费者相互等效, 只要缓冲池未满,生产者便可将消息送入缓冲池;只要缓冲 池未空,消费者便可从缓冲池中取走一个消息。
第一章 操作系统引论
2.5 经典进程的同步问题
在多道程序环境下,进程同步问题十分重要,也是相当 有趣的问题,因而吸引了不少学者对它进行研究,由此而产 生了一系列经典的进程同步问题,其中较有代表性的是“生 产者—消费者”问题、“读者—写者问题”、“哲学家进餐 问题”等等。通过对这些问题的研究和学习,可以帮助我们 更好地理解进程同步的概念及实现方法。
进程同步经典问题
cobegin
{
process producer A
{ repeat
P(empty1);
P(sa);
P(mutex);
buffer1[in1]:=A零件;
in1:=(in1+1) mod m;
V(mutex);
V(sb);
V(full1);
untile false;
B1empty缓冲区B1空,初值1
B2full缓冲区B2满,初值0
B2empty缓冲区B2空,初值1
3、有一个阅览室,共有100个座位,读者进入时必须先在一张登记表上登记,该表为每一座位列一表目,包括座号和读者姓名等,读者离开时要消掉登记的信息,试用PV操作描述读者进程之间的同步关系。
算法的信号量有三个:seats——表示阅览室是否有座位(初值为100,代表阅览室的空座位数);readers——表示阅览室里的读者数,初值为0;用于互斥的mutex,初值为1。
}பைடு நூலகம்
process producerB
{ repeat
P(empty2);
P(sb);
P(mutex);
Buffer2[in2]:=B零件;
in2:=(in2+1) mod m;
V(mutex);
V(sa);
V(full2);
untile false;
}
process take
{ repeat
P(full1);
}
}
coend.
2、设有输入进程INPUT,缓冲区B1接纳输入内容。进程MAKER对B1中的内容加工后移送到B2。进程OUTPUT负责从B2中取出内容进行打印。设有一个无穷序列供INPUT输入,B1与B2的大小相同。请用PV过程写出三个进程同步工作的过程。
2.4 经典进程的同步问题
2011年4月17日星期日 2011年 17日星期日
管理学院
4
问题解答: 问题解答:
①所用信号量设置如下: 所用信号量设置如下: 同步信号量empty 初值为n empty, Ⅰ)同步信号量empty,初值为n,表示消费者已把缓冲 池中全部产品取走, 池中全部产品取走,有n个空缓冲区可用。 个空缓冲区可用。 同步信号量full 初值为0 full, Ⅱ ) 同步信号量 full , 初值为 0 , 表示生产者尚未把产 品放入缓冲池, 品放入缓冲池,有0个满缓冲区可用。 个满缓冲区可用。 mutex, Ⅲ)互斥信号量mutex,初值为1,以保证同时只有一个 互斥信号量mutex 初值为1 进程能够进入临界区,访问缓冲池。 进程能够进入临界区,访问缓冲池。
将生产者的两个P操作对调。 将生产者的两个 操作对调。 wait(mutex); wait(empty); 操作对调 考虑系统中缓冲区全满时, 考虑系统中缓冲区全满时,若一生产者进程先执行了 wait(mutex)操作并获得成功,当再执行wait(empty)操作时, 操作并获得成功,当再执行 操作时, 操作并获得成功 操作时 它将因失败而进入阻塞状态, 它将因失败而进入阻塞状态,期待着消费者执行 signal(empty)来唤醒自己,在此之前,不可能执行 来唤醒自己, 来唤醒自己 在此之前, signal(mutex)操作,从而使企图通过 操作, 操作 从而使企图通过wait(mutex)进入自己 进入自己 的临界区的其他生产者和所有的消费者进程全部进入阻塞 状态,从而引起死锁。 状态,从而引起死锁。 消费者进程的两个P操作对调,同样可能造成死锁。 消费者进程的两个 操作对调,同样可能造成死锁。 操作对调
2011年4月17日星期日 2011年 17日星期日
进程管理之经典的同步问题
第五讲进程管理之经典的同步问题上一讲我们学习了进程同步和信号量,知道了进程同步的愿意和意义。
做了一些例子和习题。
现在了解几个经典的问题【例1】生产者-消费者问题我们把进程同步问题一般化,可以得到一个抽象的一般模型,也就是生产者-消费者问题。
生产者-消费者问题是一种同步问题的抽象描述。
此问题是一个标准的同步编程问题。
b5E2RGbCAP1、问题描述描述一组生产者向一组消费者提供消息,它们共享一个有界缓冲池包括N个缓冲区,生产者向其中<有界缓冲池)投放消息,消费者从中取得消息。
不允许消费者进程到一个空缓冲区去取产品;也不允许生产者进程向一个已装满产品且尚未取走的缓冲区中放产品。
这句话很重要,说明是是进程同步问题。
p1EanqFDPw2、问题说明:计算机系统中,每个进程都申请使用和释放各种不同类型的资源。
这些资源可能是外设、内存及缓冲区这样的硬件资源,也可能是临界区、数据等软件资源。
我们把系统中使用某一类资源的进程成为该资源的消费者。
把释放同类资源的进程成为该资源的生产者。
DXDiTa9E3d举个例子:如计算进程Pc和打印进程Pp就是公用一个缓冲区。
Pc把数据送入缓冲区,Pp从缓冲区取数据打印输出,所以,Pc 是数据资源的生产者,Pp是数据资源的消费者。
RTCrpUDGiT3、各种情况下的生产者-消费者问题。
深入地分析和透彻地理解这个例子,对于全面解决操作系统内的同步、互斥问题将有很大帮助。
(1)一个生产者,一个消费者,公用一个缓冲区。
分析:第一步:明确有哪几个进程,及其之间关系。
现在我们看到题目中只有一个生产者和一个消费者,明确知道有两个进程,生产者为一个进程,消费者为一个进程。
现在来看这两个进程之间关系,首先它们公用一个缓冲区,这个时候看好像是进程互斥,不着急接着看,这两个进程又需要协调,因为只有一个放产品的缓冲区,因此生产一个产品后必须再接着用消费者进程把这个产品拿走消费掉,否则产品没地方放啦。
进程同步互斥经典问题
进程同步互斥经典问题
进程同步互斥经典问题是指在多进程系统中,由于多个进程要共享同一资源,而造成的互斥和同步问题。
其中最为著名的问题就是生产者与消费者问题。
在生产者与消费者问题中,生产者进程负责生产产品并将其放入缓冲区,而消费者进程则负责从缓冲区中取出产品进行消费。
由于缓冲区的容量有限,因此需要保证在缓冲区已满时生产者进程停止生产,而在缓冲区为空时消费者进程停止消费。
为了解决这个问题,可以使用经典的同步互斥算法,如信号量和管程。
信号量是一种可以在多个进程之间共享的计数器,通过对信号量的操作可以实现进程之间的同步和互斥。
而管程则是一种可以对共享变量进行访问控制的数据结构,通过对管程的操作可以确保多个进程之间的同步和互斥。
除了生产者与消费者问题,进程同步互斥经典问题还包括哲学家就餐问题、读者写者问题等。
在实际应用中,需要根据具体的场景选择适合的同步互斥算法,以保证程序的正确性和效率。
- 1 -。
经典进程的同步问题
1.2 哲学家进餐问题
利用记录型信号量解决哲学家进餐问题
经分析可知,放在桌子上的筷子是临界资源,在一段时间内只允许一位哲 学家使用。为了实现对筷子的互斥使用,可以用一个信号量表示一只筷子, 由这五个信号量构成信号量数组。其描述如下:
nextc∶ =buffer(out);
out∶ =(out+1) mod n;
signal(mutex); signal(empty);
consumer the item in nextc;
until false;
end
parend
end
利用记录型信号量解决生产者—消费者问
题
在生产者—消费者问题中应注意:
1.3 读者-写者问题
读者-写者问题可描述如下:
Var rmutex, wmutex:semaphore∶ =1,1;
Readcount:integer∶ =0;
begin parbegin Reader:begin
repeat wait(rmutex);
if readcount=0 then wait(wmutex);
Readcount∶ =Readcount+1;
signal(rmutex);
… perform read operation; …
1.3 读者-写者问题
wait(rmutex); readcount∶ =readcount-1; if readcount=0 then
signal(wmutex); signal(rmutex); until false;
经典的进程同步问题
解答: 进程:Producer - 生产者 进程,Consumer - 消费者 进程 共有的数据结构: buffer: array [0..n-1] of integer; in,out: 0..n-1; — in记录第一个空缓 冲区,out记录第一个不 空的缓冲区 s1,s2,mutex: semaphore; — s1控制缓冲区不 满,s2控制缓冲区不 空,mutex保护临界区; 初始化 s1=k,s2=0,mutex=1 producer(生产者进程): Item_Type item; { while (true) {
生产者和消费者两进程共享下面的变量: Var n : integer; type item=…; var buffer : array[0 , 1, …, n-1] of item; in ,out : 0, 1, …, n-1 ; counter: 0 ,1 ,…, n ;
经典的进程同步问题
------生产者-消费者问题
问题描述:有一群生产者进程在生产产品, 并将这些产品提供给消费者进程去消费. 为使生产者进程与消费者进程能并发执 行,在两者之间设置了一个具有n个缓冲区 的缓冲池,生产者进程将它所生产的产品 放入一个缓冲区中;消费者进程可从一个 缓冲区中取走产品去消费.两者之间必须 保持同步.
produce(&item); p(s1); p(mutex); buffer[in]:=item; in:=(in+1) mod n; v(mutex); v(s2); } } consumer(消费者进程): Item_Type item; { while (true) { p(s2); p(mutex); item:=buffer[out]; out:=(out+1) mod n; v(mutex); v(s1); consume(&item); } }Fra bibliotek
进程管理四经典进程同步问题PPT培训课件
实现细节
03
哲学家就餐问题
问题在于,如果哲学家们不能正确地同步他们的行为,可能会产生死锁,即所有哲学家都在等待别人放下筷子,导致系统无法继续进行。
哲学家就餐问题是进程同步问题中的一个经典案例,描述了五个哲学家围坐在圆桌旁,思考和进餐的行为。
哲学家的思考和进餐行为需要相邻的哲学家配合,如果一个哲学家左边和右边的哲学家都在进餐,则该哲学家可以拿起筷子开始进餐。
初始化信号量
01
设置初始值为缓冲区的空闲数量和总容量。
生产者进程
02
生成数据后,通过P操作减少空闲位置的信号量;将数据放入缓冲区;通过V操作增加空闲位置的信号量,通知消费者进程可以取数据。
消费者进程
03
通过P操作减少有数据的信号量;从缓冲区中取出数据进行处理;通过V操作增加有数据的信号量,通知生产者进程可以生产数据。
问题描述
解决方案
使用信号量机制:通过设置两个信号量,一个用于控制缓冲区的空闲数量,另一个用于控制缓冲区的总容量。
生产者进程在生产数据后,需要等待缓冲区有空闲位置才能放入数据;消费者进程在取出数据前,需要等待缓冲区中有数据才能进行。
通过信号量的操作来控制进程的同步和互斥,确保数据的安全传输。
五位哲学家围坐在圆桌旁,思考和进食。每两位哲学家之间有一把叉子。如何避免死锁,使得每位哲学家都能够正常地思考和进食?
当一个进程请求资源时,系统需要决定是否分配资源。银行家算法通过检查是否安全来决定是否分配资源,以避免死锁。如何实现银行家算法?
读者-写者问题
哲学家就餐问题
银行家算法
进程同步的经典问题
在实现过程中还需要考虑异常处理和日志记录等方面,以确保程序的健壮性和可维护性。
实现细节
进程同步问题总结
进程同步问题总结进程同步是计算机科学中一个重要的概念,用于解决多个进程共享资源时可能出现的数据竞争和不一致性的问题。
在并发编程中,正确的进程同步机制对于保证系统的正确性和可靠性至关重要。
本文将总结常见的进程同步问题及其解决方案。
1. 互斥问题:当多个进程共享一个临界资源时,可能会发生互斥问题。
如果一个进程占用了临界资源,其他进程就无法使用该资源,导致资源的浪费和性能下降。
解决方案:(1)锁机制:通过使用锁(如互斥锁、自旋锁、读写锁)来保护临界资源。
一旦某个进程获得了锁,其他进程就需要等待,直到锁被释放。
(2)信号量:通过使用信号量来管理对临界资源的访问。
信号量可以用来限制同时访问资源的进程数量。
2. 死锁问题:当多个进程相互等待其他进程释放资源时,可能会发生死锁问题。
即使每个进程都只需要一个资源,但由于资源的分配不当,导致进程无法继续执行。
解决方案:(1)避免循环等待:对于进程需要的资源排序,使得每个进程按照同一种顺序请求资源,从而避免进程之间出现循环等待的情况。
(2)资源预分配:进程在开始执行之前,请求所有需要的资源。
这样可以避免在执行过程中发生资源竞争导致死锁。
(3)超时机制:设定一个等待时间,如果在该时间内没有获得所需资源,就主动释放已获得的资源,并重新开始执行。
3. 竞争条件问题:当多个进程同时竞争访问共享资源时,可能会出现竞争条件问题。
竞争条件指的是多个进程之间的执行顺序会影响最终的结果。
解决方案:(1)原子操作:通过原子操作来确保对共享资源的访问是原子性的,不可中断的。
例如使用原子锁或原子变量等。
(2)同步工具:使用同步工具,如条件变量、屏障等来协调多个进程的执行顺序,以避免竞争条件的出现。
(3)尽量避免共享数据:如果可能的话,尽量避免多个进程之间共享数据,减少竞争条件的发生。
4. 内存一致性问题:在分布式系统中,不同节点的内存可能存在一致性问题。
当一个进程修改了自己所在节点的内存,并且其他节点也有相应的副本时,就可能会出现读取到不一致数据的问题。
操作系统:进程同步三大经典问题
操作系统:进程同步三⼤经典问题⽇期:2019/4/15内容:进程同步;⽣产者与消费者;读写者;哲学家进餐;信号量机制。
⼀、⽣产者与消费者问题1.1 版本1代码void producer(){while (count == n);buff[in] = produce_item(); in = (in + 1) % n;count++;}void consumer(){while (count == 0) ;item = buff[out];print(item);out = (out + 1) % n; count--;}存在问题>>两个while循环⼀直在"忙等",不符合进程同步的"让权等待"原则。
>>对于count变量的访问没有保护。
(需要加锁保护)1.2 版本2:使⽤信号量代码semaphore empty = n, full = 0; void producer(){while (true){wait(empty);buffer[in] = produce_item(); in = (in + 1) % n;signal(full);}}void consumer(){while (true){wait(full);item = buffer[out]; print(item);out = (out + 1) % n; signal(empty);}}存在问题>>如果有2个producer进程,empty>=2时,同时进⼊wait(empty)之后的临界区,对于buff的写和in的写产⽣竞争。
>>如果有2个consumer进程,full>=2时,同时进⼊wait(full)之后的临界区,对于out的写产⽣竞争。
1.3 版本3:临界区加锁(正确版本)代码semaphore pmutex = 1, cmutex = 1; semaphore empty = n, full = 0; void producer(){while (true){wait(empty);wait(pmutex);buff[in] = produce_item();in = (in + 1) % n;signal(pmutex);signal(full);}}void consumer(){while (true){wait(full);wait(cmutex);item = buff[out];print(item);out = (out + 1) % n; signal(cmutex);signal(empty);}}注:教材对于producer和consumer的临界区都使⽤了同⼀个mutex,表⽰producer和consumer互斥进⼊临界区。
进程的经典同步问题
进程的经典同步问题P、V操作描述简单同步设同步信号量empty,含义为缓冲单元为空,初值为1设同步信号量full,含义为缓冲单元为满,初值为0输⼊进程:申请空缓冲单元; P(empty);输⼊数据到缓冲单元;输⼊数据到缓冲单元;释放满缓冲单元; V(full)计算进程申请满缓冲单元; P(full)从缓冲单元取数据;从缓冲单元取数据释放空缓冲单元; V(empty);同步:每⼀个同步信号量P、V操作成对出现在不同的进程代码中经典同步问题⽣产者消费者问题P、V操作描述进程同步互斥问题步骤:分析进程同步互斥关系;设响应同步互斥信号量;⽤P、V操作描述进程活动。
描述了⼀组⽣产者向⼀组消费者提供产品(数据),它们共享⼀个有界缓冲区,⽣产者向其中投放产品,消费者从中取出产品消费,⽣产者和消费者互斥使⽤整个缓冲池。
分析:只要缓冲区未满,⽣产者就可把产品送⼊缓冲区,只要缓冲区未空,消费者便可从缓冲区取⾛产品并消耗它。
仅当缓冲区满时,⽣产者被阻塞,类似地,缓冲区空时,消费者被阻塞。
设置两个同步信号量:empty:表⽰空缓冲单元的数⽬,初值为缓冲区的⼤⼩n;full:表⽰满缓冲单元(即产品)的数⽬,初值为0;设置互斥信号量mutex:表⽰整个缓冲池,初值为1。
⽣产者进程Pi(i=1,2,……,m)总结两个P操作不可⽤颠倒,如⽣产者进程中如颠倒,当缓冲区都满时会引起死锁,消费者进程如颠倒,当缓冲区都空时会引起死锁;两个V 操作可以颠倒,只是影响到释放缓冲区的顺序。
互斥操作,P、V操作成对出现在同⼀进程代码中。
同步操作,P、V操作成对出现在不同进程代码中。
进程同步问题实例
P(Sa);
从plate中取苹果;
V(S); 吃苹果;
18
16
5 吃水果问题
桌上有一空盘,允许存放一只水果。爸爸向盘中放苹 果,妈妈向盘中放桔子,儿子专等吃盘中的桔子,女 儿专等吃盘中的苹果。规定当盘空时一次只能放一只 水果供吃者取用,请用P、V原语实现爸爸、妈妈、儿 子、女儿三个并发进程的同步。
爸爸 儿子
plate
妈妈 女儿
17
5 吃水果问题
应设置三个信号量S、So、Sa,信号量S表示盘子是否为空,其初值 为1;信号量So表示盘中是否有桔子,其初值为0;信号量Sa表示盘 中是否有苹果,其初值为0。同步描述如下:
} while (1);
do { wait(full); wait(mutex); … remove an item from buffer to nextc … signal(mutex); signal(empty); … consume the item in nextc …
} while (1);
Semaphor S=1, So=Sa=0;
Process father: Process mother: Process son:
Process daughter:
P(S);
把苹果放入plate;
V(So);
P(S);
把橘子放入plate;
V(Sa);
P(So);
从plate中取橘子;
V(S); 吃橘子;
8
2 缓冲区问题(生产者-消费者问题)
三个进程P1、P2、P3 互斥使用一个包含N(N>0)个单 元的缓冲区。P1 每次用produce()生成一个正整数并 用put()送入缓冲区某一个空单元中;P2 每次用 getodd()从该缓冲区中取出一个奇数并用countodd() 统计奇数个数;P3 每次用geteven()从该缓冲区中取 出一个偶数并用counteven()统计偶数个数。请用信号 量机制实现这三个进程的同步与互斥活动,并说明所 定义的信号量的含义。要求用伪代码描述。
经典进程同步问题
04 03 02 01
解:(1)设置信号量的情况:
设互斥信号量wmutex,初值为1,用于实现写 者与其它写者或读者互斥地访问共享数据对象。
互斥信号量rmutex,初值为1,用于实现读者 互斥地访问读者计数器变量。
设整型变量RC,初值为0,用于对读者进行计 数。
(2)算法描述
,则P(wmutex); RC加1; V(rmutex); 读数据对象; P(rmutex); RC减1; 若RC=1,则v(wmutex); V(rmutex);
202X
操作系统原理 第三章 进程管 理之三
单击此处添加文本具体内容,简明扼要地 阐述你的观点
1
生产者与消费者问题 2、读者与写者问题 3、哲学家就餐问题
CONTENTS
01 单击此处添加标题
02 单击此处添加标题
2
生产者与消费者
引言:
问题描述:一组生产者进 程通过一个具有n个缓冲区 的缓冲池循环不断地向一 组消费者提供产品,怎样 才能正确描述这两个进程?
….. 思考; until false; end
14
02
时间内只允许一位哲学家试用。
03
设五个信号量用数组来描述:
var stick:arr[0,…,4] of
04
semaphore;
算法描述:
process 哲学家 begin
repeat p(stick[i]); p(stick[(i+1)mod 5]); …… 吃通心粉; …… p(stick[i]); p(stick[(i+1)mod 5]);
3
1 解:(1)设置信号量 的情况:
设同步信号量
2 empty,初值为n, 表示生产者有n个 空缓冲区可用。
经典进程的同步问题
2021年1月27日星期三
} philosopher(int i) { while(1) { think; P(chopstick[i]); P(chopstick[(i+1) mod 5]); eat; V(chopstick[i]); V(chopstick[(i+1) mod 5]); } }
程去消费。为使生产者进程与消费者进程能并发执行,在两者之间 设置了一个具有n个缓冲区的循环缓冲池,生产者进程将它所生产的 产品放入一个缓冲区中;消费者进程可从一个缓冲区中取走产品去 消费。不允许消费者进程到一个空缓冲区去取产品,也不允许生产 者进程向一个已装满产品且尚未被取走的缓冲区中投放产品。
2021年1Biblioteka 27日星期三1.3 读者—写者问题
一个数据文件或记录,可被多个进程共享,把只要求读该文件的进 程称为“Reader进程”,其他进程则称为“Writer进程”。允许多个进 程同时读一个共享对象,因为读操作不会使数据文件混乱。但不允许一 个Writer进程和其他Reader进程或Writer进程同时访问共享对象,因为 这种访问将会引起混乱。所谓“读者—写者问题”是指保证一个Writer 进程必须与其他进程互斥地访问共享对象的同步问题。
2021年1月27日星期三
1.2 生产者—消费者问题
1.一个生产者和一个消费者问题 一个生产者和一个消费者,共享一个缓冲区。生产者不断生
产物品,每生产一件便存入缓冲区,消费者要不断从缓冲区中取 出一件物品消费。缓冲区只能容纳一件物品,生产者要等消费者 取走物品后才能放入下一件物品,而消费者取走一件物品后要等 生产者放入下一件物品才能再取。
实现同步时需要注意的问题: (1)设资源信号量,往往多于一个。 (2)对每个信号量的P和V操作成对调用,且出现在不同的程 序中。 (3)至少有一个信号量的初始值等于1,否则所有进程都无法 执行。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
解:
设置三个信号量S,So,Sa ,初值分别为1,0,0。S 表示可否向盘中放水果; So可否取桔子; Sa可否取 苹果;
Var S,So,Sa: semaphore := 1,0,0; begin parbegin Father :begin repeat wait(S); //等待水果盘中有空位置 将水果放入盘中; if(是桔子) then signal(So); //置盘中放了桔子标志 else signal(Sa); //置盘中放了苹果标志 until false end
第三章 进程的描述与控制
2013-8-7
12
【思考题】
桌上有一空盘,最多允许存放一只水果。爸 爸可向盘中放一个苹果或放一个桔子,儿子 专等吃盘中的桔子,女儿专等吃苹果。 试用P、V操作实现爸爸、儿子、女儿三个并 发进程的同步。
提示:设置一个信号量表示可否向盘中放水 果,一个信号量表示可否取桔子,一个信号 量表示可否取苹果。
第三章 进程的描述与控制
2013-8-7
21
思考题的解2
Semaphore counter; //柜台人员数,初值为n Semaphore customer ; //当前等待的顾客数;初值为0; Semaphore mutex,mutex2; //互斥对顾客号数,柜台人员编号的访问。初值为1
顾客进程: { int x; //取号码 P(mutex); x = CUSTOMER_NUM++; V(mutex); //等待叫号 V(customer); //请求服务 P(counter); //等待叫号 ACTION_CUSTOMER(x); //接受服务; } 柜台人员进程: { int x; REPEAT //叫号 P(customer); //等待顾客请求服务 P(mutex2); x = COUNTER_NUM; V(mutex2); ACTION_COUNTER(x); //为顾客服务 V(counter); //服务完成 UNTIL false; }
第三章 进程的描述与控制 2013-8-7 11
consumer:begin repeat wait(full); //等待已用缓冲区的数目非0 wait(mutex); //等待无进程操作缓冲区 nextc := Buffer(out) //从Buffer [out]取产品 out = out +1; //因无界,无需考虑输出指针出界 signal(mutex); //允许其它进程操作缓冲区 //因无界,不必增加空缓冲区的数目 消费nextc产品; until false end parend end
第三章 进程的描述与控制 2013-8-7 15
【思考题】
若把问题改为: 爸爸只向盘中放苹果,妈妈只 向盘中放桔子,儿子专等吃盘中的桔子,女 儿专等吃苹果。 如何用P、V操作实现爸爸、儿子、女儿4个 并发进程的同步?
第三章 进程的描述与控制
2013-8-7
16
解:
信号量设置、儿子、女儿进程不变。只需修改父亲进程,并增加母亲进程。
第三章 进程的描述与控制 2013-8-7 6
consumer:begin repeat wait(full); //等待已用缓冲区的数目非0 wait(mutex); //等待无进程操作缓冲区 nextc := Buffer(out) //从Buffer [out]取产品 out = (out +1) mod n; signal(mutex); //允许其它进程操作缓冲区 signal(empty); //增加空缓冲区的数目 消费nextc产品; until false end parend end
第三章 进程的描述与控制
2013-8-7
7
采用AND信号量集解决生产者-消费者问题
Var mutex,empty,full: semaphore :=1,n,0; buffer: array[0, … , n-1] of item; //缓冲区 in,out: integer :=0,0; //输入、输出指针 begin parbegin 等待空缓冲区的数 producer:begin 目非0; repeat 等待无进程操作缓 … 冲区; 生产一个产品nextp; … swait(empty, mutex); Buffer(in):= nextp; //往Buffer [in]放产品 in = (in+1) mod n; ssignal(mutex, full); until false 允许其它进程操作 end 缓冲区;
等待已用缓冲区的 数目非0; 等待无进程操作缓 冲区;
第三章 进程的描述与控制
2013-8-7
9
【思考题】
如果生产者消费者问题中的缓冲区是无界的, 又该如何解呢?
第三章 进程的描述与控制
2013-8-7
10
思考题的解
Var mutex, full: semaphore :=1, 0; //因无界,无需 empty信号量 buffer: array[0, …] of item; //无界缓冲区 in,out: integer :=0,0; //输入、输出指针 begin parbegin producer:begin repeat … 生产一个产品nextp; … //因无界,不必等待空缓冲区的数目非0 ! wait(mutex); //等待无进程操作缓冲区 Buffer(in):= nextp; //往Buffer [in]放产品 in = in+1; //因无界,无需考虑输入指针出界 signal(mutex); //允许其它进程操作缓冲区 signal(full); //增加已用缓冲区的数目 until false end
第三章 进程的描述与控制 2013-8-7 5
问题的解
Var mutex,empty,full: semaphore :=1,n,0; buffer: array[0, … , n-1] of item; //缓冲区 in,out: integer :=0,0; //输入、输出指针 begin parbegin producer:begin repeat … 生产一个产品nextp; … wait(empty); //等待空缓冲区的数目非0 wait(mutex); //等待无进程操作缓冲区 Buffer(in):= nextp; //往Buffer [in]放产品 in = (in+1) mod n; signal(mutex); //允许其它进程操作缓冲区 signal(full); //增加已用缓冲区的数目 until false end
int num;
REPEAT //叫号 P(customer); //等待顾客请求服务 叫号 为顾客服务; V(counter); UNTIL false; }
//服务完成
P(mutex); COSTOMER_NUM--; V(mutex);
}
第三章 进程的描述与控制 2013-8-7 20
问题分析2
3
有n个缓冲区的缓冲池
放消息 放产品
取产品 取消息
P
Q
......
i
j
n
n个缓冲区 (Buffer)
第三章 进程的描述与控制 2013-8-7 4
问题分析
为解决生产者消费者问题,应该设两个同步 信号量:一个说明空缓冲区的数目,用empty 表示,初值为有界缓冲区的大小N,另一个 说明已用缓冲区的数目,用full表示,初值为 0。 由于在此问题中有M个生产者和N个消费者, 它们在执行生产活动和消费活动中要对有界 缓冲区进行操作。由于有界缓冲区是一个临 界资源,必须互斥使用,所以,另外还需要 设置一个互斥信号量mutex,其初值为1。
2.4 经典的进程者/消费者问题 2.4.2 哲学家进餐问题 2.4.3 读者/写者问题
第三章 进程的描述与控制
2013-8-7
1
2.4.1 生产者/消费者问题
生产者消费者问题是一种同步问题的抽象 描述。计算机系统中的每个进程都可以消 费(使用)或生产(释放)某类资源。这 些资源可以是硬件资源,也可以是软件资 源。 当某一进程使用某一资源时,可以看作是 消费,称该进程为消费者。而当某一进程 释放某一资源时,它就相当于生产者。
第三章 进程的描述与控制
2013-8-7
2
问题描述
通过一个有界缓冲区可以把一群生产者 p1,p2…,pm,和一群消费者Q1,Q2,…,Qn 联系起来。如图 只要缓冲区未满,生产者就可以把产品 送入缓冲区; 只要缓冲区未空,消费者就可以从缓冲 区中取走物品。
第三章 进程的描述与控制
2013-8-7
可把“顾客号数”看成是一个单缓冲区,顾客和柜员必 须互斥访问; CUSTOMER_NUM --单缓冲区 顾客号数 COUNTER_NUM --单缓冲区 柜台人员编号 Semaphore counter; //柜台人员数,初值为n Semaphore customer; //当前等待的顾客数;初值为0; Semaphore mutex; //互斥对顾客号数的访问。初值为1 Semaphore mutex2; //互斥对柜台人员编号的访问。初 值为1
第三章 进程的描述与控制
2013-8-7
14
begin repeat wait(So); //等待水果盘中放了桔子 取盘中桔子; signal(S); //置盘中已无水果标志 吃桔子; until false end Daughter :begin repeat wait(Sa); //等待水果盘中放了苹果 取盘中苹果; signal(S); //置盘中已无水果标志 吃苹果; until false end parend end Son: