세마포어 사용 이유 - semapo-eo sayong iyu

[세마포어] [뮤텍스]

데드락이 걸렸을 때 사용하는 것이 아니고 세마포어나 뮤텍스에 의해 데드락이 걸릴 수도 있다. 따라서 꼭 필요한 부분에만 제대로 사용해야한다.

뮤텍스(MUTEX)란 MUTual EXclusion으로 우리말로 해석하면 '상호 배제'라고 한다. 말 그대로 상호 배제해서 실행하는 것이다. 임계 구역을 가진 스레드들이 동시에 실행되지 않고 서로 배제되어 실행되게 하는 기술이다. 여기서 임계구역(Critical Section)이란 프로그램 상에서 동시에 실행될 경우 문제을 일으킬 수 있는 부분을 말한다. 만약 어느 쓰레드에서 임계구역을 실행하고 있으면 다른 쓰레드들은 그 임계 구역에 접근할 수 없고 앞의 쓰레드가 임계 구역을 벗어나기를 기다려야한다. 이런 방법이 뮤텍스이다.

그리고 세마포어란 임계구역에 접근 하기 위한 열쇠 같은 것이라고 생각하면 된다. 예를 들어 화장실이 있다고 하자. 이 화장실에 들어가기 위해서는 반드시 열쇠가 있어야 하고 이 열쇠는 단 하나 밖에 없으며 화장실에는 한명씩만 들어갈 수 있다. 이럴 때 여러 명의 사람이 화장실을 이용하려면 일단 한명이 열쇠를 가지고 화장실을 이용하고 나오면 그 사람에게 열쇠를 받아 다음 사람이 이용하고 이렇게 한 사람씩 돌아가면서 화장실을 쓸 수 있다. 이때 화장실은 임계구역이 되고 열쇠는 세마포어가 되는 것이다. 그리고 누군가 열쇠를 가지고 도망가 버린다면 아무도 화장실을 사용하지 못하는 상태가 되어 버린다. 이런게 바로 데드락이다. 데드락을 CPU 스케쥴링에서는 교착상태라고 한다.

세마포어(SEMAPHORE)

프로그래밍, 특히 유닉스시스템의 프로그래밍에서 세마포어는 운영체제의 자원을 경쟁적으로 사용하는 다중 프로세스에서 행동을 조정하거나 또는 동기화 시키는 기술이다. 세마포어는 운영체제 또는 커널의 한 지정된 저장장치 내 값으로서, 각 프로세스는 이를 확인하고 변경할 수 있다. 확인되는 세마포어의 값에 따라, 그 프로세스가 즉시 자원을 사용할 수 있거나, 또는 이미 다른 프로세스에 의해 사용 중이라는 사실을 알게 되면 재시도하기 전에 일정 시간을 기다려야만 한다. 세마포어는 이진수 (0 또는 1)를 사용하거나, 또는 추가적인 값을 가질 수도 있다. 세마포어를 사용하는 프로세스는 으레 그 값을 확인하고, 자원을 사용하는 동안에는 그 값을 변경함으로써 다른 세마포어 사용자들이 기다리도록 해야한다.

세마포어들은 일반적으로 메모리 공간을 공유하거나, 또는 파일들을 공유 액세스하기 위한, 두 가지 정도의 목적을 위해 사용된다. 세마포어들은 프로세스 간 통신(IPC)을 위한 기술 중 하나이다. C 프로그래밍 언어는 세마포어들을 관리하기 위한 일련의 인터페이스 또는 함수들을 제공한다.
즉, 세마포어는 경쟁관계에 있는 자원들을 충돌 없이 잘 사용하기 위함이다. 공유자원의 경우 다른 프로세스가 동시에 접근을 한다면, 어느 프로세스에 의해 변경된 자료가 나중에 수정된 자료인지 모르게 되는 문제가 생기며, 이로 인해 데이터의 각종 오류가 산재하게 된다. 그래서 세마포어 라는 일종의 변수를 두어 제어를 하게 된다.

- 동기화의 일반적인 방법인 세마포어 방법은 세마포어라는 정수 변수(integer variable), 프로세스 대기열(process waiting queue), P와 V의 두 명령으로 구성된다. 초기 상태의 변수 값은 자원의 수와 같으며 대기열은 비어 있다. P 명령은 변수의 값을 하나 줄인 후, 변수의 값이 0보다 작으면 프로세스를 대기열로 집어 넣는다. 반대로 0보다 크면 그 프로세스는 계속 진행된다. V 명령은 변수의 값을 하나 증가시킨다. 그 결과가 0보다 크면 프로세스는 계속되며 0보다 작으면 대기열의 프로세스 하나를 준비 상태로 만들고, 프로세스의 수행은 계속된다. 결국 변수의 값은 음수일 경우는 대기 중인 프로세스의 수를 나타내며, 양수이면 사용 가능한 자원의 수를 가리킨다. 위에서 동기화란 프로세스의 실행을 시간에 따라 순서적으로 처리하는 것을 동기화라 한다.

- 세마포어는 다익스트라(E.J.Dijkstra)가 제안한 동시에 정보를 공유하여 수행되는 두 개 이상의 프로그램이나 프로세스에서 활동 (activity)의 위치(coordination)를 설정해 주는 데 사용되는 동기화를 위한 기본 조작이다. 이는 두개 이상의 프로세스에 의해 공유되는 고유변수로 정의되는 데, 보통의 방법으로는 다룰 수 없고 항상 P와 V라는 연산을 통해서만 액세스할 수 있다. 세마포어 sem이란 다음과 같은 연산이 허용된 정수형 변수를 말한다. (P와 V란 이름은 wait와 signal이란 말의 네덜란드어에서 나온 것으로 이때 signal이란 물론 UNIX의 signal 호출과는 다르다.) 두 연산은 모두 원자화되어야 한다. 즉 sem을 변경할수 있는 프로세스는 한 순간에 오직 하나 뿐이다.

컴퓨터가 여러 프로그램을 동시에 수행하는 다중 프로그래밍 시스템에서는 프로세스들 간의 상호 배제와 동기화를 위한 기본적인 연산이 필요하다. 세마포어는 다익스트라가 제안한 프로세스 동기화를 위한 구조로, 이는 여러 프로세스들에 의해 공유되는 변수로 정의된다. 그런데 이 변수는 보통의 방법으로는 액세스할 수 없고 오직 P와 V라는 연산으로만 다룰 수 있다. P와 V 연산의 정의는 다음과 같다. 

procedure P(S)   --> 최초 S값은 1임

    while S=0 do wait  --> S가 0면 1이 될때까지 기다려야 함

    S := S-1   --> S를 0로 만들어 다른 프로세스가 들어 오지 못하도록 함

end P

procedure V(S) --> 현재상태는 S가 0임

    S := S+1   --> S를 1로 원위치시켜 해제하는 과정. 이제는 다른 프로세스가 end V 들어 올수 있음

P와 V는 쪼갤수 없는 단일 연산이다. 즉 한 프로세스가 P나 V를 수행하고 있는 동안에는 프로세스가 인터럽트를 당하지 않는다. 이제 P와 V를 사용하면 다음과 같이 위험지역(cirtical section)에 대한 상호배제를 구현할수 있다. 

    P(S);

    -----------------
    | 위 험 지 역       |
    ----------------- 

    V(S);                                                                           |

최초에 S의 값은 1이다. 위와 같은 위험지역을 포함하는 두개의 프로세스 A와 B가 있다고 하자. A와 B는 서로 독립적으로 수행되지만, 두 프로세스가 동시에 위험 지역으로 들어가서는 안된다. 위와 같이 세마포어를 사용하면 P(S)를 먼저 수행하는 프로세스가 S를 0으로 해놓고 위험지역에 들어가므로 나중에 도착하는 프로세스는 P에서 더이상 진행되지 못하고 기다리게 된다. 먼저 들어갔던 프로세스가 V(S)를 해주어야 비로서 P(S)에서 기다리던 프로세스가 위험지역에 들어갈 수 있고 따라서 상호배제가  실현된다. 위의 예는 이진 세마포어 (binary semaphore)로, 단지 하나의 프로세스만이 위험지역에 들어갈 수 있도록 한다. 한편 S의 초기값을 N으로 하면 최대 N개의 프로세스가 P(S)를 통과할 수 있게 되는데 이러한 경우에는 계수 세마포어 (counting semaphore)라 하며 자원 할당에 사용한다. 

o Critical secion 란 ?

다중 프로그래밍 운영체제에서 여러 프로세스가 데이타를 공유하면서 수행될 때 각 프로세스에서 공유 데이타를 액세스하는 프로그램 코드 부분을 가리키는 말. 공유데이타를 여러 프로세스가 동시에 액세스하면 시간적인 차이 때문에 잘못된 결과를 만들어 낼 수 있기 때문에 한 프로세스가 위험 부분을 수행하고 있을 때, 즉 공유 데이타를 액세스하고 있을 때는 다른 프로세스들은 절대로 그 데이타를 액세스하지 못하도록 하여야 한다.

o Mutual exclusion (상호 배제)란 ?

- 프로세스의 상호 교신에 대한 기본적인 조치는 공용 부분을 여러 프로세스가 동시에 사용하는 것을 배제하는 것이었다. 시스템의 어떠한 자원을 한 시점에서 한개의 프로세스만이 사용할 수 있도록 하는 것을 상호배제라 한다. 또한, 프로그램에서 이러한 자원을 사용하거나 혹은 그 내용을 변경하는 부분을 위험부분 (critical section)이라 하며, 둘 이상의 프로그램에서 이 위험 부분이 동시에 수행되지 않도록 하는 것이 상호 배제의 기능이다. 

- 다중 프로그래밍 시스템에서 여러 프로세스가 하나의 공유 데이타를 액세스하면서 작업을 할 때, 한 프로세스가 그 데이타를 액세스할 때는 다른 프로세스들은 그것을 사용하지 못하도록 하는 운영체제의 기능. 예를 들어 한 프로세스가 어떤 화일에 데이타를 쓰고 있을 때 다른 프로세스가 그 화일을 지원버린다면 많은 문제가 발생할 것이다. 상호 배제는 한번에 한 프로세스만이 공유 데이타를 액세스할 수 있도록 해 주는 것으로, 다중프로그래밍 시스템의 운영체제가 꼭 갖추어야 할 기능이다.