세마포어의 개념과 사용법

by digipine posted Oct 29, 2017
?

Shortcut

PrevPrev Article

NextNext Article

ESCClose

Larger Font Smaller Font Up Down Go comment Print

멀티쓰레드 프로그래밍을 하다보면 종종 세마포어라는 용어를 접하는 경우가 많다. 사전에서의 의미는 뭐, 신호등 정도로 나온다고 보면 될것같다.

사실 이 세마포어라는걸 한번도 쓰지 않은 경우가 허다할거다. 멀티쓰레드 프로그래밍을

할일이, 일반 SI프로젝트를 하면서는 거의 없을 것이고, 또 세마포어가 없어도 어느정도의 멀티쓰레드 프로그래밍은 가능할 것이기에.

 

헌데, 세마포어에 조금이라도 관심을 가지고 이해한다면, 난제도 많이 풀릴뿐더러,

써먹을 경우가 많다. 다들 알겠지만, 모르는거보다는 아는게 약이듯이.

 

먼저 개념부터 한번 정의해 보자.

 

내가 알고 있는 세마포어 그 자체는 단순한 카운터다. 그 자체는 int i 와 다를게 없다는거다. 근데, 여기에 "신호"라는 개념을 하나 더 붙여서, i > 0 일 경우는 "파란불", i == 0 일 경우는 빨간불을 나타낸다. (물론 반대의 경우도 있을수 있다. i == 0 일경우에 파란불, i > 0 일 경우는 빨간불과 같이).

 

다시 한마디로 정의를 하자면, "신호 카운터" 정도라고 부르면 되겠다. 영어로는 signaling counter라고 하면 될까?

 

위키피디아에 semaphore를 찾아보면 아주 친절한 설명이 나와있다. (요즘들어 위키피디아를 많이 찾는다. 개념정리할때 찾아보면 아주 도움이 많이된다.) 중간쯤에 아래의 식이 나온다.

 

P(Semaphore s)
{
  await s > 0, then s := s-1; /* must be atomic once s > 0 is detected */
}

V(Semaphore s)
{
  s := s+1;   /* must be atomic */
}

Init(Semaphore s, Integer v)
{
  s := v;
}

 

 

 

위키피디아에서는 위 식을 가지고 Semaphore를 실제로 사용하는 예를 설명한다.

 

A, B, C 세개의 쓰레드가 있고, A라는 쓰레드는 B, C로 부터 각각 데이타를 받아서 그 두값을 합산해서 결과를 낸다...

 

A는 B, C가 끝날때 까지 기다려야 하는데 이때 사용하는것이 세마포어다.

A가 세마포어를 어떻게 사용하느냐 하면,

 

A가 하는일

 

먼저, Init 함수를 호출하는데 v값을 -1로 해서 Init을 호출하면,

s = -1 인 상태가 된다.

그리고 B, C의 메서드를 호출한다.

이때 각각 파라메터로 s를 함께 넘겨준다. 그리고 A는 P함수를 호출한다. 즉 s > 0 일때까지 기다린다.

 

B와 C가 하는일

 

B와 C는 각각 호출된 메서드가 종료될 때 V를 호출한다. 즉, s++ 을 실행해서 s값을 각각 1씩 증가시킨다.

 

최종적으로 B와 C가 끝나게 되면 s == 1 이 되어 A는 P함수를 빠져나오면서 다음코드를 진행할 수 있다.

 

일종의 쓰레드 동기화의 예인데, 세마포어를 아주 잘 설명하는것 같다.

위와 같이 사용하는 세마포어를 counting semaphore라고 부른다.

 

세마포어의 종류로 크게 세가지 있는데, counting semaphore는 그중 초기에 s = -1 과 같이 1(신호가 들어온 상태)에서 동기화중인 쓰레드( 또는 Resource)개수를 뺀값을 초기값으로 하는 것을 말한다.

 

나머지 두개는 blocking semaphore, binary semaphore가 있는데

blocking semaphore는 초기값이 0인 것을 이야기 하며,

binary semaphore는 1로 초기화 된 세마포어를 말한다.

 

blocking semaphore는 thread serialization,

binary semaphore는 한정된 resource사용시에 많이 사용된다.

아참, inverse semaphore란 것도 있다.  사실 이것도 별것 아니다. 단지 신호상태가 뒤바뀐것을 이야기한다. 

 
TAG •

Articles

1 2 3