进程互斥(二)Dekker算法

假设P、Q两个进程需要互斥进入某一个临界区。

Dekker算法的基本思想是:首先看P、Q是否有进入临界区的意愿,(1)如果没有进程想进临界区,自然不用做任何事情,(2)如果只有一个进程想进临界区,就让他进入临界区,(3)如果两个进程同时都想进临界区,那么再看轮到谁进临界区了,如果刚好轮到P,P就进入临界区,Q等待,P退出临界区后Q再进入;同样,如果刚好轮到Q,Q就进入临界区,P等待,Q退出临界区后P再进入。

Dekker算法的具体实施方法:

(1)设置两个布尔变量pturn,qturn。pturn为true,表示P想进入临界区,为false,表示P不想进入临界区;qturn为true,表示Q想进入临界区,为false,表示Q不想进入临界区;它们的默认值为false。

(2)设置一个整型变量turn,表示当P、Q同时想进临界区时,该谁进临界区。如果turn等于1,表示轮到P进入临界区;如果turn等于2,表示轮到Q进入临界区。

(3)具体代码(Java实现):

首先由共同变量:

	private boolean pturn = false;
	private boolean qturn = false;
	private int turn = 1;

P进程代码:

		pturn = true;// 表示P想进入临界区
		while (qturn) {// 如果Q也想进入临界区,进入循环
			if (turn == 2) {// 如果轮到Q进临界区
				pturn = false;// P先放弃进入临界区的意愿
				while (turn == 2) {// 等待turn等于1,也就是等待轮到自己

				}
				pturn = true;// P想进入临界区
			}
		}
		// 临界区
		turn = 2;// P离开临界区,轮到Q进入临界区了
		pturn = false;// P不想进入临界区

Q进程代码:

		qturn = true;// 表示Q想进入临界区
		while (pturn) {// 如果P也想进入临界区,进入循环
			if (turn == 1) {// 如果轮到P进临界区
				qturn = false;// Q先放弃进入临界区的意愿
				while (turn == 1) {// 等待turn等于2,也就是等待轮到自己

				}
				qturn = true;// Q想进入临界区
			}
		}
		// 临界区
		turn = 1;// Q离开临界区,轮到P进入临界区了
		qturn = false;// Q不想进入临界区
时间: 2024-10-05 19:29:17

进程互斥(二)Dekker算法的相关文章

进程互斥(三)Peterson算法

相对于Dekker算法(参见进程互斥(二)Dekker算法),Peterson算法简化了进程互斥的实现. 假设有两个进程需要互斥的访问某一个临界区. Peterson算法的形式如下: enterRegion(process);// process表示进程号 // 临界区 leaveRegion(process); 具体实现如下(Java实现): 有两个全局变量: // 用于表示轮到哪个进程 private int turn; // 用于表示进程进入临界区的意愿,下标对应进程号 private b

解决NSDistributedLock进程互斥锁的死锁问题(二)

上一篇文章中介绍了采用了文件记录锁来实现更加安全的多进程互斥,它的平台兼容性也非常好,并且我们也采用它实现了NSDistributedLock的所有的方法.其实在OSX还可以采用文件读写锁来实现更加方便的进程互斥,在fcntl.h中我们可以看到这样的宏定义: 123 #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)#define O_SHLOCK 0x0010 /* open with shared file lock */#d

进程互斥

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

Dekker算法在多核处理器下的失效

Dekker algorithm是一种著名的并发编程的算法,Dekker算法的核心部分是一组对称的代码来访问一组共享变量,使得两个线程不可能同时进入临界区(只要cpu内存模型是遵循顺序一致性的),从而达到线程同步的目的.以下是该算法的一种实现: static volatile int flag1 = 0; static volatile int flag2 = 0; static volatile int turn = 1; static volatile int gSharedCounter

进程互斥与同步

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

开启子进程的两种方式,孤儿进程与僵尸进程,守护进程,互斥锁,IPC机制,生产者与消费者模型

开启子进程的两种方式 # # # 方式一: # from multiprocessing import Process # import time # # def task(x): # print('%s is running' %x) # time.sleep(3) # print('%s is done' %x) # # if __name__ == '__main__': # # Process(target=task,kwargs={'x':'子进程'}) # p=Process(tar

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

进程互斥(一)相关概念

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

垃圾回收GC:.Net自己主动内存管理 上(二)内存算法

垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己主动内存管理 上(三)终结器 前言 .Net下的GC全然攻克了开发人员跟踪内存使用以及控制释放内存的窘态.然而,你或午想要理解GC是怎么工作的.此系列文章中将会解释内存资源是怎么被合理分配及管理的,并包括很具体的内在算法描写叙述.同一时候.还将讨论GC的内存清理流程及什么时清理,怎么样强制清理. 内