转自:http://blog.csdn.net/speedme/article/details/17595821

  • 1. 背景
  • 首先,看个例子,进程P1,P2共用一个变量COUNT,初始值为0
                                        
 
     因为P1,P2两个进程的执行顺序是随机的,可能顺序执行也可能是并发的,由图可见,不同的执行顺序,COUNT的值会不同,这是不允许的。
     像这种情况,及多个进程并发访问和操作同一数据且执行结果与访问发生的特定顺序有关,称为竞争条件。
 
  • 2.临界区域问题
     为了避免上述情况的发生于是就引入了临界区概念。一个系统有n个进程,每个进程有一个代码段称为临界区。这种系统重要特征是当一个进程在临界区内执行,没有其他进程被允许在临界区内执行。
     临界区问题必须满足三项原则:互斥,前进,有限等待。解释如下:
                 
  • 3.Peterson算法
     了解了临界区之后,那么如何控制两个进程访问一个共享的单位用户资源而不发生访问冲突。Peterson算法是一个实现互斥所的并发程序设计算法,它很好地解决了这个问题。
     先看看两个非该算法的程序
                                          
     仔细分析上面两段代码可以知道当多进程执行代码时他们都违反了Progress原则(临界区三原则)。
     
     Peterson算法代码如下:很好地满足了临界区三原则。
     利用了中间值turn,避开了。
 
                          pi进程                                              pj进程(交换i、j位置即可)       
               
 
         伪代码
                    
 
     java代码实现
public class Peterson implements Runnable {

    private static boolean[] in = { false, false };
private static volatile int turn = -1; public static void main(String[] args) {
new Thread(new Peterson(0), "Thread - 0").start();
new Thread(new Peterson(1), "Thread - 1").start();
} private final int id; public Peterson(int i) {
id = i;
} private int other() {
return id == 0 ? 1 : 0;
} @Override
public void run() {
in[id] = true;
turn = other();
while (in[other()] && turn == other()) {
System.out.println("[" + id + "] - Waiting...");
}
System.out.println("[" + id + "] - Working ("
+ ((!in[other()]) ? "other done" : "my turn") + ")");
in[id] = false;
}}
     如果想更深入了解Peterson算法可以参观下下面网址:
       

4.临界资源

上面讲到了临界区,那么就有必要提到临界资源了。虽然在多道程序系统中的诸进程可以共享各类资源,然而临界资源却是一次只能供一个进程使用,使用完后归还系统,才能给其他进程使用。(例如上面例子中的COUNT是临界资源)
进程对临界资源必须互斥使用,为实现临界资源的互斥访问,应该保证诸进程互斥地进入自己的临界区。为此每个进程在进入其临界区前,必须先申请,经过允许后方能进入。
 
同步机制应该遵循的准则:
 
空闲让进
当无进程处于临界区内时,必须让一个要求进入临界区的进程立即进入,以有
效地利用临界资源。
忙则等待
当已有进程处于临界区内时,其它试图进入临界区的进程必须等待,以保证它
们互斥地进入临界区。
有限等待
对要求进入临界区的进程,应在有限时间内使之进入,以免陷入“死等”。
让权等待
对于等待进入临界区的进程而言,它必须立即释放处理机,以免进程“忙等
解决互斥的锁机制:
实现互斥的一种软件方法是采用锁机制,即提供一对上锁和开锁原语,以及一个所变量W
进入临界区前,通过所变量来判断临界资源是否被占用。
 
但是锁机制仅能表示“开”与“关”两个状态;开、关原语必须作为原子操作来进行;关锁原复测试W状态,浪费了处理机的时间;锁机制只能解决互斥,不能用于同步。信号同步机制很好地解决了这个问题,下篇博客(进程同步之信号量机制(pv操作)及三个经典同步问题)将为你详细解读信号量机制。

转载请注明出处:http://blog.csdn.net/speedme

 
0

(转)进程同步之临界区域问题及Peterson算法的更多相关文章

  1. peterson算法(软件互斥 转)

    1. 背景        首先,看个例子,进程P1,P2共用一个变量COUNT,初始值为0                                                 因为P1,P ...

  2. Peterson算法与Dekker算法解析

    进来Bear正在学习巩固并行的基础知识,所以写下这篇基础的有关并行算法的文章. 在讲述两个算法之前,需要明确一些概念性的问题, Race Condition(竞争条件),Situations  lik ...

  3. 进程互斥 Peterson算法

    转自http://blog.csdn.net/l294265421/article/details/46674847 假设有两个进程需要互斥的访问某一个临界区. Peterson算法的形式如下: en ...

  4. 内存栅栏(memory barrier):解救peterson算法的应用陷阱

    最近一个项目中用到了peterson算法来做临界区的保护,简简单单的十几行代码,就能实现两个线程对临界区的无锁访问,确实很精炼.但是在这不是来分析peterson算法的,在实际应用中发现peterso ...

  5. Linux同步互斥(Peterson算法,生产者消费者模型)

    同步 两个或两个以上随时间变化的量在变化过程中保持一定的相对关系. 互斥 对一组并发进程,一次只有一个进程能够访问一个给定的资源或执行一个给定的功能. 互斥技术可以用于解决诸如资源争用之类的冲突,还可 ...

  6. 如何更好理解Peterson算法?

    如何更好理解Peterson算法? 1 Peterson算法提出的背景 在我们讲述Peterson算法之间,我们先了解一下Peterson算法提出前的背景(即:在这个算法提出之前,前人们都做了哪些工作 ...

  7. Peterson算法

    #define FALSE 0 #define TRUE 1 #define N 2 /*进程数量 */ int turn; /* 现在轮到谁 */ int interested[N]; /*所有值初 ...

  8. 【转】进程同步之信号量机制(pv操作)及三个经典同步问题

    原文地址:http://blog.csdn.net/speedme/article/details/17597373 上篇博客中(进程同步之临界区域问题及Peterson算法),我们对临界区,临界资源 ...

  9. [No00003C]操作系统Operating Systems进程同步与信号量Processes Synchronization and Semaphore

    操作系统Operating Systems进程同步与信号量Processes Synchronization and Semaphore 进程合作:多进程共同完成一个任务 从纸上到实际:生产者− − ...

随机推荐

  1. The Ether 靶场

    0x01 首先对靶场进行端口扫描 发现只开启了80端口和22端口 0x02 目录扫描 访问了几个目录并没有什么发现 0x03 访问主页几个网站链接 发现了一个疑似文件包含的漏洞 0x04 抓包进行分析 ...

  2. 剑指offer-面试题62-圆圈中最后剩下的数字-约瑟夫环-解法2

    /* 题目: 约瑟夫环问题. 思路: 数学规律 f(n)=0(n=1),[f(n-1,m)+m]%n(n>1) */ #include<iostream> #include<l ...

  3. #6041. 「雅礼集训 2017 Day7」事情的相似度 [set启发式合并+树状数组扫描线]

    SAM 两个前缀的最长后缀等价于两个点的 \(len_{lca}\) , 题目转化为求 \(l \leq x , y \leq r\) , \(max\{len_{lca(x,y)}\}\) // p ...

  4. CF1311E Construct the Binary Tree

    膜这场比赛的 \(rk1\) \(\color{black}A\color{red}{lex\_Wei}\) 这题应该是这场比赛最难的题了 容易发现,二叉树的下一层不会超过这一层的 \(2\) 倍,所 ...

  5. bzoj3162独钓寒江雪

    题意 \(n\)阶树,求本质不同的独立集个数 做法 重新编号后重心是不变的,如果有两个重心,可以加个虚点 用树哈希判子树有多少个相同的子树,设某种有\(k\)个,如果原本方案数为\(x\)个 则方案数 ...

  6. python3练习100题——002

    因为特殊原因,昨天没有做题.今天继续- 原题链接:http://www.runoob.com/python/python-exercise-example2.html 题目: 企业发放的奖金根据利润提 ...

  7. HTML概念、语法及常用基础标签

    HTML基础语法 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  8. 剑指offer-面试题39-数组中出现次数超过一半的数字-快速排序

    /* 题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输 ...

  9. SP11470 TTM - To the moon[主席树标记永久化]

    SP11470 TTM - To the moon C l r d:区间 \([L,R]\) 中的数都加 d ,同时当前的时间戳加 1. Q l r:查询当前时间戳区间 \([L,R]\) 中所有数的 ...

  10. js模拟form提交 导出数据

    //创建模拟提交formfunction dataExport(option) { var form = $("<form method='get'></form>& ...