블링블링 범블링

[OS 7장]프로세스 관리 - 임계구역 문제 및 세마포어 본문

Technology/오퍼레이팅 시스템

[OS 7장]프로세스 관리 - 임계구역 문제 및 세마포어

뻠스키 2018. 4. 17. 17:34

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


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


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


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


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


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


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


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


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



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







Comments