前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >软件方法实现互斥

软件方法实现互斥

作者头像
lexingsen
发布2022-02-25 09:09:10
5460
发布2022-02-25 09:09:10
举报
文章被收录于专栏:乐行僧的博客乐行僧的博客

一.单标志法 轮流交替使用。 缺点:当有一个进程不再进入临界区,便不能修改公共变量的turn,来标识另外一个进程可以进入临界区。因此另外一个进程将永久不能进入临界区,违背“空则让进”的原则

代码语言:javascript
复制
A进程
while (turn != A);
critical section 临界区
turn = B
remainder section 剩余区

B进程
while (turn != B);
critical section
turn = A
remainder section

二.双标志先检查法 为了解决在单标志法中出现的违背“空则让进”的原则的问题,增加一个变量用于检查对方的状态。

代码语言:javascript
复制
bool flag[2] = {false, false}; 
flag[A]==true 表示A正在使用临界区
flag[B]==true 表示B正在使用临界区

A进程
while (flag[B]==true); 当B在临界区便一直循环检查 (1) 
flag[A]=true; 表示A自己在临界区域中              (3)
critical section
flag[A]=false; 表示A自己退出临界区
remainder section


B进程
while (flag[A]==true); 当A在临界区便一直循环检查 (2) 
flag[B]=true; 表示B自己在临界区域中              (4)
critical section
flag[B]=false; 表示B自己退出临界区
remainder section

优点:不需要交替进入临界区,可以连续使用 缺点:两个进程可能会同时进入临界区,初始状态,A与B进程均不在临界区内,所以flag[A]==flag[B]=false,此时按照CPU若按照,(1)(2)(3)(4)的顺序进行执行,A,B进程都能检查到对方不在临界区中,然后进入临界区,分别置自己的值为true,但此时临界区中有两个互斥的进程,违背“忙则等待”的原则。出现这种问题的原因是:检查对方的状态和置自己的状态这两步操作之间存在漏洞,不是原子的。

三.双标志后检查法 为了解决在双标志先检查法中出现的违背“忙则等待”的原则的问题,双标志后检查法的做法是:首先更改自己的状态为进入临界区,然后再检查对方是否在临界区中。

代码语言:javascript
复制
flag[2] = {false, false};
A进程
flag[A]=true;  (1)
while (flag[B]==true); (3)
critical section
flag[A]=false;
remainder section;


B进程
flag[B]=true; (2)
while (flag[A]==true); (4) 
critical section
flag[B]=false;
remainder section;

优点:双标志后检查法解决了在双标志先检查法中出现的违背“忙则等待”原则的问题。 缺点:可能会造成饥饿现象,违背“有限等待”的原则。 原因:CPU可能是按照(1)(2)(3)(4)的顺序执行程序,此时A与B进程均将自己的状态修改为进入临界区,此时执行(3)(4),A,B进程均检查到对方在临界区中,最终造成饥饿,违背“优先等待”的原则。

四.peterson算法 为了解决双标志后检查出现的违背“有限等待”的原则,提出了peterson算法,该算法基于比较绅士友好的想法,A与B都声明自己对于临界区的占有权flag[A]=true,flag[B]=true,但是它们比较绅士,考虑到双方都要声明对临界区的占用权,最终会争吵的难分难舍,不分高低。所以双方都各自非常绅士的说到,虽然我对临界区有占有权,但是你要的话可以让你优先使用,不要客气,因此设置一个turn变量表示临界区让谁用。

代码语言:javascript
复制
A进程
flag[2] = {false, false};

flag[A]=true;我有占有权 turn=B;你先用,不要客气
while (flag[B]==true && turn==B);
critical section
flag[A]=false;
remainder section

B进程
flag[2] = {false, false};

flag[B]=true;我有占有权 turn=A;你先用,不要客气
while (flag[A]==true && turn==A);
critical section
flag[B]=false;
remainder section

优点:peterson算法完美的遵守了空则让进,有限等待,忙则等待的原则。但是,当A或B进程其一在临界区中,而此时处理机调度B或A时,while循环进行了忙轮询,浪费消耗处理机时间,违背“让权等待”的原则。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档