공유 자원은 여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일 등을 말합니다. 공동으로 사용되기 때문에 언제 데이터를 쓰거나 읽는 것에 따라서 결과 값이 달라질 수 있어 접근 요청한 프로세스들의 순서를 정해 예상하지 못한 결과가 발생하지 않도록 주의해야 합니다.
2개 이상의 프로세스가 공유 자원을 병행적으로 읽거나 쓰는 상황을 Race Condition 이라고 합니다. 경쟁 조건이 발생하면 공유 자원의 접근 순서에 따라 결과가 달라질 수 있습니다.
공유 자원 접근 순서에 따라 실행 결과가 달라지는 프로그램의 영역을 Critical Section이라고 합니다. 임계구역에서는 프로세스들이 동시에 작업을 할 수 없으며 이미 다른 프로세스가 점유하고 있다면 다른 프로세스는 임계구역 밖에서 그 프로세스가 작업을 마치고 나올 때까지 기다려야 합니다.
생산자-소비자 문제에서는 생산자 프로세스와 소비자 프로세스가 서로 독립적으로 작업을 합니다.
producer() {
input(buf);
sum += 1; // (1)
}
consumer() {
output(buf);
sum -= 1; // (2)
}
만약, 생산자와 소비자가 동시에 실행되면 문제가 발생하게 됩니다. 생산자와 소비자가 전역변수인 sum에 접근하는 타이밍을 서로 맞추지 않았기 때문입니다.
이 상태에서 (1) 생산자의 sum += 1과 (2) 소비자의 sum -= 1가 거의 동시에 실행되면 문제가 발생합니다. 생산자와 소비자는 독립적으로 실행되므로 상대방이 sum을 바꾸려는 것을 모르고 현재 상태인 sum = 3을 읽어서 작업을 수행하게 됩니다.
미세한 시간 차로 (1), (2)나 (2), (1) 순서로 실행되면 sum은 2나 4가 되어버립니다.
(1), (2) 순서 | (2), (1) 순서 |
---|---|
(1) 생산자 sum = 4 | (2) 소비자 sum = 2 |
(2) 소비자 sum = 2 | (1) 생산자 sum = 4 |
결과 sum = 2 | 결과 sum = 4 |