컴퓨터(Computer Science)/운영체제(Operation System)

Bounded-Buffer Problem(Producer-Consumer Promlem), 동기화[운영체제]

게임이 더 좋아 2020. 4. 22. 23:40
반응형
728x170

세마포와 모니터의 사전 이해가 필요하다.

[컴퓨터(Computer Science)/운영체제(Operation System)] - 동기화, 세마포 : Synchronization, Semaphores [운영체제]

[컴퓨터(Computer Science)/운영체제(Operation System)] - 동기화, 모니터 : Synchronization, Monitor

 

사실 나는 생산자-소비자 문제로 알고 있었다.

생산자가 데이터를 생산하면 소비자는 그 데이터를 소비하는 형태의 문제이다.

산한 데이터는 중간의 버퍼,buffer 에 저장해두고 소비자는 여기서 필요한 만큼 가져간다.

 

버퍼의 크기는 유한해서

버퍼 공간 크기 이상의 데이터를 저장할 수 없고

소비자는 버퍼가 비어있다면 가져올 수 없다.

 

**유한한 버퍼의 크기를 bounded buffer라고 한다.

 


다시 문제를 설명하겠다.

 

위의 문제에서

Producer도 여러 명이고 Consumer도 여러 명이라고 보면 된다.

생산자는 버퍼에 데이터를 집어넣는 역할을 한다.

Consumer는 버퍼에 있는 데이터를 가져가는 역할을 한다.

 

왜 이것이 동기화 문제가 될까??

첫 번째로 Mutex, Mutual Exclusion

1. 버퍼의 특정 공간에 2명의 생산자가 같이 데이터를 집어넣으려는 경우

2. 버퍼의 특정 공간의 데이터를 2명의 소비자가 데이터를 가져가려는 경우

 

2명이서 동시 접근을 막기 위해

해당 공유 데이터에 lock을 걸어서 꺼내거나 집어넣는 것으로 문제를 해결하고

수행한 후 lock을 풀어서 다시 접근이 가능하도록 한다. 

 

두 번째로 Resource Count

유한한 버퍼의 크기를 가지고 있기 때문에

소비자가 가져가는 것보다 생산자가 집어넣는 것이 많아지면

결국 어느 순간 꽉차서 생산자가 집어넣을 수 없는 상황이 된다.

 

즉, 소비자가 데이터를 가져가서 빈 공간을 만들어줄 때까지 생산자는 집어넣을 수 없게 된다.

세마포의 Resource Count 랑 유사하다.

 

반대의 상황도 마찬가지이다.

생산자가 집어넣는 것보다 소비자가 가져가는 것이 많으면

어느 순간 버퍼가 모두 비어서 소비자가 가져갈 수 없는 상황이 되는 것이다.

 

역시 생산자가 데이터를 집어넣을 때까지 소비자는 가져갈 수 없게 된다.

 

정리하면

생산자의 입장에선 버퍼의 빈 공간이 자원이 되고

소비자의 입장에선 버퍼의 데이터가 들어있는 공간이 자원이 된다.

 


 

이 문제도 세마포로 해결이 가능하다.

lock을 걸고 resource count를 거는 것이 가능하다.

 

세마포 변수를 3개로 둔다.

lock을 걸기 위한 변수는 mutex

비어있는 공간(자원) empty

차있는 공간(자원) full

 

 

처음에는 모두 비어있을테니 초기화할 때 full = 0, empty = n, mutex = 1로 한다.

**mutex가 1인 것은 하나의 프로세스만 접근하기 위한 lock을 의미한다.

 

 

생산자, Producer는

Empty의 자원을 받아서 (빈 공간이 있으면)

mutex를 통해 lock을 걸고

해당 버퍼에 데이터를 집어넣고

mutex를 통해 lock을 풀고

데이터를 집어넣었으니 해당 자원(차있는 공간)을 증가시킨다.

 

소비자, Consumer는

Full의 자원을 받아서 (데이터가 들어있는 공간이 있으면)

mutex를 통해 lock을 걸고

해당 버퍼에 데이터를 가져가고

mutex를 통해 lock을 풀고

데이터를 가져갔으니 해당 자원(빈공간)을 증가시킨다.

 


 

모니터로는 아래와 같이 구현한다.

 

 

 

728x90
반응형
그리드형