欢迎来到天天文库
浏览记录
ID:53065252
大小:18.97 KB
页数:8页
时间:2020-04-01
《操作系统第六次作业.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、操作系统第五次作业6.1第一个著名的正确解决两个进程的临界区问题的软件方法是Dekker设计的。两个进程P0和P1共享以下变量: booleanflag[2]; /*initiallyfalse*/ intturn;进程Pi(i==0或1)的结构见图6.25,另一个进程是Pj(j==0或1)。试证明这个算法满足临界区问题的所有三个要求。答:临界区的问题的解答必须满足以下三个条件:1) 互斥:如果进程Pi在其临界区内执行,那么其他进程都不能在其临界区内执行。2) 有空让进:如果没有进程在其临界
2、区内执行且有进程需进入临界区,那么只有那些不在剩余区内执行的进程可参加选择,以确定谁能下一个进入临界区,且这种选择不能无限推迟。3) 有限等待:从一个进程做出进入其临界区的请求,直到该请求允许为止,其他进程被允许进入其临界区的次数有上限。为了表述方便,接下来用0,1来代替i,j;首先两个进程共享以下变量: booleanflag[2]; /*initiallyfalse*/ intturn;flag用来记录谁要访问临界区,就让对应的flag=true(例如P0要访问临界区,就让flag[0]=tru
3、e),相当于“举手示意我要访问”。初始值为0表示一开始没人要访问。trun用于标识当前允许谁进入,turn=0则P0可进入,turn=1则P1可进入。接下来看进程P0的逻辑do{flag[0]=true; //首先P0举手示意我要访问while(flag[1]){ //看看P1是否也举手了if(turn==1){ //如果P1也举手了,那么就看看到底轮到谁flag[0]=false; //如果确实轮到P1,那么P0先把手放下(让P1先)while(turn==1);//donothing //只要还是P1的时间,P0就不
4、举手,一直等flag[0]=true; //等到P1用完了(轮到P0了),P0再举手}}//Criticalsection //访问临界区turn=1; //P0访问完了,把轮次交给P1,让P1可以访问flag[0]=false; //P0放下手//remaindersection //剩余区}while(1);P1的逻辑和P0相同:do{flag[1]=true; //首先P1举手示意我要访问while(flag[0]){ //看看P0是否也举手了if(turn==0){
5、//如果P0也举手了,那么就看看到底轮到谁flag[1]=false; //如果确实轮到P0,那么P1先把手放下(让P0先)while(turn==0);//donothing //只要还是P0的时间,P1就不举手,一直等flag[1]=true; //等到P0用完了(轮到P1了),P1再举手}}//Criticalsection //访问临界区turn=0; //P1访问完了,把轮次交给P0,让P0可以访问flag[1]=false; //P1放下手//remaindersect
6、ion //剩余区}while(1);为了证明第一点,要注意到只有当flag[0]=true并且turn==0的时候,进程P0才会进入临界区。而当flag[0]=true,flag[1]=true表示P0和P1都想进入临界区的时候,P0和P1谁能进入临界区取决于turn的值,当turn==0时,P0可以进入,当turn=1时,P1可以进入;turn的值只可能是0或1,而不可能同时为两个值,所以一次只能有一个进程在临界区内,满足互斥的条件。为了证明第二点和第三点,应注意到,只要条件flag[1]=true,turn==1成立,fla
7、g[0]的值就会被设置成false,并且P0陷入while循环语句,那么P0就能被阻止进入临界区。如果P1不准备进入临界区(flag[1]=false)或者没有轮到P1进入临界区(turn==0),那么P0就能进入临界区。当P1退出临界区的时候,它会设置flag[0]=true,以允许P0进入临界区。当P0访问完之后退出临界区,它会设置turn==1和flag[0]=false,表示P0访问完了,把轮次交给P1,让P1能够访问,所以P1会进入临界区,满足前进的条件;同时P1最多在P0进入临界区一次之后就能进入,满足有限等待的条件。综
8、上所述,Dekker算法是满足临界区问题的所有三个要求的。6.4请解释为什么自旋锁不适用于单处理器系统中,而是往往使用于多处理器系统中?自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分(对于单处理器来说,
此文档下载收益归作者所有