logo

English

이곳의 프로그래밍관련 정보와 소스는 마음대로 활용하셔도 좋습니다. 다만 쓰시기 전에 통보 정도는 해주시는 것이 예의 일것 같습니다. 질문이나 오류 수정은 siseong@gmail.com 으로 주세요. 감사합니다.

세마포어의 개념과 사용법

by digipine posted Oct 29, 2017
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print
?

Shortcut

PrevPrev Article

NextNext Article

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 •

List of Articles
No. Subject Author Date Views
25 RegEnumKeyEx 함수 사용법 digipine 2017.10.29 754
24 [WINCE] Process, Thread API 함수 사용법 digipine 2017.10.29 960
23 [WINCE] 메모리카드 상태 감시 digipine 2017.10.29 327
22 [WINCE] IAT Hooking 방법과 소스 코드 digipine 2017.10.29 659
21 [WINCE] 키보드 및 마우스 메시지 후킹하기 digipine 2017.10.29 809
20 [C#] C#에서 C++ DLL의 Call by Referance out 인수 사용하는 방법 digipine 2017.10.29 1076
19 [C#] Convert char[] to string digipine 2017.10.29 301
18 VS2005 ConvertBSTRToString 에서 LNK2019 에러 대처법 digipine 2017.10.29 192
17 VS2003 이상에서 iostream 구현의 문제점 digipine 2017.10.29 256
16 DLL과 EXE간의 데이타 공유하기 digipine 2017.10.29 837
15 Serialize를 이용한 객체 복사하기 (Copy constructor) digipine 2017.10.29 499
» 세마포어의 개념과 사용법 digipine 2017.10.29 765
13 VC++ 에서 대소문자 변경하는 함수 digipine 2017.10.29 310
12 VC++(MFC)에서 MDB 생성 / 압축 / 연동관리자 digipine 2017.10.29 2654
11 CreateSemaphore Semaphore Manager digipine 2017.10.29 447
10 Mutex, Critical Section Class 만들기 digipine 2017.10.29 392
9 Windows API 멀티 쓰레드 구현법 digipine 2017.10.29 691
8 RPC에 대하여... (3) : RPC 작동을 위한 테스트 방법 digipine 2017.10.29 542
7 RPC에 대하여... (2) : RPC 가 사용하는 포트를 바꿔보자 digipine 2017.10.29 1118
6 RPC에 대하여... (1) : RPC 가 사용하는 TCP/IP 포트는 ? digipine 2017.10.29 1295
Board Pagination Prev 1 2 3 Next
/ 3