321 Dekker算法 1.第1种途径 var turn:0.1;{turn为共享的全局变量} PROCESS O PROCESS 1 while turn#0 donothing; while turn#1 do nothing);(critical section〉 〈 critical section〉 turn: =1 turn: =0 这种方法保证了互斥,但它只记住了允许哪个进 程进入其临界段,未记住每个进程的状态
11 3.2.1 Dekker算法 1.第1种途径 这种方法保证了互斥,但它只记住了允许哪个进 程进入其临界段,未记住每个进程的状态。 var turn: 0..1; {turn为共享的全局变量} PROCESS 0 PROCESS 1 … … while turn≠0 do {nothing}; while turn≠1 do {nothing};〈critical section〉; 〈critical section〉; turn: =1; turn: =0; … …
321 Dekker算法 2第2种途径 共享的全局变量是: var flag. arroyo.1 lof boolean; 它被初始化为 false PROCESS O PROCESS 1 while flag l]do nothing; while flaglo do nothing flag[0]: -tri flag[]: =true critical section〉; 〈 critical section〉: flago]: =false flag[1]: - false 这种解决方法依赖于进程执行的相对速度 12
12 3.2.1 Dekker算法 2.第2种途径 这种解决方法依赖于进程执行的相对速度 共享的全局变量是:var flag: array[0..1]of boolean; 它被初始化为false PROCESS 0 PROCESS 1 … … while flag[1]do {nothing}; while flag[0]do {nothing}; flag[0]: =true; flag[1]: =true; 〈critical section〉; 〈critical section〉; flag[0]: =false; flag[1]: =false; … …
321 Dekker算法 3.第3种途径 PROCESS O PROCESS 1 flag[o]:=true flagyl]:= while flag l do nothing while flaglo] do nothing 〈 critical section〉 〈 critical section〉 flag[0]: =false flag[ 1]: - false 这种方法保证了互斥但会导致死锁问题。 13
13 3.2.1 Dekker算法 3.第3种途径 这种方法保证了互斥但会导致死锁问题。 PROCESS 0 PROCESS 1 … … flag[0]: =true; flag[1]: =true; while flag[1] do {nothing}; while flag[0] do {nothing}; 〈critical section〉; 〈critical section〉; flag[0]: =false; flag[1]: =false; … …
321 Dekker算法 4第4种途径 PROCESS O PROCeSS 1 fag[o]:≡true flag1]:=true while flag[] do nothing while flaglo] do nothing begin be egIn flag[0]: =false flag[1]: =false delay for a short time) (delay for a short time) flago]:=true flag1]:=true end end critical section〉; 〈 critical section〉 flag[0]: =false flag1: =false
14 3.2.1 Dekker算法 4.第4种途径 PROCESS 0 PROCESS 1 … … flag[0]: =true; flag[1]: =true; while flag[1] do {nothing}; while flag[0] do {nothing}; begin begin flag[0]: =false; flag[1]: =false; 〈delay for a short time〉; 〈delay for a short time〉; flag[0]: =true; flag[1]: =true; end; end; 〈critical section〉; 〈critical section〉; flag[0]: =false; flag[1]: =false; … …
321 Dekker算法 5.一个正确的解决方法 设计一个“指示”小屋,小屋内的黑板标明 “tum”,当P想进入其临界段时,置自己的fag 为“true”,这时它去查看P1的fag,如果是 “fale”,则P就立即进入自己的临界段,反之Po 去查看“指示”小屋,如果urn=0,那么它知道 自己应该坚持并不时去查看P1的小屋,P1将觉察 到它应该放弃并在自己的黑板上写上“ false”, 以允许P继续执行。P执行完临界段后,它将 fag置为“ false”以释放临界段,并且将tumn置为1 ,将进入权交给P1 15
15 3.2.1 Dekker算法 5.一个正确的解决方法 设计一个“指示”小屋,小屋内的黑板标明 “turn”,当P0想进入其临界段时,置自己的flag 为“true”,这时它去查看P1的flag,如果是 “false”,则P0就立即进入自己的临界段,反之P0 去查看“指示”小屋,如果turn=0,那么它知道 自己应该坚持并不时去查看P1的小屋, P1将觉察 到它应该放弃并在自己的黑板上写上“false”, 以允许P0继续执行。 P0执行完临界段后,它将 flag置为“false”以释放临界段,并且将turn置为1 ,将进入权交给P1