// Process i
do {
	flag[i] = true:
	turn = j;
	while(flag[j] && turn == j);
		// critical section
	flag[i] = false;
		// remainder section
} while(true);
// Process j
do {
	flag[j] = true:
	turn = i;
	while(flag[i] && turn == i);
		// critical section
	flag[j] = false;
		// remainder section
} while(true);

다음은 프로세스 i와 j 2개가 임계구역에 들어가는 과정이다.

  1. Process i에서 turn == j 부분이 False가 되어 임계구역에 진입한다.
  2. 임계구역에서 수행 후 flag[i] = False로 바꾸어 프로세스 j가 while문을 빠져나와 임계구역에 들어갈 수 있도록 해준다. → Progress 만족
  3. 프로세스 j가 임계구역에 진입하여 작업을 수행한다.
  4. 각 프로세스는 처음에 turn을 상대 프로세스의 값으로 바꿔준 후 유지하도록 하여 Bounded waiting을 만족한다.

→ 현대 컴퓨터 구조는 기계어를 수행하기에 올바르게 수행된다는 보장은 없다.

Critical section problem은 공유 자원이 변경되는 동안 interrupt를 발생하지 않도록 하면 해결된다고 생각할 수 있지만, Multiprocessing 환경에서는 불가능하다는 것을 알 수 있다.

이런 환경에서 interrupt를 발생시키지 않으면 메시지가 모든 처리기에 전달되어야 하고 이는 상당한 시간을 소비하고 시스템 효율을 떨어뜨린다. → 현대 기계들은 인터럽트 되지 않는 특별한 Hardware 명령어를 제공하여 이를 간단히 해결한다.

Synchronization Hardware

원자적으로(atomic) 즉, 인터럽트되지 않는 명령어를 사용한다.

하지만 위 명령어 모두 Bounded waiting을 아직 만족하지 못한다. 한 프로세스가 lock의 값을 바꾸자마자 다시 진입이 가능하기 때문이다.