Mutual Exclusion

상호 배제(Mutual Exclusion): 여러 프로세스나 스레드가 공유 자원에 동시에 접근하지 못하도록 제한하는 동기화 기법.

Mutual Exclusion 기법

Mutual Exclusion은 여러 실행 흐름이 같은 공유 자원에 접근할 때 한번에 하나의 실행 흐름만 해당 자원을 사용할 수 있도록 보장해주는 기법이다.

여러 스레드가 동시에 같은 변수, 파일, 메모리 영역, 커널 객체 등에 접근하면 실행 순서에 따라 결과가 달라질 수 있다.

이러한 문제를 Race Condition이라고 한다.

Mutual Exclusion은 Race Condition을 막기 위해 공유 자원에 접근하는 코드 영역을 보호한다.

이때 공유 자원에 접근하는 코드 영역을 Critical Section이라고 한다.

counter++;

위의 C언어 코드는 counter 값을 1 증가시키는 코드이다.

하지만 실제로는 하나의 동작이 아니라 여러 단계로 처리된다.

mov eax, DWORD PTR [counter]
add eax, 1
mov DWORD PTR [counter], eax

즉, counter 값을 메모리에서 읽고, 1을 더하고, 다시 메모리에 저장한다.

만약 두 개의 스레드가 동시에 이 코드를 실행하면 문제가 발생할 수 있다.

순서 Thread 1 Thread 2 counter

1counter 읽기0
2counter 읽기0
31 더하기0
41 더하기0
5counter 저장1
6counter 저장1

두 스레드가 각각 counter를 1씩 증가시켰기 때문에 결과는 2가 되어야 한다.

하지만 두 스레드가 모두 같은 값인 0을 읽고, 각각 1을 저장했기 때문에 결과는 1이 될 수 있다.

즉, 공유 자원에 동시에 접근하면 의도한 결과가 나오지 않을 수 있다.

Mutual Exclusion은 이러한 상황을 막기 위해 Critical Section에 동시에 하나의 실행 흐름만 들어갈 수 있도록 한다.