转自: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. Spring Boot 配置拦截器方式

    其实spring boot拦截器的配置方式和springMVC差不多,只有一些小的改变需要注意下就ok了.下面主要介绍两种常用的拦截器: 一.基于URL实现的拦截器: public class Log ...

  2. 重启防火墙(iptables)命令#service iptable restart失效

    Redirecting to /bin/systemctl restart iptables.ser linux下执行防火墙相关指令报错: Redirecting to /bin/systemctl ...

  3. python—lambda函数,三个常用的高阶函数

    """lambda 参数列表 : 返回值lambda 参数形式: 1.无参数:lambda:100 2.一个参数:lambda a: a 3.默认参数:lambda a, ...

  4. Django---Django连接Mysql数据库

    前面介绍了Django平台的数据交互,这些数据都是在本地存放着,修改内容或者重新启动服务,数据就消失了,如果我们把数据存放在数据库中,不就保存了吗? Django数据库 Django中自带的也有数据库 ...

  5. Node.js核心模块-http

    通过node中的http模块可以创建编写服务器 引入 const http = require('http') http举例使用: const http = require('http') //引入 ...

  6. windows 停止和启动Redis

    点击win+R   输入cmd 打开cmd窗口 然后输入命令 net stop redis    停止redis net start redis     启动redis

  7. python三级菜单制作 day4

    需求:可依次选择进入各子菜单可从任意一层往回退到上一层可从任意一层退出程序所需新知识点:列表.字典 数据结构: menu = {    '北京':{        '海淀':{            ...

  8. Spring学习笔记-面向切面(AOP)-04

    什么是面向切面编程 先大概了解一下部分术语 横切关注点:软件开发中,散布于多出的功能称为横切关注点(cross-cutting concern),简单的可以描述为可以影响应用多处的功能,比如日志.安全 ...

  9. Python循环引用的解决方案

    1.延迟导入:即将 from xxx import yyy 放到函数或类的内部,从而使其作用域变成局部的,但是这样可能会对性能有些影响: 2.将 from xxx import yyy 转换成 imp ...

  10. Spark学习之路 (五)Spark伪分布式安装[转]

    JDK的安装 JDK使用root用户安装 上传安装包并解压 [root@hadoop1 soft]# tar -zxvf jdk-8u73-linux-x64.tar.gz -C /usr/local ...