Peterson算法
#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算法的更多相关文章
- Peterson算法与Dekker算法解析
进来Bear正在学习巩固并行的基础知识,所以写下这篇基础的有关并行算法的文章. 在讲述两个算法之前,需要明确一些概念性的问题, Race Condition(竞争条件),Situations lik ...
- 进程互斥 Peterson算法
转自http://blog.csdn.net/l294265421/article/details/46674847 假设有两个进程需要互斥的访问某一个临界区. Peterson算法的形式如下: en ...
- 内存栅栏(memory barrier):解救peterson算法的应用陷阱
最近一个项目中用到了peterson算法来做临界区的保护,简简单单的十几行代码,就能实现两个线程对临界区的无锁访问,确实很精炼.但是在这不是来分析peterson算法的,在实际应用中发现peterso ...
- Linux同步互斥(Peterson算法,生产者消费者模型)
同步 两个或两个以上随时间变化的量在变化过程中保持一定的相对关系. 互斥 对一组并发进程,一次只有一个进程能够访问一个给定的资源或执行一个给定的功能. 互斥技术可以用于解决诸如资源争用之类的冲突,还可 ...
- (转)进程同步之临界区域问题及Peterson算法
转自:http://blog.csdn.net/speedme/article/details/17595821 1. 背景 首先,看个例子,进程P1,P2共用一个变量COUNT,初始值为0 ...
- peterson算法(软件互斥 转)
1. 背景 首先,看个例子,进程P1,P2共用一个变量COUNT,初始值为0 因为P1,P ...
- 如何更好理解Peterson算法?
如何更好理解Peterson算法? 1 Peterson算法提出的背景 在我们讲述Peterson算法之间,我们先了解一下Peterson算法提出前的背景(即:在这个算法提出之前,前人们都做了哪些工作 ...
- 进程互斥软件实现之Lamport面包店算法
一. 进程互斥的实现方式 1. 软件方式: 保护临界区, 自己编写代码来实现对进程的控制. Dekker算法Peterson算法Lamport算法等 2. 硬件方式: 使用特殊指令保护临界区. 开关中 ...
- 转载文章——从HelloWorld学习操作系统
转载地址:https://my.oschina.net/hosee/blog/673628?p=%7b%7bcurrentPage+1%7d%7d 本文就将系统性的串联起那些知识点,方便复习和回顾.本 ...
随机推荐
- XML编程知识点总结
DOM和SAX DOM的全称是Document Object Model,也即文档对象模型.基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合,应用程序挣是通过对这个对象模型的操作,来实 ...
- MODBUS-RTU通讯协议简介
MODBUS-RTU通讯协议简介 什么是MODBUS? MODBUS 是MODICON公司最先倡导的一种软的通讯规约,经过大多数公司 的实际应用,逐渐被认可,成为一种标准的通讯规约,只要按照这种规 ...
- Easyui datebox 限制时间选择范围
Require Date: <input class="easyui-datebox" data-options="formatter:myformatter,pa ...
- [Linux编程]__read_mostly变量含义
1.定义 __read_mostly原语将定义的变量为存放在.data.read_mostly段中,原型在include/asm/cache.h 中定义: #define __read_mostly ...
- (链接)打印相关_.NET打印小资料
掌握.NET中的日常打印:包括各个类的参数等 http://blog.csdn.net/dzweather/article/details/10171105 设置纸张大小 PrintDocument ...
- 手机APP测试的几大点
移动互联网App测试点包括: 1.安全测试: 安全测试包括: a.软件是否存在扣费风险,比如发送短信,拨打电话,连接网络等. b.软件是否存在泄漏用户隐私的风险,比如访问手机信息,访问联系人信息等. ...
- backtrack下vim的使用
root@bt:~# vim test.c //vim新建或者编辑test.c,执行后进入vim编辑器,按a键进入编辑状态,输入C代码 #include<stdio.h> void mai ...
- 简单的java socket 示例
一.搭建服务器端 a).创建ServerSocket对象绑定监听端口. b).通过accept()方法监听客户端的请求. c).建立连接后,通过输入输出流读取客户端发送的请求信息. d).通过输出流向 ...
- Fuel快速安装OpenStack
1 介绍 1.1 关于 Mirantis Mirantis,一家很牛逼的openstack服务集成商,他是社区贡献排名前5名中唯一一个靠软件和服务吃饭的公司(其他分别是Red Hat, HP, IBM ...
- 12,SFDC 管理员篇 - 页面配置
1, 添加Tab Setup | Create | Tab 通过Tab我们可以为我们新建的表对象添加访问路径 2,创建自定义按钮 我们想在Account 中添加一个自定义按钮,去链接外部页面,也可 ...