ImageVerifierCode 换一换
格式:PPT , 页数:136 ,大小:692.02KB ,
文档编号:4587348      下载积分:29 文币
快捷下载
登录下载
邮箱/手机:
温馨提示:
系统将以此处填写的邮箱或者手机号生成账号和密码,方便再次下载。 如填写123,账号和密码都是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

优惠套餐
 

温馨提示:若手机下载失败,请复制以下地址【https://www.163wenku.com/d-4587348.html】到电脑浏览器->登陆(账号密码均为手机号或邮箱;不要扫码登陆)->重新下载(不再收费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录  
下载须知

1: 试题类文档的标题没说有答案,则无答案;主观题也可能无答案。PPT的音视频可能无法播放。 请谨慎下单,一旦售出,概不退换。
2: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
3: 本文为用户(晟晟文业)主动上传,所有收益归该用户。163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

1,本文(操作系统原理教学课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!

操作系统原理教学课件.ppt

1、操作系统原理第二章 进程管理第三节 进程同步 主要内容 进程同步的概念 临界资源与临界区 信号量机制 管程机制 典型的进程同步问题1、进程同步的概念 多道系统与多任务系统程序的并发执行程序执行失去封闭型引入进程的概念使得多进程能够并发执行并能够保证运行环境封闭与进程的独立性问题:如何进行资源共享?解决办法(1)排队,有共享资源控制访问需要专门的守护进程,增加了开销 (2)由用户进程控制访问互斥1、进程同步的概念 先看一个例子:进程P1、P2公用一个变量COUNT,初始值为0 当P1完成COUNT 1,当P2完成,COUNT 2交错执行,进程执行完成后,COUNT 11、进程同步的概念 P1、P

2、2两个进程的执行顺序是随机的,P1、P2可能顺序执行或交错执行。由图可见,不同的执行顺序,COUNT值会不同,这是不允不允许许的。出现这种现象的原因,在于在一个进程执行过程中,该进程能够修改的全局变量如 COUNT应该不允许其他进程修改。即在进程P1执行前,必须保证在P1执行过程中没有其他进程修改COUNT的值1、进程同步的概念 进程运行中的两种制约关系 由于竞争资源形成的间接制约关系;由于相互合作造成的直接制约关系;进程同步进程同步指多个相关进程在执行次序上的协调2、临界资源与临界区 临界资源(critical source)在一段时间内只允许有限个进程访问的资源,如打印机等I/O设备,缓冲

3、区等 临界区临界区(critical section)每个进程中访问临界资源的那段代码,被称之为进程的临界区临界区 可把一个访问临界资源的循环进程描述如下:2、临界资源与临界区 repeat critical section;remainder section;until false;2、临界资源与临界区 同步机制应遵循的规则 空闲让进空闲让进;忙则等待忙则等待;有限等待有限等待;对要求进入临界区的进程,应在有限时间内使之进入,以免陷入“死等死等”。让权等待让权等待;对于等待进入临界区的进程而言,它必须立即释放处理机,以免进程“忙等忙等”2、临界资源与临界区 例:生产者消费者问题 有一个或多个

4、生产者生产某着类型的产品(数据、记录、字符等等),并放置在缓冲区中;有一个或多个消费者从缓冲区中取数据,每次取一项;系统保证对缓冲区的操作是互斥进行的,即 每 次 只 有 一 个 进 程 能 够 访 问 缓 冲 区。其中:缓冲区是临界资源,而访问缓冲区的代码是临界区3、信号量机制 引例:生产者消费者问题 分析:首先需要定义产品的类型,缓冲区的长度,读写指针,资源变量counter。Int n;Int in,out;Structure item;Item buffern;Int counter;3、信号量机制 Void procedure()while(true)生产一个产品放入 nextp;w

5、hile(counter=n)no-op;bufferin=nextp;in+;counter+;3、信号量机制 Void comsumer()while(true)while(counter=0)no-op;nextc=bufferout;out+;counter-;消费nextc中的产品;3、信号量机制 问题:并发执行时,消费者进程与生产者进程都可以改变counter的值,执行顺序不同,counter的结果也不一样,而且与实际结果也不相同。为解决这个问题,引入一个互斥变量mutex,来控制对变量counter的访问。引入互斥变量后的生产者消费者代码如下:3、信号量机制 Void proce

6、dure()while(true)生产一个产品放入 nextp;wait(mutex);while(counter=n)no-op;bufferin=nextp;in+;counter+;single(mutex);3、信号量机制 Void comsumer()while(true)wait(mutex);while(counter=0)no-op;nextc=bufferout;out+;counter-;single(mutex);消费nextc中的产品;Mutex是互斥变量,它是一个整型数,称为整形信号量3、信号量机制 用一个数据结构来描述临界资源的的使用状态或给临界资源加锁,这个数据结

7、构就是信号量(1)整形信号量:用一位整数表示临界资源的忙闲状态 原子操作:wait(S):while S0 do no-op S=S-1;signal(S):S=S+1;3、信号量机制(1)记录型信号量)记录型信号量由于整形信号量出现忙等忙等现象,因此引入记录型信号量 type semaphore=record value:integer;L:list of process;end struct semaphore int value;Listofprocess L;3、信号量机制 相应的,wait(S)和signal(S)操作可描述为:C程序 Void wait(semaphore)s.va

8、lue-;if(s.value0)将调用wait操作的进程放入s.L,阻塞该进程;3、信号量机制 void single(simaphore)s.value+;if(s.value=0)将s.L中第一个进程去掉,并放入就绪队列;3、信号量机制 在记录型信号量机制中,S.value的初值表示系统中某类资源的数目,因而又称为资源信号量,对它的每次wait操作,意味着进程请求一个单位的该类资源,因此描述为S.value=S.value-1;当S.value0时,表示该类资源已分配完毕,因此进程应调用block原语,进行自我阻塞,放弃处理机,并插入到信号量链表S.L中。可见,该机制遵循了“让权等待”准

9、则。此时S.value的绝对值表示在该信号量链表中已阻塞进程的数目。3、信号量机制 对信号量的每次signal操作,表示执行进程释放一个单位资源,故S.value=S.value+1操作表示资源数目加1。若加1后仍是.value0,则表示在该信号量链表中,仍有等待该资源的进程被阻塞,故还应调用wakeup原语,将S.L链表中的第一个等待进程唤醒。如果S.value的初值为1,表示只允许一个进程访问临界资源,此时的信号量转化为互斥信号量。3、信号量机制(3)AND型信号量型信号量死锁死锁是指由于相互制约的进程之间推进顺序不当造成的互相等待对方资源而自己不释放资源的情况 例:在A、B两个进程中都要

10、包含两个对Dmutex和Emutex的操作,即 process A:process B:wait(Dmutex);wait(Emutex);wait(Emutex);wait(Dmutex);3、信号量机制 若进程A和B按下述次序交替执行wait操作:process A:wait(Dmutex);于是Dmutex=0 process B:wait(Emutex);于是Emutex=0 process A:wait(Emutex);于是Emutex=-1 A阻塞 process B:wait(Dmutex);于是Dmutex=-1 B阻塞 出现死锁3、信号量机制 AND同步机制的基本思想是:将进

11、程在整个运行过程中需要的所有资源,一次性全部地分配给进程,待进程使用完后再一起释放。对若干个临界资源的分配,采取原子操作方式:要么全部分配到进程,要么一个也不分配。思考:AND同步机制存在的问题。3、信号量机制 AND同步的描述 Swait(S1,S2,Sn)if(Si1 and Sn1)for(i=1;i=n)Si-;else 将该进程放在第一个Si1 的Si的等待队列中,同时置该进程的程序计数器为进行Swait 操作前的值(操作不成功,回退);3、信号量机制 Ssignal(S1,S2,Sn)for(i=1;i=n)Si+;去掉Si 等待队列中的所有进程,并将其状态改为就绪状态;(原因在于

12、不同进程申请的资源不同)3、信号量机制(4)信号量集信号量集 将AND型信号量加以扩充,当进程一次申请的资源数量不是1,而是d时,AND型信号量被扩充为信号量集。同时,设当资源数量小于t时,不进行资源分配,此时,Swait(S)和single(S)两个操作变为:3、信号量机制 Swait(S1,t1,d1,Sn,tn,dn)if(Sit1 and and Sntn)for(i=1;i=n)Si=Si-di;else 将该进程放在第一个Si1 的Si的等待队列中,同时置该进程的程序计数器为进行Swait 操作前的值;3、信号量机制 signal(S1,d1,Sn,dn)for(i=1;i=n)S

13、i=Si+di;去掉Si 等待队列中的所有进程,并将其 状态改为就绪状态;3、信号量机制 一般“信号量集”的几种特殊情况:Swait(S,d,d):此时在信号量集中只有一个信号量S,但允许它每次申请d个资源,当现有资源数少于d时,不予分配。Swait(S,1,1)。此时的信号量集已蜕化为一般的记录型信号量(S1时)或互斥信号量(S=1时)。3、信号量机制 Swait(S,1,0):这是一种很特殊且很有用的信号量操作。当S1时,允许多个进程进入某特定区;当S变为0后,将阻止任何进程进入特定区。换言之,它相当于一个可控开关。3、信号量机制 信号量的应用利用信号量实现进程互斥利用信号量实现进程互斥V

14、ar mutex:semaphore =1;begin parbegin process 1:begin repeat wait(mutex);critical section signal(mutex);remainder seetion until false;end 3、信号量机制 process 2:begin repeat wait(mutex);critical section signal(mutex);remainder section until false;end parend 3、信号量机制 利用信号量实现前趋关利用信号量实现前趋关系(前趋关系的箭头可系(前趋关系的箭头可

15、以用一个信号量表示)以用一个信号量表示)S4S5S3S1S6S23、信号量机制 semaphore a,b,c,d,e,f,g=0,0,0,0,0,0,0;void main()S1;signal(a);signal(b);wait(a);S2;signal(c);signal(d wait(b);S3;signal(e);wait(c);S4;signal(f);wait(d);S5;signal(g);wait(e);wait(f);wait(g);S6;4、管程机制 管程的引入(1)信号量机制的缺点(2)面向对象技术的发展 .缓冲区生产者消费者将一个产品放入缓冲区将一个产品取出缓冲区4、

16、管程机制 Void procedure()while(true)生产一个产品放入 nextp;wait(mutex);while(counter=n)no-op;bufferin=nextp;in+;counter+;single(mutex);4、管程机制 Void comsumer()while(true)wait(mutex);while(counter=0)no-op;nextc=bufferout;out+;counter-;single(mutex);消费nextc中的产品;4、管程机制 .缓冲区生产者消费者put(item)get(item)bufferin=nextpnextc

17、=bufferoutin+;out+;内部操作4、管程机制 .缓冲区生产者消费者put(item)get(item)bufferin=nextpnextc=bufferoutin+;out+;内部操作包含局部变量与接口操作的特殊对象,称之为管程4、管程机制 管程的结构与内容:(1)互斥对象(2)局部数据(3)作用于局部数据的操作(4)局部数据赋初值的语句(5)管程的名称变量接口管程的名称4、管程机制 管程需要解决的问题(1)如何保证各访问管程的进程互斥地访问管程;(2)管程的封装:共享变量(临界资源)、指针变量、条件变量(如empty,full,n等)(3)wait与singal原语只起阻塞和

18、唤醒作用。管程的形式化结构(语法)monitor monitor-name;variable declarations void P1();void P1();void P1();initialization code;4、管程机制4、管程机制共享数据一组操作过程初始化代码进入队列条件(不忙)队列管程的示意图 5、典型同步问题 生产者消费者问题 问题描述 有一个或多个生产者产生某着类型的产品(数据、记录、字符等等),并放置在缓冲区中;有一个或多个消费者从缓冲区中取数据,每次取一项;系统保证对缓冲区的操作是互斥进行的,即每次只有一个进程能够访问缓冲区。5、典型同步问题 分析(1)对象:生产者、消

19、费者、产品、缓冲区(2)对象的描述:生产者、消费者是一个进程或者一个程序段,产品是一种有类型的数据,缓冲区是没有限制大小的存储区;具有一定大小的存储单元,其存储单元以产品的类型为标准,如大小为n的缓冲区定义为item buffern。5、典型同步问题 对象之间的关系 .缓冲区生产者消费者将一个产品放入缓冲区将一个产品取出缓冲区5、典型同步问题 对象的操作与限制 1)生产者的操作:生产一个产品,将产品放入缓冲区;2)生产者的限制:将产品放入缓冲区是一个互斥操作;3)消费者的操作:将一个产品取出缓冲区;消费一个产品;5、典型同步问题 4)消费者的限制:在缓冲区取产品是一个互斥操作 5)缓冲区的限制

20、:当缓冲区为空时,不允许取产品操作,当缓冲区满时,不允许将产品放入缓冲区;5、典型同步问题(5)当缓冲区无限时生产者与消费者进程的前趋图 1)生产者前驱图由于缓冲区为无限,因此不存在缓冲区满的情况,因此,只要生产者判断缓冲区可用,即可写入一个产品到缓冲区;5、典型同步问题 生产者开始生产一个产品判断缓冲区可用等待写入缓冲区释放临界资源结束不可用可用5、典型同步问题 2)消费者前趋图由于存在缓冲区为空的情况,所以消费者需要两次判断:首先判断缓冲区是否为空;其次判断缓冲区是否可用;5、典型同步问题 消费者开始判断缓冲区是否为空判断缓冲区可用读出缓冲区释放临界资源结束不可用可用等待等待为空5、典型同

21、步问题 用整型信号量解决生产者消费者问题:1)信号量:缓冲区互斥信号量mutex;产品数量n,当n=0,表示缓冲区为空,不能进行取产品操作,n称为资源型信号量。2)产品类型item:定义缓冲区的一个单元大小;3)临时变量:nextp表示生产的一个产品,nextc表示要消费的一个产品2.4.1生产者消费者问题 4)读写指针:用以指示读写的位置,或者是放入一个产品在缓冲区中的位置或从缓冲区中的哪个位置取出一个产品;产品数量等于读指针与写指针的差;5)生产过程与消费过程:produce()与comsum();produce()表示生产一个产品,comsum()表示消费一个产品2.4.1生产者消费者问

22、题 6)原子操作:wait()与singal(),用以判断资源是否可用;2.4.1生产者消费者问题 7)c代码 int n=in=out=0;int mutex=1;struct item;item buffer;Item nexp,nextc;void producer while(true)2.4.1生产者消费者问题 nextp=produce();wait(mutex);bufferin=nextc;in+;sinal(mutex);singal(n);2.4.1生产者消费者问题 Void comsumer()while(true)wait(n);wait(mutex);nextc=bu

23、ffer(out);out+;singal(mutex);2.4.1生产者消费者问题 comsum(nextc);5、典型同步问题 注意:当在一个生产者进程刚退出临界区就被剥夺了执行权,这时连续有二个以上的消费者进程运行,如果每次测试wait(n)后都不恢复其初始状态,则n的值会从0变为-1,-2,这时,即使生产者进程继续执行,n+,n的值也是小于等于0的,因此,一个消费者进程都不能执行。5、典型同步问题 其解决办法有二:a:每次测试不成功,恢复原来状态;b:利用一个局部变量,每次测试都将信号量n赋值给局部变量,然后对局部变量进行测试,测试成功,则对n进行测试,测试不成功,则n不被影响。c:将

24、资源变量的测试放在互斥变量之后。5、典型同步问题 8)生产者、消费者进程的状态转换:void producer while(true)nextc=produce();wait(mutex);bufferin=nextc;in+;sinal(mutex);singal(n);时刻1时刻2时刻35、典型同步问题 用记录形变量解决生产者消费者问题 1)代码 Struct semaphore int s=1;process link L;int n=in=out=0;Semaphore mutex;struct item;item buffer;Item nexp,nextc;5、典型同步问题 voi

25、d producer while(true)nextc=produce();wait(mutex);bufferin=nextc;in+;sinal(mutex);singal(n);5、典型同步问题 Void comsumer()while(true)wait(n);wait(mutex);nextc=buffer(out);out+;singal(mutex);5、典型同步问题 comsum(nextc);2)状态转换图5、典型同步问题 有限缓冲区的情形 1)对象的区别:缓冲区是有限的;2)缓冲区的限制操作:缓冲区满不能写,缓冲区空不能读;3)缓冲区的组织:将缓冲区组织成循环的形式:当缓冲

26、区的读写指针达到缓冲区的最大位置时,指针增加一个将达到缓冲区的第一个位置。即(n-i)mod n=(2n-i)mod n;5、典型同步问题 4)数据结构:信号量增加一个空位信号量empty,并将可用产品信号量由n变成full。5)前趋图5、典型同步问题 生产者开始生产一个产品判断缓冲区有空位等待写入缓冲区释放临界资源结束可用判断缓冲区可用等待不可用不可用5、典型同步问题 消费者(与无限缓冲相同)开始判断缓冲区是否为空判断缓冲区可用读出缓冲区释放临界资源结束不可用可用等待等待为空5、典型同步问题 6)C程序 struct semaphore int s=1;process link L;int

27、full=in=out=0;int empty=n;semaphore mutex;struct item;item buffern;Item nexp,nextc;5、典型同步问题 void producer while(true)nextp=produce();wait(empty);wait(mutex);bufferin=nextp;in=(in+)%n;singal(mutex);singal(full);时刻1时刻2时刻35、典型同步问题 void comsumer while(true)wait(full);wait(mutex);nextc=bufferout;out=(out

28、+)%n;singal(mutex);singal(empty);comsum(nextc):5、典型同步问题 按上图表示的时刻画出三个进程P1,P2,P3的进程状态图,以及各时刻各状态链表的情况。注意(P49):(1)每个程序中用于互斥的信号量的wait与singal操作必须成对的出现,否则容易引起死锁;(2)对资源信号量empty,full的wait与singal操作也必须成对的出现,否则容易引起死锁;5、典型同步问题(3)每个进程中多个wait操作的次序不能颠倒,应先执行对资源信号量(如:empty,full)的操作,再执行对互斥信号量的操作,否则可能引起死锁。如果颠倒会怎么样呢?例如,

29、生产者进程颠倒,P1先占有互斥信号量,但是如果此时empty为满,则生产者程序不能继续执行。此时,其他进程也不能进入临界区,因此死锁。解决办法是采用管程或者采用记录型信号量或者AND型信号量5、典型同步问题 8)C程序 struct semaphore int s=1;process link L;int in=out=0;semaphore mutex;struct item;item buffern;Item nexp,nextc;5、典型同步问题 void producer while(true)nextp=produce();while(in+1)%n=out);wait(mutex)

30、;bufferin=nextp;in=(in+)%n;singal(mutex);5、典型同步问题 void comsumer while(true)while(in=out);wait(mutex);nextc=bufferout;out=(out+)%n;singal(mutex);comsum(nextc):5、典型同步问题(9)利用AND型信号量解决生产者,消费者问题 1)前趋图 2)数据结构 3)c代码5、典型同步问题 struct semaphore int s=1;process link L;int full=0,empty=n;int in=out=0;semaphore m

31、utex;struct item;item buffern;Item nexp,nextc;5、典型同步问题 void producer while(true)nextp=produce();Swait(empty,mutex);bufferin=nextp;in=(in+)%n;Ssingal(mutex,full);5、典型同步问题 void comsumer while(true)Swait(full,mutex);nextc=bufferout;out=(out+)%n;Ssingal(mutex,empty);comsum(nextc):5、典型同步问题 10)用管程解决生产者消费者

32、问题(1)假定已经有一个基本管程保证管程访问的互斥操作,c代码如下:monitor boundedbuffer;管程名 item bufferN;共享变量 Int in,out;指针变量5、典型同步问题 int empty,full,count;条件变量 void put(item nextp)产品放入缓冲区 while(count=N)wait(empty);bufferin=nextp;in=(in+1)%N;count+;5、典型同步问题 singal(full);Void get(item nexc)while(count=0)wait(full);nextc=bufferout;ou

33、t=(out+1)%N;count-;5、典型同步问题 singal(empty);In=out=count=0;empty=N;full=0;5、典型同步问题 void producer()while(true)nextp=produce();put(nextp);5、典型同步问题 void comsumer()while(true)get(nextc);comsum(nextc);5、典型同步问题(2)没有基本管程实现互斥的情况,此时需要在管程中增加一个条件变量mutrex,其初值为1,是一个信号量。C程序如下:monitor boundedbuffer;管程名 item bufferN;

34、共享变量 Int in,out;指针变量 int empty,full,count,mutrex;条件变量5、典型同步问题 void put(item nextp)产品放入缓冲区 while(mutrex=0)wait(mutrex);mutrex-;while(count=N)wait(empty);bufferin=nextp;in=(in+1)%N;count+;5、典型同步问题 singal(full);mutrex+;Void get(item nexc)while(mutrex=0)wait(mutrex);mutrex-;while(count=0)wait(full);5、典型

35、同步问题 nextc=bufferout;out=(out+1)%N;count-;singal(empty);mutrex+;In=out=count=0;empty=N;full=0;mutrex=1;5、典型同步问题(3)有基本进程monitor解决互斥问题,其c程序在程序说明中增加一条引用语句,一条定义语句:monitor boundedbuffer;管程名 item bufferN;共享变量 int in,out;指针变量 int empty,full,count;条件变量5、典型同步问题 define put,get;use monitor.enter,monitor.leave,

36、monitor.wait,monitor.signal;void put(item nextp)while(count=N)boundedbuffer.wait(empty);bufferin=nextp;in=(in+1)%N;count+;5、典型同步问题 bundedbuffer.singal(full);Void get(item nexc)while(count=0)bundedbuffer.wait(full);nextc=bufferout;out=(out+1)%N;5、典型同步问题 count-;bundedbuffer.singal(empty);In=out=count=

37、0;empty=N;full=0;5、典型同步问题 void producer()while(true)nextp=produce();bundedbuffer.enter();put(nextp);bundedbuffer.leave();5、典型同步问题 void comsumer()while(true)bundedbuffer.enter();get(nextc);bundedbuffer.leave();comsum(nextc);5、典型同步问题 哲学家进餐问题 问题描述 有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五只筷子,他们的生活方式是交替的进行思考

38、和进餐。平时,一个哲学家进行思考,饥饿时,便试图取用其左右最靠近他的的筷子,只有在它拿到两根筷子时才能进餐。进餐毕,放下筷子继续思考。5、典型同步问题 分析(1)对象:哲学家,桌子,椅子,碗,筷子(2)互斥对象:哲学家,筷子(3)对象间的关系:哲学家饥饿时,试图取得其左右的筷子进餐。(4)变量:筷子,每根筷子定义为一个信号量(5)进程:每个哲学家定义为一个进程5、典型同步问题 前趋图(哲学家i)开始取左边筷子i等待取右边筷子i+1成功失败等待失败进餐放下左边筷子i放下右边筷子i+1思考结束成功5、典型同步问题 c代码(用记录型信号量)struct semaphore;semaphore cho

39、pstick5;5、典型同步问题 Void phi()while(true)wait(chopsticki);wait(chopsticki+1 mod 5);eat;singal(chopsticki);singal(chopsticki+1 mod 5);thinking;5、典型同步问题问题:当五个哲学家同时拿起左边的筷子时,会出现死锁。其解决办法是:(1)只允许4位哲学家同时那起左边的筷子;(2)仅当哲学家左右两只筷子均可用时,才允许哲学家拿起筷子进餐;(3)规定奇数号哲学家先拿左边的筷子,偶数号哲学家先拿右边的筷子;5、典型同步问题 办法(1)的c代码 先定义一个信号量left,其初

40、值为4,当有一个哲学家先拿起左边的筷子时,其值减一,当该信号量值为0时,不允许哲学家从左边拿起筷子。5、典型同步问题 struct semaphore;semaphore chopstick5;int left=4;5、典型同步问题 Void phi()while(true)wait(left);wait(chopsticki);wait(chopsticki+1 mod 5);eat;singal(chopsticki);singal(chopsticki+1 mod 5);singal(left);thinking;5、典型同步问题 办法(2)的c代码 可以用AND型信号量解决哲学家两边的

41、筷子同时可用的问题 struct semaphore;semaphore chopstick5;5、典型同步问题 Void phi()while(true)Swait(chopsticki,chopsticki+1 mod 5);eat;Ssingal(chopsticki,chopsticki+1 mod 5);thinking;5、典型同步问题 办法(3)的c代码(筷子逆时针编号)用while判断语句 struct semaphore;semaphore chopstick5;5、典型同步问题 Void phi()while(true)while(i%2)=1)wait(chopstick

42、i);wait(chopsticki+1 mod 5);eat;singal(chopsticki);singal(chopsticki+1 mod 5);thinking;else wait(chopsticki+1 mod 5);wait(chopsticki);eat;singal(chopsticki);singal(chopsticki+1 mod 5);thinking;5、典型同步问题 用管程解决哲学家进餐问题 将每根筷子看成一个管程,简单的c代码;monitor chopsticki;enum chopstickstate used,free;chopstickstate st

43、aten;5、典型同步问题 Void getup(int i)While(statei=used)wait(i);Statei=used;Return 1;5、典型同步问题 Void putdown(int i)Statei=free;Singal(i);Statei=free;5、典型同步问题Void philosophyi()Bool with_two_chopsticks;While(true)Thinking;with_two_chopsticks=false;while(!with_two_chopsticks)if(getup(i)if(getup(i+1)%n)with_two_

44、chopsticks=true;else putdown(i);Eating;Putdown(i);Putdown(i+1)%n);5、典型同步问题 读者写者问题 问题描述 一个数据或者一个记录,可被多个进程共享,其中,一部分进程的访问只是读取数据,而不会改变数据,因此称为“读者(reader)”进程,另一部分进程的访问会改变数据,因此称为“写者(writer)”进程。多个“reader”可以同时读,而读写之间、写写之间,必须互斥。5、典型同步问题 分析(1)对象:读者,写者,数据对象(2)对象之间的关系:写者写数据、读者读数据;(3)对象的操作:A:读者,读;B:写者:写5、典型同步问题(4

45、)对象操作的限制:A:写者:当有进程(读或写)在操作数据对象时,不写;B:读者:当只有读进程在操作数据对象时,可以读,当有一个写进程在操作数据对象时,不能读。5、典型同步问题 前趋图(读者)开始数据是否可读等待是否是第一个进程在读成功失败读数据结束是否还有读进程在读否可写是不能写是否退出临界区5、典型同步问题 前趋图(写者)开始数据是否可写等待成功失败写数据结束5、典型同步问题 变量:写互斥变量wmutrex,因为在进程读数据时,需要判断正在进行共享“读”的进程数,因此,需要一个数来记录共享“读”的进程数量,设为Readcount,而每增加或减少一个读共享的进程,都需要改变Readcount的

46、值,同一时刻,只允许一个进程改变Readcount的值,因此,Readcount也是临界资源。为保证Readcount的互斥读写,增加互斥信号量5、典型同步问题 rmutrex,同时,由于每次读数据时,一个进程需要两次改变Readcount的值,而在两次改变之间,Readcount不变。进程进行读共享,因此,可以将是否可改变Readcount的值与判断进程是否可读等价。5、典型同步问题 c代码 Struct semaphore;Semaphore wmutrex=1,rmutrex=1;Int Readcount=0;5、典型同步问题 Void reader()while(true)wait(

47、rmutrex);if(Readcount=0)wait(wmutrex);Readcount+;singal(rmutrex);5、典型同步问题 read();wait(rmutrex);Readcount-;if(Readcount=0)singal(wmutrex);singal(rmutrex);5、典型同步问题 Void writer()while(true)wait(wmutrex);write();singal(wmutrex);5、典型同步问题 用信号量集解决读者写者问题 Swait(si,1,0)能够起到开关作用,设最大允许读进程数量为RN。Void reader()whil

48、e(true)Swait(rmutrex,1,1)Swait(wmutrex,1,0);read;SSingal(rmutrex,1);5、典型同步问题 Void writer()while(true)Swait(wmutrex,1,1;rmutrex,RN,0);write();Ssinal(wmutrex,1);5、典型同步问题 用管程解决读者写者问题 定义被写入的存储单元的状态为条件变量 Monitor reader-writer;enum states reading,writing,free;States state;Char r,w;/*阻塞条件*/Int count;5、典型同步

49、问题 Void start_read()While(state=writing)wait(r);While(count=0)state=reading;Count+;5、典型同步问题 Void end_read()Count-;While(count=0)state=free;singal(r,w);Void start_write()While(state!=free)wait(w);State=writing;5、典型同步问题 Void end_write()state=free;singal(w,r);5、典型同步问题 Void reader()while(true)start_read();read();end_read;5、典型同步问题 Void writer()while(true)sart_write();writ();end_write();

侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|