转自: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代码实现
  1. public class Peterson implements Runnable {
  2. private static boolean[] in = { false, false };
  3. private static volatile int turn = -1;
  4. public static void main(String[] args) {
  5. new Thread(new Peterson(0), "Thread - 0").start();
  6. new Thread(new Peterson(1), "Thread - 1").start();
  7. }
  8. private final int id;
  9. public Peterson(int i) {
  10. id = i;
  11. }
  12. private int other() {
  13. return id == 0 ? 1 : 0;
  14. }
  15. @Override
  16. public void run() {
  17. in[id] = true;
  18. turn = other();
  19. while (in[other()] && turn == other()) {
  20. System.out.println("[" + id + "] - Waiting...");
  21. }
  22. System.out.println("[" + id + "] - Working ("
  23. + ((!in[other()]) ? "other done" : "my turn") + ")");
  24. in[id] = false;
  25. }}
     如果想更深入了解Peterson算法可以参观下下面网址:
       

4.临界资源

上面讲到了临界区,那么就有必要提到临界资源了。虽然在多道程序系统中的诸进程可以共享各类资源,然而临界资源却是一次只能供一个进程使用,使用完后归还系统,才能给其他进程使用。(例如上面例子中的COUNT是临界资源)
进程对临界资源必须互斥使用,为实现临界资源的互斥访问,应该保证诸进程互斥地进入自己的临界区。为此每个进程在进入其临界区前,必须先申请,经过允许后方能进入。
 
同步机制应该遵循的准则:
 
  1. 空闲让进
当无进程处于临界区内时,必须让一个要求进入临界区的进程立即进入,以有
效地利用临界资源。
  1. 忙则等待
当已有进程处于临界区内时,其它试图进入临界区的进程必须等待,以保证它
们互斥地进入临界区。
  1. 有限等待
对要求进入临界区的进程,应在有限时间内使之进入,以免陷入“死等”。
  1. 让权等待
对于等待进入临界区的进程而言,它必须立即释放处理机,以免进程“忙等
解决互斥的锁机制:
实现互斥的一种软件方法是采用锁机制,即提供一对上锁和开锁原语,以及一个所变量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. MySQL锁与事务隔离级别

    一.概述 1.锁的定义 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除了传统的计算资源(如CPU.RAM.IO等)的争用以外,数据也是一种供需要用户共享的资源.如何保证数据并发访 ...

  2. Bellman-ford算法 无向图

    // 单源最短路问题 // Bellman-Ford算法 // 复杂度O(V*E) //! 可以判断负圈 #include <cstdio> #include <iostream&g ...

  3. pyinstaller打包报错: RecursionError: maximum recursion depth exceeded 已经解决

    看上去似乎是某个库自己递归遍历超过了python的栈高度限制 搜索了一番,很快找到了解决办法: https://stackoverflow.com/questions/38977929/pyinsta ...

  4. 《C++Primer》第五版习题答案--第六章【学习笔记】

    <C++Primer>第五版习题答案--第六章[学习笔记] ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/16 第六章:函数 ...

  5. [Python]scatter_matrix报错 module 'pandas' has no attribute 'scatter_matrix'

    运行pandas.scatter_matrix()散点图函数时报错, 原因是该函数在新版本用法发生了变化: pandas.plotting.scatter_matrix 完整用法:pd.plottin ...

  6. 【笔记】机器学习 - 李宏毅 - 9 - Keras Demo

    3.1 configuration 3.2 寻找最优网络参数 代码示例: # 1.Step 1 model = Sequential() model.add(Dense(input_dim=28*28 ...

  7. 侧信道攻击,从喊666到入门之——Unicorn的环境构建

    作者:backahasten 发表于小米安全中心微信公众号 0x00 前言 Unicorn可以模拟多种指令集的代码,在很多安全研究领域有很强大的作用,但是由于需要从头自己布置栈空间,代码段等虚拟执行环 ...

  8. Net Core使用Lucene.Net和盘古分词器 实现全文检索

    Lucene.net Lucene.net是Lucene的.net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎, ...

  9. LOJ #3119. 「CTS2019 | CTSC2019」随机立方体 组合计数+二项式反演

    好神的一道计数题呀. code: #include <cstdio> #include <algorithm> #include <cstring> #define ...

  10. mybatis及其与hibernate的对比

    1.mybatis是支持普通SQL查询.存储过程.和高级映射的优秀持久层框架 它消除了JDBC代码和参数的手工设置,以及对结果集的检索 2.mybatis使用简单的XML或注解用于配置和原始映射,将接 ...