进程互斥(三)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;
	}


你可能感兴趣的:(java,操作系统,进程互斥,Peterson算法)