经典进程同步问题
OS进程同步(信号量典型题)
![OS进程同步(信号量典型题)](https://img.taocdn.com/s3/m/86d8a5e6102de2bd960588fd.png)
例题1(北京大学1999年)有一个仓库,可以存放A和B两种产品,仓库的存储空间足够大,但要求:(1)一次只能存人一种产品((A或B);(2)一N< A产品数量一B产品数量<M其中,N和M是正整数。
试用“存放A’和‘存放B’以及P操作和V操作描述产品A和产品B的人库过程。
解答:应先将表达式转换成制约条件,不可在程序中直接使用该表达式将表达式分解为:B产品数量—A产品数量<NA产品数量—B产品数量<M可这样理解:(1)若只放人A产品,而不放入B产品,则A产品最多可放M—1次便被阻塞,即A进程每操作一次就应当将计数器减1(计数器初值为M—1),当计数器值为0时,进程程A被阻塞;每当放入一个B产品,则可令A产品的计数器增加1,表明A产品可以多一次放入产品的机会;同理,(2)若只放人B产品,而不放入A产品,则B产品最多可;放N一1次便被阻塞,即A进程每操作一次就应当将计数器减1(计数器初值为N—1)。
当计数器值为0时,进程B被阻塞;每当放人一个A产品,则可令B产品的计数器增加1,表明B产品可以多一次放入产品的机会。
由此可见,该问题是一个同步控制问题。
又因为一次仅允许一种产品人库,设置信号量mutex控制粮进程互斥访问临界资源(仓库)。
过程如下:beginmutex:=1;Sa := M-1;Sb := N-1;ParbeginA产品beginrepeatP (Sa);P (mutex);A人库;V (mutex);V (Sb);Until false;End;B产品beginrepeatP (Sb);P (mutex);B人库;V (mutex);V (Sa);Until false;End;rend;例题2(华中理工大学1999年试题)设公共汽车上,司机和售票员的活动分别是:司机:售票员:启动车辆上乘客正常行车关车门到站停车售票开车门下乘客在汽车不断地到站,停车,行驶过程中,这两个活动有什么同步关系?并用信号灯的P, V操作实现它们的同步。
经典进程同步问题
![经典进程同步问题](https://img.taocdn.com/s3/m/497d6ebd65ce05087632130b.png)
一、利用记录型信号量
解决哲学家进餐问题
假设每一位哲学家拿筷子的方法都是:先 拿起左边的筷子,再拿起右边的筷子,则第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
第10课进程间的制约关系(经典同步问题)
![第10课进程间的制约关系(经典同步问题)](https://img.taocdn.com/s3/m/a14d0fd0ce2f0066f5332252.png)
顾客程序 customer() { V(custs); //释放顾客 P(barbs); //申请理发师 get_haircut(); }
“理发店”问题---P、V信号量解法
设置同步信号量
custs:记录等待理发的顾客数(不包括正在理
发的顾客),初值为0; barbs:正在等待为顾客理发的理发师数,初值 为k;
为防止死锁发生可采取的措施:
最多允许4个哲学家同时坐在桌子周围 仅当一个哲学家左右两边的筷子都可用时, 才允许他拿筷子 给所有哲学家编号,奇数号的哲学家必须首 先拿左边的筷子,偶数号的哲学家则反之
哲学家就餐问题—解法2
0
设置5个互斥信号量: chopstick[i] (0≤i≤4) //对应筷子 初值=1 设置信号量seat // 代表了座位数 初始值=4;
设置变量waiting,它的初值为0。
记录等待理发的顾客数
“理发店”问题---P、V信号量解法
理发师程序 barber() { P(custs); cut_hair(); V(barbs); }
顾客程序 customer() { if(waiting<n) { waiting=waiting+1; V(custs); P(barbs); get_haircut(); } }
第i个哲学家的“思考-就餐-思考”过程可描述为:
philosopher(i) { while(TRUE) { think(); P(chopstick[i]); P(chopstick[(i+1) mod 5)]; eat(); V(chopstick[i]); V(chopstick[(i+1) mod 5)]; } }
详解进程同步与互斥机制
![详解进程同步与互斥机制](https://img.taocdn.com/s3/m/40a22914eef9aef8941ea76e58fafab069dc44f6.png)
详解进程同步与互斥机制⽬录⼀、什么是进程同步⼆、什么是进程互斥三、常见的进程同步与互斥机制⼀、什么是进程同步在多道批处理系统中,多个进程是可以并发执⾏的,但由于系统的资源有限,进程的执⾏不是⼀贯到底的,⽽是⾛⾛停停,以不可预知的速度向前推进,这就是进程的异步性。
那么,进程的异步性会带来什么问题呢?举个例⼦,如果有 A、B 两个进程分别负责读和写数据的操作,这两个线程是相互合作、相互依赖的。
那么写数据应该发⽣在读数据之前。
⽽实际上,由于异步性的存在,可能会发⽣先读后写的情况,⽽此时由于缓冲区还没有被写⼊数据,读进程 A 没有数据可读,因此读进程 A 被阻塞。
进程同步(synchronization)就是⽤来解决这个问题的。
从上⾯的例⼦我们能看出,⼀个进程的执⾏可能影响到另⼀个进程的执⾏,所谓进程同步就是指协调这些完成某个共同任务的并发线程,在某些位置上指定线程的先后执⾏次序、传递信号或消息。
再举个⽣活中的进程同步的例⼦,你想要喝热⽔,于是你打了⼀壶⽔开始烧,在这壶⽔烧开之前,你只能⼀直等着,⽔烧开之后⽔壶⾃然会发⽣响声提醒你来喝⽔,于是你就可以喝⽔了。
就是说⽔烧开这个事情必须发⽣在你喝⽔之前。
注意不要把进程同步和进程调度搞混了:进程调度是为了最⼤程度的利⽤ CPU 资源,选⽤合适的算法调度就绪队列中的进程。
进程同步是为了协调⼀些进程以完成某个任务,⽐如读和写,你肯定先写后读,不能先读后写吧,这就是进程同步做的事情了,指定这些进程的先后执⾏次序使得某个任务能够顺利完成。
⼆、什么是进程互斥同样的,也是因为进程的并发性,并发执⾏的线程不可避免地需要共享⼀些系统资源,⽐如内存、打印机、摄像头等。
举个例⼦:我们去学校打印店打印论⽂,你按下了 WPS 的 “打印” 选项,于是打印机开始⼯作。
你的论⽂打印到⼀半时,另⼀位同学按下了 Word 的 “打印” 按钮,开始打印他⾃⼰的论⽂。
想象⼀下如果两个进程可以随意的、并发的共享打印机资源,会发⽣什么情况?显然,两个进程并发运⾏,导致打印机设备交替的收到 WPS 和 Word 两个进程发来的打印请求,结果两篇论⽂的内容混杂在⼀起了。
进程同步
![进程同步](https://img.taocdn.com/s3/m/a5976751360cba1aa911da6f.png)
3.2 信号量机制
(1)整型信号量 整型信号量是表示共享资源状态且只能由特殊
的原子操作改变的整型量。(其值好比信号灯的颜色) 思路:定义一个整型变量,用整型变量值来标
记资源使用情况:如整型量>0,说明有可用资源; 整型量≤0说明资源忙,进程必须等待。对于一次 只允许一个进程访问的CS,可定义一个用于互斥 的整型信号量,并被初始化为1。
3.2.2记录型信号量机制
(3)利用记录型信号量实现互斥
P1 wait(s)
CS
P2 wait(s){ S.Value=-1
block
P3 wait(s){ S.Value=-2
block
等待 队列 P2
P3
Signal(s){ S.Value=-1 Wakeup(P2)
CS S.Value= S.Value+1 signal(s){ S.Value=0
3.2 信号量机制
3.2.2记录型信号量机制
(3)利用记录型信号量实现互斥
var s:semaphore s.value=1 begin
repeat wait(s); critical section signal(s) remainder section
until false; end
3.2 信号量机制
signal(mutex); … }
3.2 信号量机制
3.2.1 整型信号量机制
(3) 整型信号量应用举例 ②用整型信号量实现进程协调 有p1和p2两个进程,要求p2必须在p1结束后执行,为
此可设置一个信号量s,初始值置为0,同步代码如下: parbegin begin p1; signal(s); end begin waits(s); p2; end parend
【转】进程同步之信号量机制(pv操作)及三个经典同步问题
![【转】进程同步之信号量机制(pv操作)及三个经典同步问题](https://img.taocdn.com/s3/m/7669100911a6f524ccbff121dd36a32d7375c7c5.png)
【转】进程同步之信号量机制(pv操作)及三个经典同步问题上篇博客中(),我们对临界区,临界资源,锁机制详细解读了下,留下了⼀个问题,就是锁机制只能判断临界资源是否被占⽤,所以他解决了互斥问题,但是他不能确定前⾯的进程是否完成,所以他不能⽤于同步问题中。
下⾯就为你讲解信号量机制是如何解决这⼀问题的。
1.信号量机制信号量机制即利⽤pv操作来对信号量进⾏处理。
什么是信号量?信号量(semaphore)的数据结构为⼀个值和⼀个指针,指针指向等待该信号量的下⼀个进程。
信号量的值与相应资源的使⽤情况有关。
当它的值⼤于0时,表⽰当前可⽤资源的数量;当它的值⼩于0时,其绝对值表⽰等待使⽤该资源的进程个数。
注意,信号量的值仅能由PV操作来改变。
⼀般来说,信号量S³0时,S表⽰可⽤资源的数量。
执⾏⼀次P操作意味着请求分配⼀个单位资源,因此S的值减1;当S<0时,表⽰已经没有可⽤资源,请求者必须等待别的进程释放该类资源,它才能运⾏下去。
⽽执⾏⼀个V操作意味着释放⼀个单位资源,因此S的值加1;若S£0,表⽰有某些进程正在等待该资源,因此要唤醒⼀个等待状态的进程,使之运⾏下去。
2.PV操作什么是PV操作?p操作(wait):申请⼀个单位资源,进程进⼊经典伪代码wait(S){while(s<=0)<span style="white-space:pre"> </span>//如果没有资源则会循环等待;;S-- ;}v操作(signal):释放⼀个单位资源,进程出来signal(S){S++ ;}p操作(wait):申请⼀个单位资源,进程进⼊v操作(signal):释放⼀个单位资源,进程出来PV操作的含义:PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进⾏操作,具体定义如下:P(S):①将信号量S的值减1,即S=S-1;②如果S<=0,则该进程继续执⾏;否则该进程置为等待状态,排⼊等待队列。
操作系统复习资料全第二章 进程管理(3)-经典同步问题
![操作系统复习资料全第二章 进程管理(3)-经典同步问题](https://img.taocdn.com/s3/m/bf6d831c4431b90d6c85c781.png)
信号量S的值除初始化(为资源数目)外,其值只能通过原
语wait和signal,也称P、V操作来改变。
整型信号量的P、V操作描述
wait和signal
wait(S): while S≤0 do no-op S∶=S-1; signal(S): S∶=S+1; 解释:P或wait操作:当S≤0时,说明无资源可用,一直测试直到其他进程 释放该类资源。
1. 至多只允许有四位哲学家同时去拿左边的筷子,最终能保证至少 有一位哲学家能够进餐。(增加一个总资源信号量S=4)
2. 仅当哲学家的左、右两只筷子均可用时,才允许他拿起筷子进餐 (AND型信号量)。
3. 规定奇数号哲学家先拿他左边的筷子,然后再去拿右边的筷子; 而偶数号哲学家则相反。按此规定,将是1、 2号哲学家竞争1号 筷子;3、4号哲学家竞争3号筷子。即五位哲学家都先竞争奇数 号筷子,获得后,再去竞争偶数号筷子,最后总会有一位哲学家 能获得两只筷子而进餐。
1. 利用记录型信号量解决读者 为实现Reader与Writer进程间在读或写时的互斥而设置了一个互 斥信号量Wmutex; 设置一个整型变量Readcount表示正在读的进程数目; 当 Readcount=0 时,表示尚无 Reader 进程在读时, Reader 进 程才需要执行 Wait(Wmutex) 操作。若 wait(Wmutex) 操作成功, 做Readcount+1和读文件操作; 当Reader进程在执行了Readcount减1操作后其值为0时,才须 执行signal(Wmutex)操作,以便让Writer进程写; 又因为Readcount是一个可被多个 Reader进程访问的临界资源, 因此,应该为它设置一个互斥信号量rmutex。
计算机操作系统原理 ch3 进程同步
![计算机操作系统原理 ch3 进程同步](https://img.taocdn.com/s3/m/7e4686dead51f01dc281f12d.png)
算法3的问题
该算法可确保准则2。但又出现新问 题。它可能造成谁也不能进入。如,当pi 和pj几乎同时都要进入,分别把自己的 标志置为true,都立即检查对方的标志, 发现对方为true. 最终谁也不能进入。 这 不能保证准则1。
19
课本上的解法4
Pi进程: Repeat flag[i]:=true; While flag[j] do no_op; begin flag[i]:=false; <delay for a short time> flag[i]:=true; end Critical section flag[i]:=false;
29
用原语实现进程互斥
锁即操作系统中的一标志位,0表示资源可用, 1表示资源已 被占用。用户程序不能对锁直 接操作,必须通过操作系统提供的上锁和开 锁原语来操作。 通常锁用w表示,上锁开锁原语分别用lock(w)、 unlock(w)来表示。
30
上锁和开锁原语
上锁原语lock(w)可描述为: L:if(w==1) goto L else w=1;
开锁原语unlock(w)可描述为: w=0;
31
用原语实现进程互斥
32
改进的上锁原语
上述上锁原语中存在忙等待。
33
改进的开锁原语
34
信号量及P、V操作
1965年,由荷兰学者Dijkstra提出(所以 P、V分别是荷兰语的test (proberen) 和 increment (verhogen) ) 一种卓有成效的进程同步机制 最初提出的是二元信号量(互斥) 推广到一般信号量(多值)(同步) P、V操作是原语
必须置一次且只能置一次初值 初值不能为负数 只能执行P、V操作
生产者消费者问题
![生产者消费者问题](https://img.taocdn.com/s3/m/19c8368983d049649b6658e3.png)
喇叭TRUE) {
WaitForSingleObjec t(hE mpty,INFINITE); W ai tF orSingleObj ect(hMutex,lÌ'印刷ITE);
Produω0;
a[i]=i; i=(i+ l)%100; Sleep(5000);
ReleaseMutex(hMut巳:x); ReleaseSemaphore(田ull, l ,N1几L);
2.
#inclu dewindows.h
#includeiostrea皿h
#includestdio.h HANDLE hMutex;
HANDLE hF叫1,
bE mpty; HANDLE p,c;
DWORD DWORD void main()
WINAPI Producer(LPVOID); WINAPI Consumer(LPVOID);
}
return 0; void ConsumeO
cout 消费者消费产品... endl; cout 消费成功 endl; cout 请等待 ...endl;
DWORD WINAPI Consumer(LPVOID lpPara) while(TRUE) {
WaitForSingleObje叫hFull,INFINITE); WaitForSingleObject(hMutex,INFll、rrTE);
பைடு நூலகம்
unsigned
ProductID ConsumeID in out
AUJUAU mmm short
m 俨mrmr
int bool
g_buffer[SIZE_OF_BUFFER]; g_ continue = true;
[操作系统]经典进程同步问题题库
![[操作系统]经典进程同步问题题库](https://img.taocdn.com/s3/m/336f860852ea551810a6877d.png)
1、测量控制系统中的数据采集任务把所采集的数据送一单缓冲区;计算任务则从该缓冲区中取出数据并进行计算。
试写出利用信号量机制实现两者共享单缓冲区的同步算法。
Var Sempty,Sfull: semaphore:= 1,0BeginParbeginCollection:beginrepeat采集一个数据;wait(Sempty);数据放入缓冲区;signal(Sfull);untill false;end;Compute:beginrepeatwait(Sfull);从缓冲区取出数据;signal(Sempty);计算;` until false;end;ParendEnd2、有一阅览室,共有100个座位。
读者进入时必须先在一种登记表上登记,该表为每一座位列一个表目,包括座号和读者姓名。
读者离开时要注销掉登记内容。
试用wait和signal原语描述读者进程的同步问题。
var mutex, readcount :semaphore := 1,100; BeginParbeginProcess Reader:beginrepeatwait(readcount);wait(mutex);<填入座号和姓名完成登记>;signal(mutex);<阅读>wait(mutex)<删除登记表中的相关表项,完成注销>signal(mutex);signal(readcount);until false;end;parend;End;1)、桌上有一空盘,只允许放一个水果,爸爸专向盘中放苹果,妈妈专向盘中放桔子;女儿专吃盘中的苹果,儿子专吃盘中的桔子;试用wait 和signal原语实现爸爸、妈妈、女儿、儿子之间的同步问题。
var Sempty, Sapple, Sorange,: semaphore:= 1,0,0; beginparbeginFather: beginrepeatwait(Sempty);<put apple in tray>;signal(Sapple);until false;end;Mother: beginrepeatwait(Sempty);<put orange in tray>;signal(Sorange);until false;end;Son: beginrepeatwait(Sorange);<take orange>;signal(Sempty);until false;end;Daughter: beginrepeatwait(Sapple);<take apple>;signal(Sempty);until false;end;parend;end;1、在4×100米接力赛中,4个运动员之间存在如下关系,运动员1跑到终点把接力棒交给运动员2;运动员2一开始处于等待状态,在接到运动员1传来的接力棒后才能往前跑,他跑完100米后交给运动员3,运动员3也只有在接到运动员2传来的棒后才能跑,他跑完100米后交给运动员4,运动员4接到棒后跑完全程。
4.10经典进程互斥同步问题:哲学家进餐问题
![4.10经典进程互斥同步问题:哲学家进餐问题](https://img.taocdn.com/s3/m/f57d3a4783c4bb4cf6ecd14d.png)
4.10经典进程互斥同步问题:哲学家进餐问题(the dining philosophers problem)问题描述:(由Dijkstra首先提出并解决)5个哲学家围绕一张圆桌而坐,桌子上放着5支筷子,每两个哲学家之间放一支,哲学家的动作包括思考和进餐,进餐时需要同时拿起他左边和右边的两支筷子,思考时则同时将两支筷子放回原处。
要考虑的问题是如何保证哲学家们的动作有序进行?如:不出现相邻者同时要求进餐;不出现有人永远拿不到筷子。
在这里,哲学家的生活规律是:Repeat思考;取fork[i];取fork[(i+1) mod 5];进食;放fork[i];放fork[(i+1) mod 5];Until false;实现方法:一个信号量表示一根筷子,五个信号量构成信号量数组chop[5],所有信号量初始值为1。
第i个哲学家的进餐过程为:思考问题P(chop[i]);P(chop(i+1) mod 5]);进餐V(chop[i]);V(chop[(i+1) mod 5]);该算法可保证两个相邻的哲学家不能同时进餐,但不能防止五位哲学家同时拿起各自左边的筷子、又试图拿起右边的筷子,这会引起死锁。
这里给出可以防止死锁发生的一种解决方案:Semaphore fork[5] = {1};Semaphore room = 4;Void philospher (int i) {while (true) {thinking();P( room );P(fork[i]);P(fork[(i+1) mod 5])eating();V(fork[i]);V(fork[(i+1) mod 5])V(room); }。
经典进程同步互斥问题集
![经典进程同步互斥问题集](https://img.taocdn.com/s3/m/bb5e6f6f25c52cc58bd6be2f.png)
【例1】有三个进程PA 、PB 和PC 协作解决文件打印问题:PA 将文件记录从磁盘读入内存的缓冲区1中,每执行一次读一个记录;PB 将缓冲区1中的内容复制到缓冲区2中,每执行一次复制一个记录;PC 将缓冲区2中的内容打印出来,每执行一次打印一个记录。
缓冲区的大小与记录大小一样。
请用信号量来保证文件的正确打印。
答:该文件打印过程的同步算法可描述如下:【例2】进程A1、A2、…An1通过m 个缓冲区向进程B1、B2、…Bn2不断地发送消息。
发送和接收工作遵循如下规则:(1)每个发送进程一次发送一个消息,写入一个缓冲区,缓冲区大小与消息长度一样。
(2)对于每一个消息,B1、B2、…Bn2都需各接收一次,读入自己的数据区内。
(3)m 个缓冲区都满时,发送进程等待;没有可读的消息时,接收进程等待。
试用wait,signal 操作描述它们的同步关系。
分析:本题是生产者-消费者问题的一个变形。
由于每个缓冲区都只写一次,但要读n2次,故我们可将每个缓冲区看成是由n2格组成的。
只有当某个缓冲区的n2格都空闲时,才允许写入,而且写一次缓冲区相当于将该缓冲区的n2格全部写一遍。
Bj 进程从缓冲中取消息时,它只取相应缓冲的第j 格。
由于每个Bj 取消息的速度不同,故需为它们分别设置指针outj ,用来指示从哪个缓冲区的第j 格中取消息。
答:我们将每个缓冲区看成是由n2格组成的,可为本题设置下列信号量:mutex,初值为1,用来实现对缓冲区的互斥访问;empty[i](i=1,…,n2),初值均为m ,每个empty[i]对应于缓冲池的第i 格中的所有空闲缓冲区;full[i](i=1,…,n2),初值均为0,对应缓冲池第i 格中装有消息的缓冲区。
另外还需要提供整型变量in 用来指示将消息放入哪个缓冲区,outj(j=1,…,n2)用来指示Bj 从哪个缓冲区中取消息,这些变量的初值均为0。
Ai,Bj 的算法描述如下:【例3】设有两个生产者进程A 、B 和一个销售进程C ,他们共享一个无限大的仓库,生产者每次循环生产一个产品,然后入库供销售者销售;销售者每次循环从仓库中取出一个产品进行销售。
经典进程的同步问题
![经典进程的同步问题](https://img.taocdn.com/s3/m/23df84c25ff7ba0d4a7302768e9951e79b896928.png)
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;
经典进程同步问题的研究与实现
![经典进程同步问题的研究与实现](https://img.taocdn.com/s3/m/548aaa755acfa1c7aa00ccca.png)
O 引 言
多 线 程 的 应 用 广 泛 ,作 用 也 很 大 ,例 如 在 工 业 自动 化 控
据 就 显 得 格 外 重 要 。 步 问题 是 如 此 重 要 , 相 当 有 趣 , 而 同 也 因
吸 引 了 不 少 学 者 对 他 进 行 研 究 , 此 产 成 了 一 系 列 经 典 的进 由 程 同步 问 题 , 中 较 有 代 表 性 的 是 “ 产 者 一消 费 者 问题 ” 其 生 、 “ 者 一 写 者 问题 ” “ 学 家 进 餐 问题 ” 。在 此 , 文 简 要 读 和 哲 等 本 讨 论 了 c +B i e 平 台 下 如 何 利 用 多 线 程 编 程 技 术 实 现 上 + ul r d
步机 制和 交互通信 机制 及其 实现 方法 。
关键 词: 多线 程; 同 步; 生产者 一消 费者 ;读者 一写 者; 哲 学家共餐 中图法 分类号 : P 1 T3l 文献标 识 码: A 文章编 号 :007 2 2 0 ) 224 -3 10 -0 4(06 1—2 80
S u y a dr ai ain o n h o o s r b e i ls ia r c s t d n l t fs c r n u o lm ca sc l o e s e z o y p n p
Ab t a t Th s so mu t tr a e r g a sr c: e e f u l — e d dp o r mmi g i i d wsa es p yi t d c d ih n W n o r i l r u e .M u t h e dme h n s a dt ep o lms u i n m n o l t r a c a im r b e r i n h d ng
进程管理四经典进程同步问题PPT培训课件
![进程管理四经典进程同步问题PPT培训课件](https://img.taocdn.com/s3/m/0c0e4f40591b6bd97f192279168884868662b87f.png)
实现细节
03
哲学家就餐问题
问题在于,如果哲学家们不能正确地同步他们的行为,可能会产生死锁,即所有哲学家都在等待别人放下筷子,导致系统无法继续进行。
哲学家就餐问题是进程同步问题中的一个经典案例,描述了五个哲学家围坐在圆桌旁,思考和进餐的行为。
哲学家的思考和进餐行为需要相邻的哲学家配合,如果一个哲学家左边和右边的哲学家都在进餐,则该哲学家可以拿起筷子开始进餐。
初始化信号量
01
设置初始值为缓冲区的空闲数量和总容量。
生产者进程
02
生成数据后,通过P操作减少空闲位置的信号量;将数据放入缓冲区;通过V操作增加空闲位置的信号量,通知消费者进程可以取数据。
消费者进程
03
通过P操作减少有数据的信号量;从缓冲区中取出数据进行处理;通过V操作增加有数据的信号量,通知生产者进程可以生产数据。
问题描述
解决方案
使用信号量机制:通过设置两个信号量,一个用于控制缓冲区的空闲数量,另一个用于控制缓冲区的总容量。
生产者进程在生产数据后,需要等待缓冲区有空闲位置才能放入数据;消费者进程在取出数据前,需要等待缓冲区中有数据才能进行。
通过信号量的操作来控制进程的同步和互斥,确保数据的安全传输。
五位哲学家围坐在圆桌旁,思考和进食。每两位哲学家之间有一把叉子。如何避免死锁,使得每位哲学家都能够正常地思考和进食?
当一个进程请求资源时,系统需要决定是否分配资源。银行家算法通过检查是否安全来决定是否分配资源,以避免死锁。如何实现银行家算法?
读者-写者问题
哲学家就餐问题
银行家算法
进程同步的经典问题
在实现过程中还需要考虑异常处理和日志记录等方面,以确保程序的健壮性和可维护性。
实现细节
进程管理四经典进程同步问题
![进程管理四经典进程同步问题](https://img.taocdn.com/s3/m/a940f544e45c3b3567ec8b38.png)
1. AND型信号量集
AND型信号量集用于同时需要多种资源且每种占用一个时的信 号量操作; • 问题:一段处理代码需要同时获取两个或多个临界资源―― 可能死锁:各进程分别获得部分临界资源,然后等待其余的 临界资源,"各不相让" • 解决方法:在一个wait原语中,将一段代码同时需要的多个 临界资源,要么全部分配给它,要么一个都不分配。称为 Swait(Simultaneous Wait)。 • 在Swait时,各个信号量的次序并不重要,虽然会影响进程归 入哪个阻塞队列。由于是对资源全部分配或不分配,所以总 有进程获得全部资源并在推进之后释放资源,因此不会死锁。
怎样判断有没有读者在读?
增加一个公共变量Readcount,表示当前有 几个读者进程在读。
新来一个读者进程,Readcount加1; 撤销一个读者进程,Readcount减1; 第一个读者:阻塞所有写者进程;允许其他读者进程执行。 最后一个读者:唤醒可能的写者进程。 Readcount成为临界资源,必须互斥访问: 增加互斥信号量Rmutex
需要注意: 原先处于阻塞状态的进程,被唤醒后,从何处开始执行? 与 记录型信号量机制有何不同?
15
生产者-消费者问题 - AND型信号量机制
• 若不愿意考虑wait操作的先后顺序,也可用AND型信号 量来实现。 • 生产者进程中: – 用Swait(empty,mutex)代替wait(empty)和wait(mutex), – 用Ssignal(mutex,full)代替signal(mutex)和signal(full) • 消费者进程中 – 用Swait(full,mutex)代替wait(full)和wait(mutex), – 用Ssignal(mutex,empty)代替signal(mutex)和 signal(empty)
操作系统第2章2
![操作系统第2章2](https://img.taocdn.com/s3/m/f1d9dfa4f524ccbff12184c1.png)
16
writerj(void)(j=1,2,…,m) vord writerj(void)(j=1,2, ,m) { while(true){ p (wmutex); 文件; 写文件; v(wmutex); v(wmutex);} } Coend
17
其他经典同步问题
司机—售票员问题
设公共汽车上,司机和售票员的活动分别是: 司机: 售票员: 启动车辆 上下乘客 正常行车 关车门 到站停车 售票 开车门 上下乘客 在汽车不断到站,停车,行驶过程中,这两个 活动的同步关系。 解答
struct semaphore r15
cobegin readeri(void)(i=1,2,…k) void readeri(void)(i=1,2, k) { while(true){ p(rmutex); p(rmutex); if( if( readcount= =0 ) then p(wmutex); readcount:=readcount+1; v(rmutex); 读文件; 读文件; … p(rmutex); p(rmutex); readcount:=readcountreadcount:=readcount-1; If( readcount= =0) then v(wmutex); v(rmutex); } }
生产者 消费者 生产者 消费者 系统中使用资源的进程——消费者 系统中释放资源同类资源的进程——生产者
4
Dijkstra把同步问题抽象成一种生产者和消 Dijkstra把同步问题抽象成一种生产者和消 费者关系, 费者关系,计算机系统中的许多问题都可以被归 结为生产者和消费者关系。我们可以通过具有n 结为生产者和消费者关系。我们可以通过具有n 个缓冲区的缓冲池把生产者和消费者联系起来
进程同步通信经典问题—读者写者问题的算法分析与设计
![进程同步通信经典问题—读者写者问题的算法分析与设计](https://img.taocdn.com/s3/m/fe7566b082d049649b6648d7c1c708a1284a0ac8.png)
理论算法
进程同步通信经典问题一读者写者问题的算法分析与设计
曾思源,徐艳 (四川大学锦城学院计算机与软件学院,四川成都,611731)
摘要:本篇文章就读者-写者这一经典问题,利用信号量和count计数器,提出了其多种实现算法和思考解决问题的过 程。同时,本文也通过模拟验证了这些算法,发现其利弊,进而来对其进行了部分的优化。在文章的最后提出了实际生活 中该经典问题的应用场景。本文的讨论有利于让读者对该经典问题有更深刻的认识。 关键字:读者和写者;同步通信;PV操作算法
Classical problem of process synchronization Communication Algorithm analysis and design of reader and writer problem
Zeng Siyuan, Xu Yan (School of Computer and Software, Jincheng College, Sichuan University, Chengdu Sichuan, 611731)
Abstract: This paper uses semaphore to realize a variety of algorithms and problem solving processes for a classical problemnamed aReader -Writer” . At the same time, this paper finds out the advantages and disadvantages and optimizes it by Simulating the actual situation. At the end of the paper, the practical application scenario of the algorithm is presented. The discussion in this article is helpful for readers to have a deeper understanding of this. Keywords; Reader - Writer; Synchronous; Communicationalgorithms
同步问题
![同步问题](https://img.taocdn.com/s3/m/95b0cbf4770bf78a652954a6.png)
2.1经典进程的同步问题同步问题的解题步骤:(1)确定临界资源;同时确定应该施加的限制条件(不一定与同步、互斥相关,例如:在什么条件读写;能够允许的最大工作进程数量等等,由不同题目决定);(2)确定使用何种信号量机制。
为相关的临界资源和限制条件设定信号量,以及信号量的初值;(3)将临界区放置在进入区和退出区之间;同时为限制条件施加P/V操作;(4)检查:包括在整个系统中(而不是单个进程中)wait/signal的配对、位置是否恰当;是否会引起死锁(将同步操作放在互斥操作的前面,互斥操作放在最后)等等。
2.4.1.生产者——消费者问题1.利用记录型信号量解决系统中同时有多个生产者和多个消费者。
以生产者为例,生产者代码为:buffer[in] = nextp;in = (in + 1) mod n;结题过程如下:(1)确定临界资源;同时确定应该施加的条件;(a)临界资源:系统中有多个生产者,因此,in为临界资源(满足R+W类型)。
(b)施加条件:施加条件有两个,第一,系统中缓冲区全满的时候,不能够生产;第二,系统中缓冲区全空的时候,不能够消费。
(2)确定使用何种信号量机制,为相关的临界资源和限制条件设定信号量,以及信号量的初值;使用记录型信号量。
(a)为临界资源in设定信号量和初值:mutext = 1(b)为限制条件设定信号量和初值:对于第一个限制条件,缓冲区全满的时候不能够生产,设定信号量empty,用来指示空缓冲区的数量,初始empty = n;对于第二个限制条件,缓冲区全空的时候不能够消费,设定信号量full,用来指示满缓冲区的数量,初始full=0。
(3)将临界区放置在进入区和退出区之间;同时为限制条件施加P/V操作;(a)将临界区放置在进入区和退出区之间wait(mutext);signal(mutext);为限制条件施加P/V操作wait(empty); //第一个限制条件:在进行生产之前,先判定是否还有空缓冲区signal(full); //当新生产了一个产品之后,通知消费者,满缓冲区数量多了一个。
计算机操作系统复习题目(2)
![计算机操作系统复习题目(2)](https://img.taocdn.com/s3/m/5a9c113aa32d7375a41780cf.png)
第二章进程管理(三)进程同步5、经典同步问题1、生产者—消费者问题生产者消费者问题是一种同步问题的抽象描述。
计算机系统中的每个进程都可以消费(使用)或生产(释放)某类资源。
这些资源可以是硬件资源,也可以是软件资源。
当某一进程使用某一资源时,可以看作是消费,称该进程为消费者。
而当某一进程释放某一资源时,它就相当于生产者。
问题1:设某计算进程CP和打印进程IOP共用一个单缓冲区,CP进程负责不断地计算数据并送入缓冲区T中,IOP进程负责不断地从缓冲区T中取出数据去打印。
通过分析可知,CP、IOP必须遵守以下同步规则:(1)当CP进程把计算结果送入缓冲区时,IOP进程才能从缓冲区中取出结果去打印;(2)当IOP进程把缓冲区中的数据取出打印后,CP进程才能把下一个计算结果送入缓冲区.(3)为此设有两个信号量Sa=0,Sb=1,Sa表示缓冲区中有无数据,Sb表示缓冲区中有无空位置。
两个进程的同步可以描述如下:问题2:一组生产者通过具有N个缓冲区的共享缓冲池向一组消费者提供数据。
问题分析”:为解决生产者消费者问题,应该设两个同步信号量,一个说明空缓冲区的数目,用empty表示,初值为有界缓冲区的大小N,另一个说明已用缓冲区的数目,用full表示,初值为0。
由于在此问题中有M个生产者和N个消费者,它们在执行生产活动和消费活动中要对有界缓冲区进行操作。
由于有界缓冲区是一个临界资源,必须互斥使用,所以,另外还需要设置一个互斥信号量mutex,其初值为1。
问题的解:注意:在每个程序中用于实现互斥的P(mutex)和V(mutex)必须成对的出现对资源信号量empty和full的P和V操作,同样需要成对地出现,但它们分别处于不同的程序中。
在每个程序中的多个P操作顺序不能颠倒。
先同步后互斥。
生产者进程缓冲池消费者进程1┇┇i┇┇2、哲学家就餐问题有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空盘子,每两人之间放一只筷子。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
10
process writer begin repeat p(wmutex); 对数据进行写操作; v(wmutex);
until false;
end
coend
11
哲学家问题
问题描述:在一个圆形餐桌上有5份通 心粉,间隔放有5把叉子,5个哲学家各 自坐在一份通心粉前。哲学家思考时, 他们不做任何动作,当他们饥饿时,必 须手持两把叉子才能吃通心粉,而且只 能取得自己左右手边的叉子。吃完后, 叉子必须放回。
4
(2)算法描述
生产者
生产出一产品;
消费者
P(full); P(mutex); 从缓冲区取出一产品; V(mutex); V(empty); 消费该产品;
5
P(empty);
P(mutex); 将该产品放入缓冲区; V(mutex); V(full);
var mutex,empty,full:semaphore:=1,n,0; buffer:arr[0,1,…n-1] of item; in,out:integer:=0,0;操作Leabharlann 统原理第三章 进程管理之三
1
1、生产者与消费者问题 2、读者与写者问题 3、哲学家就餐问题
2
生产者与消费者
引言:
问题描述:一组生产者进程通过一个
具有n个缓冲区的缓冲池循环不断地向一
组消费者提供产品,怎样才能正确描述
这两个进程?
3
解:(1)设置信号量的情况: 设同步信号量empty,初值为n,表示生 产者有n个空缓冲区可用。 同步信号量full,初值为0,表示生产者 尚未把产品放入缓冲池。 互斥信号量mutex,初值为1,以保证同 时只有一个进程能够进入临界区,访问 访冲池。
cobegin process reader begin p(rmutex); RC:=RC-1; if RC=0 then v(wmutex); v(rmutex); until false; end
repeat
p(rmutex); if RC=0
then
p(wmutex); RC:=RC+1; v(rmutex); 读数据对象; ……
7
解:(1)设置信号量的情况: 设互斥信号量wmutex,初值为1,用于 实现写者与其它写者或读者互斥地访问 共享数据对象。 互斥信号量rmutex,初值为1,用于实 现读者互斥地访问读者计数器变量。 设整型变量RC,初值为0,用于对读者 进行计数。
8
(2)算法描述
读者
P(rmutex);
若RC=0,则P(wmutex);
cobegin process proceducer begin repeat 生产出一产品; p(empty); p(mutex); buffer(in):=nextp; in:=(in+1)mod n; process consumer begin repeat p(full); p(mutex); nextc:=buffer(out); out:=(out+1)mod n; v(mutex);
RC加1; V(rmutex); 读数据对象; P(rmutex); RC减1; 若RC=1,则v(wmutex); V(rmutex);
写者
P(wmutex);
对数据对象进行写操作
V(wmutex);
9
var rmutex,wmutex:semaphore:=1,1; RC:integer:=0;
v(mutex);
v(full); until false; end
v(empty);
消费该产品; until false; end coend
6
读者与写着
问题描述:一组读者(指对共享数据对 象只要求读的进程)与一组写者(指对共 享数据对象只要求写的进程)循环访问共 享的同一个数据对象,规定多个读者可 以同时读这个数据对象,但绝不允许多 个写者对这个数据对象进行写操作。也 不允许读者、写者同时访问这个数据对 象。
12
解:(1)设置信号量的情况: 放在桌上的叉子为临界资源,在一段时 间内只允许一位哲学家试用。 设五个信号量用数组来描述: var stick:arr[0,…,4] of semaphore;
13
(2)算法描述:
process 哲学家 begin
repeat
p(stick[i]); p(stick[(i+1)mod 5]);
……
吃通心粉; …… p(stick[i]); p(stick[(i+1)mod 5]); ….. 思考; until false; end
14