#define FALSE 0
#define TRUE 1
#define N 2              /*进程数量 */ int turn;              /* 现在轮到谁 */
int interested[N];         /*所有值初始化为0 (FALSE) */ void enter_region(int process) /*进程是0还是1 */
{
int other;            /* 其他进程号*/
other = - process;        /*另一方进程*/
interested[process] = TRUE; /* 表明所感兴趣的 */
turn = process;         /* 设置标志 */
while(turn == process && interested[other] == TRUE); /*空语句 */
} void leave_region(int process) /*进程:谁离开*/
{
interested[[process] = FALSE; /* 表示离开临界区*/
}

  现在先来看看该算法是如何工作的:开始,没有任何进程处于临界区中。现在,进程0调用enter_region,设置other为1,turn为0,并标识自己希望进入临界区,如果进程1现在(现在是指进程0调用了enter_region并返回,且在临界区中工作)调用enter_region,进程1将在此处挂起直到interested[0]的值变为FALSE(满足while死循环终止的条件,因为当进程1调用enter_region时,此时interested[other]即interested[0]已经有值TRUE),而interested[0]只有在进程0调用leave_region退出临界区时才发生

   现在再考虑两个进程几乎同时调用enter_region的情况:在一开始的设置(turn)中,他们都将自己的进程号存入,但只有速度慢的那个才有效,前一个因重写而丢失,假设进程1的速度慢,则turn值为1,当两个进程都运行到while时,进程0将循环0次并进入临界区,而进程1则不停循环而不能进入临界区

   关键在于while循环,先进入的进程必能通过死循环,因为interested[other]值为FALSE(程序开始的初始化),而后进入的进程则依赖于先进入的进程。而且如果前一个进程足够快,它可以再次进入临界区工作!!

Peterson算法的更多相关文章

  1. Peterson算法与Dekker算法解析

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

  2. 进程互斥 Peterson算法

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

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

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

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

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

  5. (转)进程同步之临界区域问题及Peterson算法

    转自:http://blog.csdn.net/speedme/article/details/17595821 1. 背景 首先,看个例子,进程P1,P2共用一个变量COUNT,初始值为0     ...

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

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

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

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

  8. 进程互斥软件实现之Lamport面包店算法

    一. 进程互斥的实现方式 1. 软件方式: 保护临界区, 自己编写代码来实现对进程的控制. Dekker算法Peterson算法Lamport算法等 2. 硬件方式: 使用特殊指令保护临界区. 开关中 ...

  9. 转载文章——从HelloWorld学习操作系统

    转载地址:https://my.oschina.net/hosee/blog/673628?p=%7b%7bcurrentPage+1%7d%7d 本文就将系统性的串联起那些知识点,方便复习和回顾.本 ...

随机推荐

  1. 单点登录SSO

    转载自 http://www.blogjava.net/xcp/archive/2010/04/13/318125.html   摘要:单点登录(SSO)的技术被越来越广泛地运用到各个领域的软件系统当 ...

  2. About SOuP

    http://www.soup-dev.com - SOuP的强大我不必多说. - Maya 也可以开发出象houdini这样有趣的节点,这再soup之前是很难想象的.所以说soup的作者Peter的 ...

  3. android-23 View.java - dispatchTouchEvent源码

    public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource { /** * ...

  4. C# 抽象类abstract

    不能初始化的类被叫做抽象类,它们只提供部分实现,但是另一个类可以继承它并且能创建它们的实例,有未被实现的方法.抽象类不可以new对象. "一个包含一个或多个纯虚函数的类叫抽象类,抽象类不能被 ...

  5. ViewPager--左右可滑动的

    Android实现左右滑动指引效果 http://www.cnblogs.com/hanyonglu/archive/2012/04/07/2435589.html; Android实现导航菜单左右滑 ...

  6. Spring MVC实现Junit Case

    Spring MVC中编写单元测试(WEB项目): 1. 首先开发一个基类,用于载入配置文件.以下所有的测试实现类都要继承这个类 package com.yusj.basecase; import o ...

  7. Sql Server 2008和2000查询表的字段和注释

    -- SQL Server 2008 SELECT 表名 = d.name, 表说明 = case when a.colorder=1 then isnull(f.value,'') else '' ...

  8. VMWare虚拟机 使用vmtools拷贝文件 临时文件问题

    Win7下, 临时文件会存放在路径C:\Users\admin\AppData\Local\Temp\vmware-admin\VMwareDnD,如果不及时删除,C盘就会越来越大直至放满.

  9. org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/pcisv7]]

    重新配jar包

  10. 嵌套 QQ、微博 通讯工具到HTML中

    自己QQ.微博的实例: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Defa ...