- 1、本文档共42页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Chap3.1~.2并发进程
* 临界区管理的尝试 (2) bool inside1=false; //P1不在其临界区内 bool inside2=false; //P2不在其临界区内 cobegin process P1( ) { process P2( ) { inside1=true; inside2=true; while(inside2);//等待 while(inside1);//等待 {临界区}; {临界区}; inside1=false; inside2=false; } } coend 延迟进程P1(P2)对inside2(insidel)的测试,先置insidel(inside2)为true,用以封锁P2(P1),修正后的程序如下,不幸,它也是无效的,有可能每个进程都把自己的标志置成true,从而出现死循环,这时没有进程能在有限时间内进入临界区,造成永远等待。 两个进程都进不去 * 3.2.3实现临界区的软件算法Peterson算法 bool inside[2]; inside[0]=false; inside[1]=false; enum {0,1} turn; cobegin process P0( ) { process P1( ) { inside[0]=true; inside[1]=true; turn=1; turn=0; while(inside[1]turn==1); while(inside[0]turn==0); {临界区}; {临界区}; inside[0]=false; inside[1]=false; } } coend * 3.2.3实现临界区的软件算法Peterson算法 bool inside[2]; inside[0]=false; inside[1]=false; enum {0,1} turn; cobegin process P0( ) {process P1( ) { while(true) {turn=1; while(true){turn=0; while(turn==1); while(turn==0); {临界区}; {临界区}; turn=0; turn=1; }} } } coend * 关于Peterson算法的补充分析 P0中执行了turn=1, 暂时进不去,等P1中执行turn=0, P0可以进去,P0使用完临界区,退出临界区的时候,将turn=0(好像是多余的), 此时P1还是进不去,要等p0执行turn=1,使得P1有机会进入临界区,之后,P1退出临界区的时候,turn=1,P0暂时进不去,等在P1中执行turn=0,P0可以再次进入临界区,因此,P0和P1使用临界区的次序变成了完全一比一的交替方式,这只能是临界区互斥使用的一个特例,不能满足临界区互斥使用的完全随机性。 * 实现临界区管理的硬件设施 (1) 关中断 (2) 测试并建立指令 (3) 对换指令 * (1) 关中断 实现互斥的最简单方法 关中断适用场合 关中断方法的缺点 * (2)测试并建立指令(1) TS指令的处理过程 bool TS(bool x) { if(x) { x=false; return true; } else return false; } TS指令管理临界区时,可把一个临界区与一个布尔变量s相连,由于变量s代表了临界资源的状态,可把它看成一把锁。s初值置为true,表示没有进程在临界区内,资源可用,系统利用TS指令实现临界区的上锁和开锁原语操作。 * (2)测试并建立指令(2) //TS指令实现进程互斥 bool s=true; cobegin process Pi(
文档评论(0)