经典的进程同步问题
经典进程同步问题

一、利用记录型信号量
解决哲学家进餐问题
假设每一位哲学家拿筷子的方法都是:先 拿起左边的筷子,再拿起右边的筷子,则第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;
- 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: