본문 바로가기

카테고리 없음

[OS] 병행 프로세스2_방통대 교재 정리

728x90

#####. 병행프로세스2

###. 생산자-소비자 문제 정의

#. 생산자 - 소비자 문제는 두 협력 프로세스 사이에 버퍼를 두고, 한쪽 프로세스는 데이터를 넣고(생산자) 다른 쪽 프로세스는 데이터를 꺼내는(소비자) 상황을 다루는 문제이다.

#. 생산자-소비자 문제의 구체적인 조건으로 두 가지가 있다.

#. 버퍼에 여러 프로세스가 동시에 접근할 수 없다.

#. 버퍼의 크기가 유한하다는 것

#.  두번째 조건 때문에 생산자-소비자 문제를 유한 버퍼(bounded buffer) 문제라고도 한다.

#. 첫번째 조건은 생산자-소비자 문제를 해결하기 위해 상호배제가 필요하다.

#. 생산자가 버퍼에 데이터를 넣는 동안에는 소비자가 버퍼에서 데이터를 꺼낼 수 없고, 반대로 소비자가 버퍼에서 데이터를 꺼내는 동안에는 생산자가 버퍼데이터를 넣을 수 없다.

#. 두번째 조건은 생산자 - 소비자 문제를 해결하기 위해 동기화가 필요하다는 것

#. 버퍼의 크기가 유한함으로 버퍼가 가득 찬 경우가 발생할 수 있는데, 이 경우 생산자는 소비자가 버퍼에서 데이터를 꺼낼 떄까지 기다려야 한다. 반면 버퍼가 빈 경우 소비자는 생산자가 버퍼에 데이터를 넣을떄까지 기다려야 한다.

 

###. 세마포어를 이용한 해결

#. 생산자-소비자 문제는 세마포어를 이용하여 해결이 가능하다.

#. 3개의 세마포어 mutex, empty, full을 이용

#. 세마포어의 mutex 의 초깃값은 1, empty의 초깃값은 버퍼의 크기 n, full의 초깃값은 0으로 둔다.

#. 먼저, 상호배제를 위해 세마포어 mutex를 이용

#. 생산자가 버퍼에 데이터를 넣ㅇ는 부분고 ㅏ소비자가 버퍼에서 데이터를 꺼내는 부분은 동시에 수행될 수 없으므로 임계영역이 되며, 따라서 임계영역 앞에 P(mutex)를 두고 임계영역 뒤에 V(mutex)를 두어 상호배제를 해결한다.

#. 다음으로 버퍼가 가득 찬 경우 동기화를 위해 세마포어 empty를 이요한다. empty는 버퍼에 존재하는 빈 공간의 개수로 초깃값은 n이고 버퍼가 가득찬 경우는 0이된다. 세마포어 empty가 0인 상황에서는 생산자는 데이터를 생산하더라도 소비자가 버퍼에서 데이터를 꺼낸 후에야 버퍼에 데이터를 넣을 수 있따. 따라서 생산자는 버퍼에 디이터를 넣는 코드앞에 P(empty) 를 두고 소비자는 버퍼에서 데이터를 꺼내는 코드 뒤에 V(empty)를 두어 버퍼가 다특찬 경우 동기화를 해결한다.

#.  버퍼가 가득찬 경우는 동기화를 위해 세마포어 full을 이용한다.

 

###. 판독기-기록기 문제

#. 판독기- 기록기는 여러 협력 프로세스가 파일 같은 공유자원을 사이에 두고 데이터를 쓰거나(기록기) 데이터를 읽는(판독기) 상황을 다루는 문제이다.

#. 판독기-기록기 문제의 구체적인 조건으로 첫번쨰는 하나의 기록기가 공유자원에 데이터를 쓰는 중에는 다른 기록기나 판독기는 공유자원에 접근할 수 없다는 것이고 두번쨰는 여러 판독기는 동시에 공유자원에서 데이터를 읽을 수 있다는 것이다. 물론 판독기가 데이터를 읽는 중에 기록기는 공유자원에 접근할 수 없다.

#. 첫번째 조건은 판독기 - 기록기 문제를 해결하기 위해 상호배제가 필요하다.

#. 길록기가 공유자원에 데이터를 쓰는 동안에는 누구도 공유자원에 접근할 수 없고, 판독기가 공유자원에서 데이터를 읽는 동안에는 기록기는 공유자원에 접근할 수 없다.

#. 그런데 두번쨰 조건에 의해 판독기가 공유자원에서 데이터를 읽는 동안 다른 판독기는 공유자원에 접근 가능하기에 추가적인 고려사항이 발생한다. 만약 판도기각 공유자원의 데이터를 읽는 중이어서 기록기가 공유자원에 접근하지 못하고 대기하고 있는데 새로운 판독기가 ㄷ공유자원에 접근하려 한다면, 두번째 조건에 의해 새로운 판독기는 바로 접근해야 할까 아니면 이미 대기하고 있는 기록기가 있으므로 나중에 온 새로운 판독기는 대기해야 할까? 그래서 다음과 같이 두가지 형태로 문제를 정의할 수 있다.

 

#. 제1판독기 - 기록기 문제

#. 제1판독기-기록기 문제는 판독기가 공유자원에 접근 중이라면 기록기보다 판독기에 우선순위를 주는 것이다. 즉 대기중인 기록기가 있든 없든 상관없이 새로운 판독기는 즉기 공유자원에 접근할 수 있다.

#. 이는 판독기- 기록기 문제의 두번쨰 조건을 충힐히 따르는 것이지만 기록기가 기아상태에 빠질수 있다는 단점이 있다. 기아상태(starvation)는 프로세스가 필요한 자원을 할당받지 못하고 계속적으로 대기하게 되는 상황으로 판독기가 공유자원에 접근 중인 상태에서 새로운 판독기가 지속적으로 등장하면서 기록기는 언제까지고 대기할 수 밖에 없다.

 

#. 제2판독기 - 기록문제

#. 판독기가 공유자원에 접근 중이라면 판독기보다 기록기에 우선수위를 주는 것이다. 즉 대기 중인 기록기가 있다면 새로운 판독기는 두번쨰 조건에도 불구하고 공유자원에 접근할 수없다. 이는 기록기가 기아상태에 빠지는 것은 방지하지만 판독기의 병생성이떨어진다. 또한 기록기에 순선위를 주는 방식에 따라 판독기가 기아상태에 빠질 수도 있다.

 

#. 세마포어를 이용한 해결

#. 제1판독기-기록기 문제는 세마포어를 이용해 해결이 가능하다. 2개의 세마포어 wrt와 mutex를 이용. 이떄 사마포어 wrt와 mutex의 초깃값은 모두 1로 둔다. 그리고 일반 변수 rcount의 초깃값은 0이다

#. 먼저 기록기에 대한 상호배제를 위해 세마포어 wrt를 이용한다. 기록기가 공유자원에 데이터를 쓰는 부분은 다른 기록기가 쓰거나 판독기가 익는 부분과 동시에 수행될 수 없으므로 임계영역이 되고 따라서 임계영역 앞에 P(wrt)를 두고 임계영역 뒤에 V(wrt)를 두어 상호배제를 해결한다.

#. 다음으로 판독기가 공유자원에서 데이터를 읽는 부분은 기록기가 쓰는 부분과 동시에 수행될 수 없으므로 역시 임계역영이 되고 기록기처럼 P(wrt)와 V(wrt)앞에 둔다.

#. 그런데 여러 판독기는 동시에 공유자원에서 데이터를 읽을 수 있으므로 하나의 판독기가 임계영역을 수행 중일 떄 다른 판독기도 임계영역 수행을 시작 할 수 있어야 한다. 이를 위해 일반 변수 rcount를 두어 동시에 공유자원의 데이터를 읽는 판독기의 개수를 유지하고, rcount가 1보다 크면 공유자원을 읽고있는 다른 판독기가 이미 읽고있는 의미로 상호배제가 되지 않도록 P(wrt) 를 수행하지 않고 바로 임계 영역 수행을 시작한다. 마찬가지로 임계영역수행이 끝나 rcount를 1만ㅁ 줄였을 떄 여전히 0보다 크다면 공유자원을 읽고있는 다른 판독기가 아직 있다는 의미로 V(wrt)를 수행하지 않도록 한다. 

#. 이때 변수 rcount를 변화시키고 확인하는 작업은 다른 판독기에 의해 방해받지 않고 한번에 처리되어야 하므로 역시 임계영역으로 보고 세마포터 mutex를 이용하여 상호보제가 되도록 한다. 더불어 기록기가 임계영역 을 수행 중이어서 P(wrt)로 대기중이 ㄴ판독기가 있을 떄 추가적인 판독기들은 P(mutex)에 의해 대기 가능하다.

 

#.제2판독기-기록기 문제 또한 세마포어를 이용하여 해결 가능하다. 세마포어 rd, wrt, mutex, mutex2, mutex3의 초깃값은 모두 1로 둔다. 그리고 일반변수 rcount와 wcount의 초깃값은 0이다. 기록기가 대기 중일 떄 이후에 새로운 판독기가 들어오면 임계영역을 수행하지 못하도록 세마포어 d가 제1판독기 - 기록기 코드에 추가 되었다. 또한 기록기에 우선순위를 주기 위해 세마포어 mutex3도 추가 되었다.

 

 

###. 프로세스 간 통신

#. 프로세스간 통신 IPC의 대표적인 두가지 방법은 공유 메모리를 이용하는 방법과 메시지를 이용하는 방법이다. 참고로 이 두가지 방법은 하나의 운영체제에서 함께 사용될 수 있다

 

#. 공유 메모리 방법

#. 공유 메모리 방법은 협력 프로세스가 동일한 변수를 사용함으로써 데이터를 서로에게 공유하는 방법이다. 생산자-소비자와 같은 방식이다.

 

#. 메시지 전달 방법

#. 협력 프로세스가 메세지를 주고 받으면서 데이터를 서로 공유하는 방법이다. 매번 시스템 호출을 통해야 하므로 대량의 데이터보다는 소량의 데이터를 주고 받는데 적합하다.

728x90