여러 프로세스가 한정된 자원을 가지고 공동 작업을 하면 여러 문제가 발생할 수 있습니다.
공유 자원의 접근
공유 자원은 여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일 등을 말한다. 공유 자원은 공동으로 이용되기 때문에 racing condition이 발생할 수 있다. 이런 racing condition이 발생할 수 있는 프로그램의 영역을 임계구역(critical section)이라 한다. 임계구역에서는 프로세스들이 동시에 작업하면 안 된다.
생산자-소비자 문제(producer-consumer problem)
생산자-소비자 문제에서 생산자 프로세스와 소비자 프로세스는 서로 독립적으로 작업한다. 생산자는 데이터를 생산해 버퍼에 넣는다. 소비자는 버퍼에스 데이터를 사용한다. 버퍼를 계속 사용하기 위해 원형 버퍼(circular buffer)를 사용한다. 버퍼가 가득 찼는지를 확인하기 위해 sum이라는 전역 변수를 사용한다. sum에는 현재 버퍼가 얼마나 차있는지가 기록돼 있다. 이 과정을 sudo code로 간단히 표현하면 다음과 같다.
1
2
3
4
5
6
7
8
9
|
producer() {
input(buf);
sum += 1;
}
consumer() {
output(buf);
sum -= 1;
}
|
cs |
위 코드는 생성자 코드와 소비자 코드가 동시에 실행될 때 다음과 같은 문제가 발생한다.
- 생산자가 데이터 하나를 buf 4에 저장했다. sum(현재 sum은 3)을 바꿔야 하지만 바꾸지 못했다.
- 소비자가 데이터 하나를 소비했다. sum을 2로 바꿔야 하나 바꾸지 못했다.
- 이 상태에서 "sum += 1"과 "sum -= 1"이 거의 동시에 실행되면 실행 순서에 따라 sum 값이 달라진다. 생산자와 소비자는 서로 독립적이라 상대방이 sum을 바꾸는 것을 모른다.
- "sum += 1" -> "sum -=1" 순서로 진행하면 sum = 2가 된다, 반대로 진행하면 sum = 4가 된다.
임계구역 해결 조건
임계구역 문제를 해결하기 위해선 다음 세 가지 조건을 만족해야 한다.
상호 배제(mutual exclusion)
한 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역에 들어갈 수 없다.
한정 대기(bounded waiting)
어떤 프로세스도 무한 대기(inifite postpone) 하지 않아야 한다. 즉, 특정 프로세스가 임계구역에 진입하지 못하면 안 된다.
진행의 융통성(progress flexibility)
한 프로세스가 다른 프로세스의 진행을 방해해선 안된다.
출처 - 쉽게 배우는 운영체제