转自: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. Android Intent用法总结

    Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 ...

  2. mysql数据库批量执行sql文件对数据库进行操作【windows版本】

    起因: 因工作需要,在本机测试环境升级mysql数据库,需逐条执行mysql数据库的sql文件对数据库进行升级,因此找了些关于mysql的文章,对批量升级数据库所需的sql文件进行升级. 整理思路: ...

  3. Linux 实时查看日志文件动态内容

    tailf 27.log | grep 'Classcomment/praise'               'Classcomment/praise' 接口名:查看请求固定接口的时间,实时 tai ...

  4. 软件模拟spi的注意事项

    前几天遇到了软件模拟spi的时候,读和写不一致的现象,后来仔细研究了一下,其实是时序性问题不对. spi的有四种时序,硬件实现的时候,很简单,初始化后直接调用api即可.但是软件模拟就比较麻烦. 举例 ...

  5. Blazor初体验之寻找存储client-side jwt token的方法

    https://www.cnblogs.com/chen8854/p/securing-your-blazor-apps-authentication-with-clientside-blazor-u ...

  6. Html介绍,了解html代码的注释

    什么是代码注释?在代码编辑器中的注释代码是不会在浏览器窗口展示的!html代码注释的作用是帮助程序员标注代码的用途,过一段时间后再看你之前编写的代码,很快可以想起这个代码的用途.代码注释不仅方便程序员 ...

  7. 一次线上nohup.out日志丢失的问题

    今天有小伙伴求助,线上一个应用的nohup.out日志不更新了,但进程还是正常的.此时需要查看这个日志排查一些问题,这可怎么办呢? nohup.out文件的更新时间停留在了昨天9点36,日志也刚好打到 ...

  8. PMP--1.1 PMBOK体系框架描述

    PMBOK:Project Management Body Of Knowledge(项目管理知识体系) <PMBOK>中收录被普遍认可的良好实践. 普遍认可:在大部分时候适用于大多数项目 ...

  9. vue_day01

    Vue_day01 1. 认识vue 1.1 什么是vue (1)Vue是构建界面的渐进式的js框架 (2)只关注视图层, 采用自底向上增量开发的设计. (3)Vue 的目标是通过尽可能简单的 API ...

  10. opencv —— addWeighted 图像叠加(计算数组加权和)

    计算数组加权和:addWeighted 可实现两个大小.类型均相同的数组(一般为 Mat 类型)按照设定权重叠加在一起. void addWeighted(InputArray src1,double ...