배경
- 앞서서 배웠던 것처럼, 프로세스들은 서로 협력할 수 있다.
- 그러나, 만약 프로세스들이 공유 데이터를 동시에 접근하면 데이터의 일관성을 망칠 수 있다.
경쟁 상황
- 동시에 여러 개의 프로세스가 동일한 자료를 접근하여 조작하고, 그 실행 결과가 접근이 발생한 특정 순서에 의존하는 상황
예시 1
3.5절의 프로세스 사이의 메모리 공유를 기억해보자.
이 해법은 BUFFER_SIZE - 1개만 버퍼에 저장할 수 있으므로, 이를 해결하기 위해 알고리즘을 수정해보자.
count라는 변수를 추가, 버퍼에 새 항목이 들어갈 때마다 count++, 꺼낼 때마다 count—
// 생산자 코드
while ()
{
while (count == BUFFER_SIZE)
;
buffer[in] = next_produced;
in = (in + 1) % BUFFER_SIZE;
count++;
}
// 소비자 코드
while ()
{
while (count == 0)
;
next_consumed = buffer[out];
out = (out + 1) % BUFFER_SIZE;
count--;
}
그런데 이 경우 소비자와 생산자가 동시에 돌아가면, count++과 count—가 동시에 실행된다.
이러한 상황이 발생하는 이유는 소비자와 생산자라는 두 프로세스가 공유 데이터에 동시에 접근했기 때문이다.
이러한 상황을 경쟁상황이라고 한다.
멀티코어 시스템, 멀티쓰레드 응용이 활발해지면서 이러한 문제는 더 심해지고 있고, 그래서 이 이슈를 다루는 것은 중요하다.