实现临界区互斥的基本方法

软件实现方法

单标志法

设置一个公用变量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;

优点:解决了饥饿现象。
缺点:违背让权等待

硬件实现方法

通过硬件支持实现临界区问题的方法称为低级方法,或称元方法

中断屏蔽方法

当一个进程正在使用处理机执行它的临界区代码时,禁止一切中断发生(关中断),在执行完后再开中断。
缺点:效率低,若一个进程关中断后不再开中断,则系统可能因此终止。

硬件指令方法

  1. TestAndSet指令:
    这条指令是原子指令,不会被中断,其功能是读出指定标志后把该标志设置为真。
    为每个临界资源设置一个共享变量lock,true表示被占用,初值为false。
bool TestAndSet(bool *lock){
	bool old = *lock;
	*lock = true;
	return old;
}

while(TestAndSet(&lock));
critical section;
lock = false;
remainder section;
  1. 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;

硬件方法的优点:适用于任意数目的进程,单处理机或多处理机。
硬件方法的缺点:违反让权等待,可能导致饥饿现象。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值