进程互斥(三)Peterson算法

相对于Dekker算法(参见进程互斥(二)Dekker算法),Peterson算法简化了进程互斥的实现。

假设有两个进程需要互斥的访问某一个临界区。

Peterson算法的形式如下:

		enterRegion(process);// process表示进程号
		// 临界区
		leaveRegion(process);

具体实现如下(Java实现):

有两个全局变量:

	// 用于表示轮到哪个进程
	private int turn;
	// 用于表示进程进入临界区的意愿,下标对应进程号
	private boolean[] interested = new boolean[] {false, false};

enterRegion方法实现如下:

        /**
	 * @param process 进程号
	 */
	public void enterRegion(int process) {
		// 另一个进程的进程号
		int other = 1 - process;

		// 进程process想进入临界区
		interested[process] = true;

		// 设置轮到自己进入临界区了
		turn = process;

		/**
		 * 当两个进程同时想进入临界区时,它们的interested[process]都
		 * 为true,但后一个进程设置的turn值会覆盖前一个进程设置的turn值,
		 * 这样后一个进程的turn == process条件为真,它会在该while循环
		 * 中持续等待,而前一个进程的turn == process条件为假,能顺利进入
		 * 临界区;等前一个进程离开临界区后,后一个进程也能进入临界区
		 */
		while (turn == process && interested[other] == true) {

		}
	}

leaveRegion方法实现如下:

	public void leaveRegion(int process) {
		interested[process] = false;
	}
时间: 2024-10-28 22:02:37

进程互斥(三)Peterson算法的相关文章

模拟操作系统中进程的三种基础状态与内存的分配和回收(最佳适配算法)

利用键盘模拟进程的三种操作状态,并且使用C++中的list模板模拟内存的分配和回收. 能够模拟进程的创建与撤销过程 l可对进程的状态进行全面的控制 按先进先出方式管理就绪和阻塞队列,能够按队列形式输出进程状 用PCB代表进程,用全局变量表示进程的个数. 1 #include <iostream> 2 #include <list> 3 #include <numeric> 4 #include <algorithm> 5 #include<stdlib

进程互斥

一 基本概念: 1 临界资源(critical resource): 系统中的某些资源一次只允许一个进程使用. 2 临界区(critical section): 各个进程中对某些临界资源进行操作的程序片段. 3 临界区的使用原则: 1)   无进程在临界区,进程可进入 2)   不允许两个进程同时处于临界区 3)   临界区外进程不可阻塞其他进程进入临界区 4)   进程不可无限期处于临界区 二 进程互斥的解决方案 进程互斥的解决方案可划分为软件解决方案和硬件解决方案.软件解决方案主要包括:De

《操作系统、预防进程死锁的银行家算法》

预防进程死锁的银行家算法 原文:https://blog.csdn.net/houchaoqun_xmu/article/details/55540792 一.概念介绍和案例解析 银行家算法中的数据结构 可利用资源向量Available:   这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变.如果Available[j]=K,则表示系统中现有Rj类资源K个. 最大需求矩阵Max:   

Python并发编程03/僵尸孤儿进程,互斥锁,进程之间的通信

目录 Python并发编程03/僵尸孤儿进程,互斥锁,进程之间的通信 1.昨日回顾 2.僵尸进程和孤儿进程 2.1僵尸进程 2.2孤儿进程 2.3僵尸进程如何解决? 3.互斥锁,锁 3.1互斥锁的应用 3.2Lock与join的区别 4.进程之间的通信 进程在内存级别是隔离的 4.1基于文件通信 (抢票系统) 4.2基于队列通信 Python并发编程03/僵尸孤儿进程,互斥锁,进程之间的通信 1.昨日回顾 1.创建进程的两种方式: 函数, 类. 2.pid: os.getpid() os.get

缓存算法(FIFO 、LRU、LFU三种算法的区别)

缓存算法(FIFO .LRU.LFU三种算法的区别) FIFO算法# FIFO 算法是一种比较容易实现的算法.它的思想是先进先出(FIFO,队列),这是最简单.最公平的一种思想,即如果一个数据是最先进入的,那么可以认为在将来它被访问的可能性很小.空间满的时候,最先进入的数据会被最早置换(淘汰)掉. FIFO 算法的描述:设计一种缓存结构,该结构在构造时确定大小,假设大小为 K,并有两个功能: set(key,value):将记录(key,value)插入该结构.当缓存满时,将最先进入缓存的数据置

最近公共祖先(三种算法)

最近研究了一下最近公共祖先算法,根据效率和实现方式不同可以分为基本算法.在线算法和离线算法.下面将结合hihocoder上的题目分别讲解这三种算法. 1.基本算法 对于最近公共祖先问题,最容易想到的算法就是从根开始遍历到两个查询的节点,然后记录下这两条路径,两条路径中距离根节点最远的节点就是所要求的公共祖先. 题目参见 #1062 : 最近公共祖先·一 附上AC代码,由于记录的方式采取的是儿子对应父亲,所以实现的时候有点小技巧,就是对第一个节点的路径进行标记,查找第二个节点的路径时一旦发现访问到

进程互斥(一)相关概念

1.进程互斥 由于各个进程需要使用共享资源(变量,文件等),而这些资源需要排它性使用,各个进程之间竞争使用这些资源,这一关系称为进程互斥. 2.临界资源(也称互斥资源.共享变量) 系统中一次只允许一个进程使用的资源. 3.临界区(也称互斥区) 各个进程中对某个临界资源实施操作的程序片段. 临界区的使用原则: (本文内容整理自coursera上陈向群讲的操作系统原理课程)

进程互斥与同步

一.进程互斥 首先我们要知道,为了保证程序执行最终结果的正确性,必须对并发执行的各进程进行制约,以控制它们的执行速度和对资源的竞争.需要回到一个问题,需要对程序哪些部分进行制约才能保证其执行结果的正确性?如:进程PA 和PB共享内存 MS,进程PA 和PB 各执行两条语句时,可能按以下顺序执行:当进程PA执行完第一条语句,开始执行进程PB,再接着执行进程PA 的第二条语句.这样会导致错误.如何保证正确性了?我们可以将各自的两条语句抽象为两个各以一个动作完成的顺序执行单位,这样执行结果的正确性就可

Opencv——彩色图像灰度化的三种算法

为了加快处理速度在图像处理算法中,往往需要把彩色图像转换为灰度图像.24为彩色图像每个像素用3个字节表示,每个字节对应着RGB分量的亮度. 当RGB分量值不同时,表现为彩色图像:当RGB分量相同时,变现为灰度图像: 一般来说,转换公式有3中. (1)Gray(i,j)=[R(i,j)+G(i,j)+B(i,j)]/3; (2)Gray(i,j)=0.299*R(i,j)+0.587*G(i,j)+0.144*B(i,j); (3)Gray(i,j)=G(i,j);//从2可以看出G的分量比较大所