Skip to content
Surf Wiki
Save to docs
technology/algorithms

From Surf Wiki (app.surf) — the open knowledge base

Eisenberg & McGuire algorithm

Solution to the critical section problem


Solution to the critical section problem

The Eisenberg & McGuire algorithm is an algorithm for solving the critical sections problem, a general version of the dining philosophers problem. It was described in 1972 by Murray A. Eisenberg and Michael R. McGuire.

Algorithm

All the n-processes share the following variables:

enum pstate = {IDLE, WAITING, ACTIVE};
pstate flags[n];
int turn;

The variable turn is set arbitrarily to a number between 0 and n−1 at the start of the algorithm.

The flags variable for each process is set to WAITING whenever it intends to enter the critical section. flags takes either IDLE or WAITING or ACTIVE.

Initially the flags variable for each process is initialized to IDLE.

    repeat {

		/* announce that we need the resource */
		flags[i] := WAITING;

		/* scan processes from the one with the turn up to ourselves. */
		/* repeat if necessary until the scan finds all processes idle */
		index := turn;
		while (index != i) {
			if (flags[index] != IDLE) index := turn;
			else index := (index+1) mod n;
		}

		/* now tentatively claim the resource */
		flags[i] := ACTIVE;

		/* find the first active process besides ourselves, if any */
		index := 0;
		while ((index < n) && ((index = i) || (flags[index] != ACTIVE))) {
			index := index+1;
		}

	   /* if there were no other active processes, AND if we have the turn
	   or else whoever has it is idle, then proceed.  Otherwise, repeat
	   the whole sequence. */
    } until ((index >= n) && ((turn = i) || (flags[turn] = IDLE)));

    /* Start of CRITICAL SECTION */

	/* claim the turn and proceed */
	turn := i;

    /* Critical Section Code of the Process */

    /* End of CRITICAL SECTION */

    /* find a process which is not IDLE */
	/* (if there are no others, we will find ourselves) */
	index := (turn+1) mod n;
	while (flags[index] = IDLE) {
		index := (index+1) mod n;
	}

	/* give the turn to someone that needs it, or keep it */
	turn := index;

	/* we're finished now */
	flags[i] := IDLE;

    /* REMAINDER Section */

References

  • http://portal.acm.org/citation.cfm?id=361895
Info: Wikipedia Source

This article was imported from Wikipedia and is available under the Creative Commons Attribution-ShareAlike 4.0 License. Content has been adapted to SurfDoc format. Original contributors can be found on the article history page.

Want to explore this topic further?

Ask Mako anything about Eisenberg & McGuire algorithm — get instant answers, deeper analysis, and related topics.

Research with Mako

Free with your Surf account

Content sourced from Wikipedia, available under CC BY-SA 4.0.

This content may have been generated or modified by AI. CloudSurf Software LLC is not responsible for the accuracy, completeness, or reliability of AI-generated content. Always verify important information from primary sources.

Report