软件实现方法
单标志法
设置一个公用变量turn,若turn=0,则允许
P
0
P_0
P0进程进入临界区,若turn=1,则允许
P
1
P_1
P1进程进入临界区。
缺点:两个进程必须交替进入临界区,违背空闲让进。
双标志法先检查
在每个进程访问临界资源之前,先检查临界资源是否被访问,若正在被访问,则进程需要等待,否则进程进入自己的临界区并设置标志。
优点:不用交替进入,可连续使用
缺点:检查对方flag和切换自己的flag有一段时间,可能造成同时进入临界区,违背忙则等待。
双标志法后检查
先设置自己的标志,再检测对方的标志,若对方的标志为true,则等待对方的进程,否则才进入临界区。
优点:避免同时进入临界区
缺点:如果两个进程同时想进入临界区,都设置了标志,就导致了双方都等待对方,结果谁也进不了临界区,导致了饥饿现象。
皮特森算法
每个进程在设置自己的标志后再设置turn标志,然后检测另一个进程的标志和turn标志。
#i进程 #j进程
flag[i]=True;turn=j; flag[j]=True;turn=i;
while(flag[j]&&turn==j); while(flag[i]&&turn==i);
critical section; critical section;
flag[i]=False; flag[j]=False;
remainder section; remainder section;
优点:解决了饥饿现象。
缺点:违背让权等待。
硬件实现方法
通过硬件支持实现临界区问题的方法称为低级方法,或称元方法。
中断屏蔽方法
当一个进程正在使用处理机执行它的临界区代码时,禁止一切中断发生(关中断),在执行完后再开中断。
缺点:效率低,若一个进程关中断后不再开中断,则系统可能因此终止。
硬件指令方法
- TestAndSet指令:
这条指令是原子指令,不会被中断,其功能是读出指定标志后把该标志设置为真。
为每个临界资源设置一个共享变量lock,true表示被占用,初值为false。
bool TestAndSet(bool *lock){
bool old = *lock;
*lock = true;
return old;
}
while(TestAndSet(&lock));
critical section;
lock = false;
remainder section;
- Swap指令:
这条指令也是原子指令,不会被中断,功能是交换两个字的内容。
为每个临界资源设置一个共享变量lock,true表示被占用,初值为false。每个进程中再设置一个局部变量key,用于和lock交换信息。
void Swap(bool *a, bool *b){
bool tmp = *a;
*a = *b;
*b = tmp;
}
key = true;
while(key != false){
Swap(&lock, &key);
}
critical section;
lock = false;
remainder section;
硬件方法的优点:适用于任意数目的进程,单处理机或多处理机。
硬件方法的缺点:违反让权等待,可能导致饥饿现象。