- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
进程管理44
进程的同步与通信
1 进程互斥
2 信号量和P、V操作
3 进程同步
4 经典的进程同步问题
5 进程通信
要求:掌握进程同步与互斥,灵活运用信号量描述同步与互斥问题。
1.1互斥的基本概念
与时间有关的错误:
飞机订票系统中,两个终端,运行T1、T2进程
T1 : T2:
... ...
Read(x); Read(x);
if x=1 then if x=1 then
x:=x-1; x:=x-1;
write(x); write(x);
... ...
同步:对于进程操作的时间顺序所加的某种限制,如操作A应在B之前执行。
互斥:同步的特例,多个操作决不能同时执行, 如:操作A和操作B不能在同时执行。
临界资源(critical resource):一次仅允许一个进程访问的资源。
临界资源可能是硬件,也可能是软件:变量,数据,表格,队列等。
并发进程对临界资源的访问必须作某种限制,否则就可能出与时间有关的错误,如:联网售票。
临界区(critical section):临界段,在每个程序中,访问临界资源的那段程序。
注意:临界区是对某一临界资源而言的,对于不同临界资源的临界区,它们之间不存在互斥。
如有程序段A、B是关于变量X的临界区,而C、D是关于变量Y的临界区,那么,A、B之间需要互斥执行,C、D之间也要互斥执行,而A与C、B与D之间不用互斥执行。
解决互斥的准则
1、空闲让进
2、忙则等待
3、有限等待
4、让权等待
1.2 软件方法解决进程互斥
假如有两个进程Pi和Pj,它们共享一个临界资源R。
如何用软件方法使进程Pi和Pj能互斥地访问R。
下面介绍四个算法。
算法1
设整型变量turn,用于指示被允许进入临界区的进程的编号。
若turn=0 表示进程Pi可进入。
若turn=1 表示进程Pj可进入。
进程Pi :
Repeat
While turni do no_op;
Critical section
turn:=j;
Other code
Until false;
该算法可确保每次只允许一个进程进入临界区。
但它强制两个进程轮流进入。
如当Pi退出时将turn置为j,以便 Pj能进入,但Pj暂不需要进入,而这时Pi又需要进入时,它无法进入。
违反:空闲让进
算法2
设var flag:array[0..1] of boolean,flag[i]=true,表示进程Pi正在临界区内。flag[i]=false,表示进程Pi不在临界区内。flag[j]=true,表示进程Pj正在临界区内。flag[j]=false,表示进程Pj不在临界区内。
Pi进程:
Repeat
While flag[ j ] do no_op;
flag[i]:=true;
Critical section
flag[i]:=false;
Other code
Until false;
该算法可确保空闲让进。
但当pi和pj都未进入时,它们各自的访问标志都为false。如果pi和pj几乎同时要求进入,它们都发现对方的标志为false,于是都进入了。
问题在于:当进程Pi观察到进程Pj的标志为false后,便将自己的标志由false改为true,而正是在这两步之间,可能发生进程切换。当Pj运行时,它会观察到Pi的标志为false,从而可以将自己的标志设为true,并进入临界区。
算法3
设var Flag:array[0..1] of boolean,
若flag[i]=true,表示进程Pi希望进入临界区内。
若flag[j]=true,表示进程Pj希望进入临界区。
Pi进程:
Repeat
flag[i]:=true;//希望进入
While (flag[j]) do no_op;
Critical section
flag[i]:=false;
Other code
Until false;
该算法又出现新问题。它可能造成谁也不能进入。如,当pi和pj几乎同时都要进入,分别把自己的标志置为true,都立即检查对方的标志,发现对方为true.
最终谁也不能进入。
算法4(正确算法)
组合算法1、3
为每一进程设标志位flag[i],
当flag[i]=true时,表示进程pi要求进入,或正在临界区中执行。
再设一个变量turn,用于指示允许进入的进程编号。
进程为了进入先置flag[i]=t
文档评论(0)