李元金 计算机与信息工程学院 E-mail: liyuanjin10@126.com 第 5 讲 进程管理(3) 李元金 计算机与信息工程学院 E-mail: liyuanjin10@126.com 1/
经典进程同步问题 教学目标 掌握利用信号量机制解决经典的进程同步问题的方法; 教学内容 掌握P、V操作的实现。 共享缓冲区进程同步问题 掌握共享缓冲区进程同步问题的方法; 教学内容 共享缓冲区进程同步问题 经典进程的同步问题 计算机科学与技术系 信息与教育技术中心 2/
复习 进程同步的任务是什么? 同步机制应遵循的规则是什么? 信号量机制的种类有哪些? 什么是管程?作用是什么? 3/
经典进程同步问题 生产者--消费者问题 哲学家进餐问题 读者--写者问题 4/
生产者一消费者问题 Dijkstra把同步问题抽象成一种生产者和消费者关系,计算机系统中的许多问题都可以被归结为生产者和消费者关系,例如,生产者可以是计算进程,消费者是打印进程,输入时输入进程是生产者,计算进程是消费者。我们可以通过一个缓冲区把生产者和消费者联系起来。 5/
生产者一消费者问题 上述生产者--消费者问题是一个同步问题。即生产者和消费者之间满足如下条件: 消费者想接收数据时,有界缓冲区中至少有一个单元是满的; 生产者想发送数据时,有界缓冲区中至少有一个单元是空的。 6/
生产者一消费者问题 由于有界缓冲区是临界资源,因此,各生产者进程和消费者进程之间必须互斥执行。 由以上分析我们设公用信号量mutex保证生产者进程和消费者进程之间的互斥,设信号量empty表示有界缓冲区中的空单元数,初值为n;信号量full表示有界缓冲区中的非空单元数,初值为0。信号量mutex表示有界缓冲区中的个数,初值为1。 7/
利用记录型信号量解决生产者一消费者问题 mutex:使诸进程互斥地访问缓冲区(n个缓冲区) empty、 full:空、满缓冲区数量。 Var mutex,empty,full:semaphore:=1,n,0; buffer:array[0,1,…,n-1] of item; in, out: integer: =0,0; begin parbegin producer: begin repeat … Produce an item in nextp; 8/
consumer:begin repeat wait(full); wait(empty); wait(mutex); nextc:=buffer(out); out:=(out+1) mod n; signal(mutex); signal(empty); Consumer the item in nextc; Until false; end parend wait(empty); wait(mutex); buffer(in):=nextp; in:=(in+1) mod n; signal(mutex); signal(full); Until false; end 9/
思考 wait(empty)与wait(mutex) wait(full)与wait(mutex)是否可以互换? 在每个程序中的多个wait操作顺序不能颠倒,应先执行对资源信号量的wait操作,然后再执行对互斥信号量的wait操作,否则可能引起进程死锁。 wait 与signal对信号量的操作应该成对出现。 10/
利用AND信号量解决生产者——消费者问题 var mutex, empty, full: semaphore:=1,n,0; buffer:array[0,…,n-1] of item; in out: integer :=0,0; begin parbegin 11/
利用AND信号量解决生产者——消费者问题 Consumer: begin repeat Swait(full, mutex); nextc:=buffer(out); out:=(out+1) mod n; Ssignal(mutex, empty); consumer the item in nextc; until false; end Parend producer: begin repeat produce an item in nextp; … Swait(empty, mutex); buffer(in):=nextp; in:=(in+1) mod n; Ssingal(mutex, full); until false; end 12/
哲学家进餐问题 有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五只筷子,他们的生活方式是交替地进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐,进餐完毕,放下筷子继续思考。 13/
利用记录型信号量解决哲学家进餐问题 Var chopstick: array[0, …, 4] of semaphore:=(1,1,1,1,1); repeat swait(chopstick[i]); wait(chopstick[(i+1)mod 5] ); eat; signal(chopstick[i]) ; signal(chopstick[(i+1)mod 5] ); think; Until false 14/
利用记录型信号量解决哲学家进餐问题 上述解决哲学家进餐问题的方法,可以保证不会有两个相邻的哲学家同时进餐,但是可能引起死锁。 解决方法 至多允许有四位哲学家同时去拿左边的筷子,最终能保证至少有一位哲学家能够进餐,并在用毕时能释放出他用过的两只筷子,从而使更多的哲学家能够进餐。 仅当哲学家的左右两只筷子均可用时,才允许他拿起筷子进餐。 规定奇数号哲学家先拿他左边的筷子,然后再去拿右边的筷子,而偶数号哲学家则相反。 15/
利用AND信号量解决哲学家进餐问题 Var chopstick: array[0, …, 4] of semaphore:=(1,1,1,1,1); processi repeat think; Sswait(chopstick[(i+1)mod 5],chopstick[i]); eat Ssignal(chopstick[(i+1)mod 5],chopstick[i]); Until false 16/
读者—写者问题 一个数据文件或记录,可被多个进程共享,把只要求读该文件的进程成为“Reader进程”,其他进程则称为“Write进程”。 17/
利用记录型信号量解决读者——写者问题 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 18/
利用记录型信号量解决读者——写者问题 … wait(rmutex); readcount:=readcount-1; if readcount=0 then signal(wmutex); signal(rmutex); until false; end 19/
利用记录型信号量解决读者——写者问题 writer: begin repeat wait(wmutex); perform write operation; signal(wmutex); until false; end parend 20/
信号量集解决读者——写者问题 var RN integer; L, mx: semaphore: =RN, 1; begin parbegin reader: begin repeat Swait(L,1,1); Swait(mx,1,0); … perform read operation; … Ssignal(L,1); until false; end 21/
信号量集解决读者——写者问题 writer: begin repeat Swait(mx,1,1; L,RN,0); perform write operation; Ssignal(mx, 1); until flase; end parend 22/
信号量 一般说来,信号量的值与相应资源的使用情况有关。 信号量的值仅由P、V操作改变 P、V操作都是原语 P:申请一个单位资源 23/
P操作 P(s): 若S<0,入等待队列 若S>=0,继续 取s值减1 24/
V操作 V(s): 若S<=0,唤醒一等待队列进程 若S>0,继续 取s值加1 25/
信号量及P、V操作讨论 对于两个并发进程,互斥信号量的值仅取1、0和-1三个值 若MUTEX=1表示没有进程进入临界区 若MUTEX=0表示有一个进程进入临界区 若MUTEX=-1表示一个进程进入临界区,另一个进程等待进入。 26/
信号量及P、V操作讨论 信号量的物理含义: 信号量的初值应该大于等于0 S>0表示有S个资源可用 S=0表示无资源可用 P(S):表示申请一个资源 V(S):表示释放一个资源。 信号量的初值应该大于等于0 27/
信号量及P、V操作讨论 P、V操作必须成对出现,有一个P操作就一定有一个V操作 当为互斥操作时,它们同处于同一进程 当为同步操作时,则不在同一进程中出现 如果P(S1)和P(S2)两个操作在一起,那么P操作的顺序至关重要。 一个同步P操作与一个互斥P操作在一起时同步P操作在互斥P操作前 两个V操作无关紧要 28/
信号量及P、V操作讨论 P、V操作的优缺点 优点: 缺点: 简单,而且表达能力强(用P、V操作可解决任何同步互斥问题) 遇到复杂同步互斥问题时实现复杂 29/
共享缓冲区的进程的同步 设某计算进程CP和打印进程IOP共用一个单缓冲区,CP进程负责不断地计算数据并送入缓冲区T中,IOP进程负责不断地从缓冲区T中取出数据去打印。 30/
共享缓冲区的进程的同步 通过分析可知,CP、IOP必须遵守以下同步规则: 当CP进程把计算结果送入缓冲区时,IOP进程才 能从缓冲区中取出结果去打印; 当IOP进程把缓冲区中的数据取出打印后,CP进程才能把下一个计算结果送入缓冲区。 31/
共享缓冲区的进程的同步 用P、V操作解决下图之同步问题 put copy get 提示:分别考虑对缓冲区S和T的同步,再合并考虑 S T 32/
共享缓冲区的进程的同步 设置四个信号量Sin=1,Sout=0,Tin=1,Tout=0; while(1) P(Tout); copy: while(1) { P(Sout); P(Tin); 将数从S取出放入T; V(Tout); V(Sin); } get: while(1) { P(Tout); 将数从T取走; V(Tin); } put: while(1) { P(Sin); 将数放入S; V(Sout); } 33/
进程同步与互斥关系 进程同步与互斥都反映了在异步环境下并发进程间的相互制约关系。可归于同步范畴,但互斥是同步问题的一个特例,互斥解决临界区的使用,同步是并发进程在一些关键点上需互相等待互发消息。 34/
思考题 桌上有一空盘,最多允许存放一只水果。爸爸可向盘中放一个苹果或放一个桔子,儿子专等吃盘中的桔子,女儿专等吃苹果。 试用P、V操作实现爸爸、儿子、女儿三个并发进程的同步。 提示:设置一个信号量表示可否向盘中放水果,一个信号量表示可否取桔子,一个信号量表示可否取苹果 35/
S=1;So=0;Sa=0;(已经蕴含了儿子和女儿间的互斥关系) Father() { while(1) { p(S); 将水果放入盘中; if(是桔子)v(So); else v(Sa); } Son() { while(1) { p(So) 取桔子 v(S); 吃桔子; Daughter() { p(Sa) 取苹果 吃苹果;
小结 利用信号量机制解决经典进程的同步问题。 P、V操作 37/
作业 P84 13-16 38/