如何更好理解Peterson算法?
如何更好理解Peterson算法?
1 Peterson算法提出的背景
在我们讲述Peterson算法之间,我们先了解一下Peterson算法提出前的背景(即:在这个算法提出之前,前人们都做了哪些工作)这对于我们之后理解Peterson算法有很大的裨益。
Peterson 算法是基于双线程互斥访问的LockOne与LockTwo算法而来。LockOne算法使用一个 flag 布尔数组,LockTwo 使用一个 turn的整型量,都实现了互斥,但是都存在死锁的可能。Peterson 算法把这两种算法结合起来,完美地用软件实现了双线程互斥问题。
2 Peterson算法
首先,我们来看看下面这两段代码:
Pi进程:
flag[i] = True;
while(flag[j]);
critical section;
flag[i] = False;
remainder section;
Pj进程:
flag[j] = True;
while(flag[i]);
critical section;
flag[j] = False;
remainder section;
以上是用来实现两个进程互斥访问临界区的两端代码,我们可以这样来理解这两段代码,其中flag[i]
表示进程Pi表示想要进入临界区,while(flag[j])
可以理解为Pi在自己进临界区之前,先问问Pj是否想要进入临界区,如果Pj想进的话它就等待(Pi品德高尚);类似的,Pj也是同样的。双方互相谦让的结果是,最终两个进程谁也进不了临界区。(可以想象这样一个生活场景,两个人同时想进屋,结果在门口谦让了了半天,过了很久都没进去)
Peterson算法就是在上面代码的基础之上,又引入了一个变量turn,打破了这种因为谦让而导致“饥饿”的现象。下面我们先来看看Peterson算法的代码:
Pi进程:
flag[i] = True;
turn = j;
while(flag[j] && turn == j);
critical section;
flag[i] = False;
remainder section;
Pj进程:
flag[j] = True;
turn = i;
while(flag[i] && turn == i);
critical section;
flag[j] = False;
remainder section;
怎么理解变量turn呢?可以将turn变量理解成轮到谁进入临界区了。举个例子:turn = i,表示轮到Pi进入临界区。那么上面这个代码就可以理解为:首先,Pi想进入临界区(flag[i] = True
),然后,还是和前面的代码一样,Pi会先把进入临界区的机会让给Pj(turn = j
),同样地,当Pj想进入临界区时,也会将进入临界区的权利先让给Pi。紧接着,变量turn的作用就显现出来了,当Pj把进入临界区的机会又让给Pi的时候(注意:这是发生在Pi将进入临界区的优先权让给Pj之后),Pi这次就会直接进入临界区。就不会再次出现一直互相谦让,最终导致均无法进入临界区的情况了。
关于为什么当进入临界区的权利(即turn = i)又回到Pi手里时,Pi会直接进入临界区的分析?我们可以分析一下Pi能够成功进入临界区的条件(即:while(flag[j] && turn == j)语句):
总的分为以下两种情况:
Pj不想进入临界区(flag[j] = False)
当Pj不想进入临界区时,自然也就不存在Pi和Pj冲突的情况,Pi当然就直接进入临界区。
Pj想进入临界区(flag[j] = True)
当Pj想进入临界区,又分为以下两种情况:
当 turn = i
turn = i说明当前轮到i进入临界区了 ,这个时候i就直接进入临界区了,不再谦让。(其实这个挺合理的,根据Peterson算法的代码我们不难发现因为turn的值是根据先后想要进入临界区的顺序排列的)
当 turn != i
turn != i 说明当前轮到i进入临界区了没有轮到Pi进入临界区,Pi自然需要等待。
仅过上面的分析,我们就不难理解,当Pi和Pj经过一轮谦让之后,就会直接根据turn的值(即:该轮到谁进临界区了)来直接决定谁该进入临界区。现在回过头回顾整个算法,其实我们会发现,Peterson算法的思想会更贴近于生活中的真实情况,大家一般都是略微谦让一下,然后直奔主题,难道不是吗?哈哈
3 参考资料
[1]维基百科编者. Peterson算法[G/OL]. 维基百科, 2021(20210501)[2021-05-01]. https://zh.wikipedia.org/w/index.php?title=Peterson%E7%AE%97%E6%B3%95&oldid=65429794.
如何更好理解Peterson算法?的更多相关文章
- (转)进程同步之临界区域问题及Peterson算法
转自:http://blog.csdn.net/speedme/article/details/17595821 1. 背景 首先,看个例子,进程P1,P2共用一个变量COUNT,初始值为0 ...
- Raft 为什么是更易理解的分布式一致性算法
一致性问题可以算是分布式领域的一个圣殿级问题了,关于它的研究可以回溯到几十年前. 拜占庭将军问题 Leslie Lamport 在三十多年前发表的论文<拜占庭将军问题>(参考[1]). 拜 ...
- 【转】Raft 为什么是更易理解的分布式一致性算法
编者按:这是看过的Raft算法博客中比较通俗的一篇了,讲解问题的角度比较新奇,图文并茂,值得一看.原文链接:Raft 为什么是更易理解的分布式一致性算法 一致性问题可以算是分布式领域的一个圣殿级问题了 ...
- Raft 为什么是更易理解的分布式一致性算法(转)
一致性问题可以算是分布式领域的一个圣殿级问题了,关于它的研究可以回溯到几十年前. 拜占庭将军问题 Leslie Lamport 在三十多年前发表的论文<拜占庭将军问题>(参考[1]). 拜 ...
- 【转载】Raft 为什么是更易理解的分布式一致性算法
一致性问题可以算是分布式领域的一个圣殿级问题了,关于它的研究可以回溯到几十年前. 拜占庭将军问题 Leslie Lamport 在三十多年前发表的论文<拜占庭将军问题>(参考[1]). 拜 ...
- Peterson算法与Dekker算法解析
进来Bear正在学习巩固并行的基础知识,所以写下这篇基础的有关并行算法的文章. 在讲述两个算法之前,需要明确一些概念性的问题, Race Condition(竞争条件),Situations lik ...
- 简单的理解deflate算法
简单的理解deflate算法 最近做压缩算法. 用到了deflate压缩算法, 找了很多资料, 这篇文章算是讲的比较易懂的, 这篇文章不长,但却浅显易懂, 基本上涵盖了我想要知道的所有要点. 翻译 ...
- 理解 KMP 算法
KMP(The Knuth-Morris-Pratt Algorithm)算法用于字符串匹配,从字符串中找出给定的子字符串.但它并不是很好理解和掌握.而理解它概念中的部分匹配表,是理解 KMP 算法的 ...
- 内存栅栏(memory barrier):解救peterson算法的应用陷阱
最近一个项目中用到了peterson算法来做临界区的保护,简简单单的十几行代码,就能实现两个线程对临界区的无锁访问,确实很精炼.但是在这不是来分析peterson算法的,在实际应用中发现peterso ...
随机推荐
- 14、MyBatis教程之全部(包括所有章节)
MyBatis 3.5.5 教程 1.环境准备 jdk 8 + MySQL 5.7.19 maven-3.6.1 IDEA 学习前需要掌握: JDBC MySQL Java 基础 Maven Juni ...
- springboot源码解析-管中窥豹系列之bean如何生成?(十四)
一.前言 Springboot源码解析是一件大工程,逐行逐句的去研究代码,会很枯燥,也不容易坚持下去. 我们不追求大而全,而是试着每次去研究一个小知识点,最终聚沙成塔,这就是我们的springboot ...
- servlet学习(一)
Tomcat 注:以下资料摘自孙鑫的<sevlet/JSP深入详解>,仅用于个人学习使用. 一.web技术的发展 早期web是静态页面的浏览,使用HTML编写,放入服务器. 1.1浏览器请 ...
- [Fundamental of Power Electronics]-PART II-7. 交流等效电路建模-7.2 基本交流建模方法
7.2 基本交流建模方法 在本节中,PWM变换器的交流小信号模型导出步骤将被推导和解释.关键步骤是:(a)利用小纹波近似的动态版本,建立了与电感和电容波形的低频平均值相关的方程式,(b)平均方程的扰动 ...
- OO第四单元——基于UML的UML解析器总结&OO课程总结
OO第四单元--基于UML的UML解析器总结&OO课程总结 前言:一学期愉快(痛苦)的OO课程学习结束了,OO几个单元作业都各有特色,实验也各有特色,仔细回味起来,不再是单纯的敲代码(但自己还 ...
- NumPy之:标量scalars
目录 简介 scalar类型的层次结构 内置Scalar类型 boolean Integers Unsigned integers Floating-point numbers Complex flo ...
- 计算机网络——RIP协议:距离向量算法
路由信息协议(RIP)是内部网关协议(IGP)中使用最广泛的一种协议,它是一种分布式.基于距离向量的路由选择协议,其特点是协议简单.它要求路由器周期性地向外发送路由刷新报文.路由刷新报文主要内容是由若 ...
- springboot的logback的配置文件
之前敲出来一个 logback 的配置文件,防止以后找起来麻烦在这里存个档 修改了日志输出的内容 设置默认级别为 INFO 正常日志 ( TRACE 到 WARN ) 输出到单独的文件夹 异常日志 ( ...
- IDEA关于-javaagent中文路径导致无法debug的初步解决方案
IDEA明明是装在D盘的纯英文路径,而且java的相关环境变量全部是在英文路径,结果还是因为中文路径的问题导致无法debug.仔细观察,发现这个中文路径是作为java的-javaagent的参数输入的 ...
- 仅用一句SQL更新整张表的涨跌幅、涨跌率
问题场景 各大平台店铺的三项评分(物流.服务.商品)变化情况: 商品每日价格的变化记录: 股票的实时涨跌浮: 复现场景 表:主键ID,商品编号,记录时的时间,记录时的价格,创建时间. 问题:获取每个商 ...