티스토리 뷰

생산자가 유한한 용량을 가진 버퍼에 아이템을 생산해서 가져다 놓고 소비자는 그 아이템을 소비한다고 가정하자.


1. 소비자가 if(count==0)을 실행하자마자 스케쥴링이 일어나서 생산자가 cpu사용권을 획득했다.

2.생산자는 아이템을 생산하고 공유변수인 count를1증가시킨후에 자고 있지도 않은 소비자를 깨운다.

3. 아무일도 일어나지 않은 상태로 다시 스케쥴링이 일어나서 소비자가 sleep()을 실행해서 잠에 든다.

4. 그리고 다시 스케쥴링이 일어나서 생산자 프로세스가 실행되면 생산자는 count값이 2부터 시작해서 계속 증가하게 된다.

5. 생산자는 버퍼가 꽉찰때까지 (N이 100이 될때까지) 계속 생산하다가 count == N을 만족해서 잠이든다.

6. 결국에는 생산자 소비자가 둘다 잠에 든다는 문제가 발생한다.


공유변수에 두개 이상의 프로세스가 동시에 참여해서 공유변수의 값이 꼬이게 되는 문제를 race condition(경쟁 상태)라고 하는데,

이 생산자 소비자 문제가 바로 그 문제를 보여 주고 있다.


소비자는 count == 0 이라는 비교문에서 공유변수에 접근하고 있다.

생산자는 소비자가 공유변수에 접근하고 있을때 마찬가지로 count를 N과 비교하거나 count의 값을 1 증가시키는 연산을 하게 된다.


이렇게 2개 이상의 프로세스가 공유변수에 동시에 접근하는 일 (race condition)이 발생 했기 때문에 상호배제가 제대로 구현 되지 않은 문제이다.


상호배제의 조건에는

임계구역에(공유변수에 접근하는 코드의 일부분)는 항상 한 프로세스만 들어갈 수 있으며,

어떤 프로세스가 다른 프로세스의 임계구역 접근을 막아서는 안되고,

또한 어떤 프로세스가 무한히 임계구역의 접근을 기다려서는 안된다.


생산자 소비자 문제이자 유한 버퍼 문제는

이 3가지 조건중 첫번째 조건을 위배하기 때문에 상호배제가 잘 지켜지지 않은 문제라고 할 수 있다.



댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함