본문 바로가기
운영체제

운영체제 7장 - 프로세스 관리(4) : 임계구역 문제 및 세마포어 -

by ChocoPeanut 2017. 4. 18.

운영체제 7

프로세스 관리(4) : 임계구역 문제 및 세마포어 -

 

앞장에서 프로세스 동기화가 필요한 이유에 대해서 설명을 하였다. 은행계좌 문제를 통해 공통변수인 은행계좌에 대한 동시 업데이트가 발생하면 문제가 발생할 수 있다. 따라서 우리는 한 번에 한 쓰레드만 업데이트하는 프로세스 동기화가 필요하다. 이러한 문제를 임계구역 문제라고 한다. 여러 개의 쓰레드로 이루어진 시스템에서 각각의 쓰레드는 코드의 영역을 가지고 있는데 이 부분을 임계구역이라고 한다. 임계구역에서는 공통으로 사용하는 데이터를 바꾸거나 테이블을 업데이트하거나 파일을 쓰거나 하는 일을 할 수 있다. 앞의 은행계좌 문제로 설명을 하면 은행계좌에 대한 영역이 바로 임계구역이 되는 것이다. 임계구역을 영어로 하면 Critical section인데 Critical이라는 말이 치명적인이라는 것을 뜻한다. 따라서 임계구역에서 동기화를 진행하지 못하면 치명적인 문제가 발생한다는 것을 의미한다.


임계구역 문제를 해결하기 위해서는 3가지가 만족되어야한다.


3가지에 대한 이해를 위해 은행계좌 문제를 다시 가져와보도록 하자. 은행계좌 문제를 다시 한 번 요약하자면 부모님과 학생이 있는데 부모님은 은행계좌에 입금을 학생은 출금을 하는 형식을 가지고 있다. 부모님과 학생은 각각의 쓰레드를 의미한다. 은행계좌는 앞에서 말했듯 공통적으로 사용하는 데이터가 된다.


첫 번째는 상호배타(Mutual exclusion)이다. 오류가 일어나지 않기 위해서는 데이터에 대한 업데이트는 한 순간에 오직 한 쓰레드만이 진행할 수 있다는 것이다. 은행계좌 문제로 보면 부모님이 은행계좌에 돈을 입금하고 있을 시에는 학생은 돈을 인출할 수 없다는 것을 의미한다. 공통적으로 사용하는 은행계좌라는 데이터에 대한 접근이 상호배타적이기 때문이다. 반대의 상황도 마찬가지로 적용된다.


두 번째는 진행(Progress)이다. 두 쓰레드에서 누가 먼저 들어갈 것인가에 대한 결정이 유한 시간 내에 일어나야한다는 조건이다. 은행계좌에 접근하는 것이 부모님과 학생 사이에서 유한한 시간 내에 누구 하나가 먼저 접근을 하도록 결정을 해야 한다는 것이다.


세 번째는 유한대기(Bounded waiting)이다. 유한 대기는 쓰레드가 임계구역에 유한 시간 내에 접근을 해야 한다는 것을 의미한다. 무한한 시간동안 아무도 접근을 하지 않는 경우가 발생해서는 안 된다.


임계구역 문제를 해결하기 위해서는 위의 3가지가 모두 만족하는 방법을 찾아야한다.


프로세스 동기화라고 하는 것은 프로세스의 실행 순서를 제어를 할 수 있다는 것을 의미한다. 우리는 앞에서 프로세스 단위로 프로그램이 움직이는 것이 아니라 쓰레드 단위로 움직인다는 것을 배웠다. 그러므로 프로세스 동기화를 쓰레드 동기화라고 생각할 수 있다. 그래서 다시 말하면 쓰레드를 우리가 원하는 실행 순서에 따라 제어를 할 수 있는 것을 쓰레드 동기화라고 한다. 실행 순서를 제어를 함으로써 임계구역 문제를 해결할 수 있다. 따라서 프로세스/쓰레드 동기화는 프로세스 관리에서 가장 중요한 부분 중 하나가 되는 것이다.


동기화를 통해 쓰레드를 제어하기 위해서 도구들이 존재한다. 세마포, 모니터, 맥 등이 있는데 세마포에 대해서 살펴볼 것이다. 세마포는 동기화 문제(임계구역 문제) 해결을 위한 소프트웨어 도구이다. 구조적으로 정수형 변수와 두 개의 동작(P, V)으로 구성되어 있다. 두 개의 동작은 정수 값을 증가시키거나(V동작) 검사하는 역할(P동작)을 한다. V동작을 release()라고 하고 P동작을 acquire()이라 한다. 다른 언어로는 waitsignal로 표시하기도 한다. P동작을 호출하게 되면 정수 값이 1만큼 감소되고 값이 0보다 작게 되면 세마포에 존재하는 리스트(Queue)에 쓰레드를 넣고 block시킨다. V동작은 정수 값을 1 증가시키고 리스트에서 쓰레드를 방출한다. 세마포는 메인 메모리에서 쓰레드가 동작할 때 갈 수 있는 또 다른 루트인데 동기화를 위해 존재하는 것이다. 여기서 정수 값은 권한의 개수라고 할 수 있다. 세마포는 동기화의 조건 중에서 상호배타의 역할을 위해서 존재한다.



위의 개념을 예를 들어 한 번 알아보도록 하자. 처음의 세마포의 정수 값이 1이라고 가정을 해보자. 그런데 프로그램이 실행될 때 P동작에 대한 명령이 수행되었다. 그러면 정수 값이 1 감소하게 되어 0이 된다. 하지만 0보다 작지 않으므로 쓰레드는 block되지 않는다. 그러면 해당 쓰레드는 임계구역에 들어가게 된다. 그런데 이 때 문맥 전환에 의해 다른 쓰레드가 동작을 하는데 또 P동작을 하는 명령이 수행되었다고 하자. 그러면 정수 값이 1이 된다. 이렇게 되면 정수 값이 0보다 작아지므로 이 쓰레드는 리스트에 들어가게 되고 block 상태가 된다. 그러면 임계구역에 들어가지 못하게 된다. 따라서 하나의 쓰레드가 임계구역에 들어가면 다른 쓰레드는 세마포에 갇히게 되어 임계구역에 들어가지 못하게 되는 것이다. 상호배타의 역할이 수행된다. 그리고 다시 문맥전환에 의해 임계구역에 있던 쓰레드가 V동작이 발생하면 정수 값이 증가하게 되어 0이 된다. 그러면 다른 쓰레드가 리스트에서 방출되어 임계구역에 진입하게 된다