세마포어(Semaphore) 기반의 동기화  시스템프로그래밍 

2013.04.17. 16:01  수정  삭제

복사http://blog.naver.com/pwk0810/40187278177

전용뷰어 보기

엄밀히 말하면 뮤텍스는 세마포어의 일종이다

 

  • 세마포어의 최대 가질수 있는 내부 카운트를 1로 제한하여 실질적으로 그 카운트가 0과 1을 가진다.
  • 이러한 기능을 하는 세마포어를 바이너리 세마포어라고 한다.

 

뮤텍스는 게임 서버에서는 잘 사용하지 않는 기법임에 반해 세마포어는 아주 많이 사용한다.

윤성우님의 "뇌를 자극하는 윈도우즈 시스템 프로그래밍" 에서의 예를 든 "명동 교자" 라는 설명은 아주 탁월한 비유인듯 하다. 그보다 나은 설명을 해낼 방법이 없다능..

 

"임계 영역에 동시접근할 수 있는 쓰레드의 개수는 10개" 의 의미


 

  • 세마포어는 내부에 카운트를 두어서 소유권을 가질수 있는 쓰레드 들의 수를 설정할 수 있다.
  • 동시에 실행되는 쓰레드를 수를 설정할 수 있다는 뜻.
  • 바이너리 세마포어가 아닌 경우는 세마포어(내부 카운트 2이상) 는 스레드가 동시에 같은 공유 자원을 접근할 수 있기 때문에 크리티컬 섹션이나 뮤텍스 같은 다른 동기화 자원가 함께 사용해야 한다. ( 당연히 게임서버는 크리티컬 섹션 )
  • 동시에 접근 할수 있는 쓰레드의 수를 설정하기 위해 쓰레드 풀링을 사용한다.

CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
                        LONG lInitailCount, 
      LONG maximumCount,
      LPCTSTR lpName);
  • 커널 객체 생성을 커널에 요청하는 역할을 한다.
  • 세마포어는 값을 지닌다.
  • 세마포어가 생성될때 전달 인자 lInitailCount 의 초기 카운트가 결정.
  • 카운트가 0인 경우 Non-Signaled 상태
  • 1인 경우 Signaled 상태가 된다.
  • 핸들을 인자로 전달하면서 WaitForSingleObject 함수를 호출할 경우, 그 값이 하나씩 감소하면서 함수를 반환.
  • 세마포어를 생성할때 초기 카운트를 10으로 놓을 경우,  WaitForSingleObject 함수가 총 열번 호출 될때 까지 카운트가 하나씩 감소하면 함수를 반환.
  • 열한번째 호출시 세마포어 카운트가 0인 관계로 블록킹 상태가 된다.
  • iIntialCount 는 할당하고자 하는 열쇠의 카운트로 비유


RelaseSemaphore(HANDLE hSemaphore, LONG lReleaeCount, LPLONG lpPreviouCount );
로 해제한다. 


                        


'SYSTEM PROGRAMMING' 카테고리의 다른 글

I/O Completion Port 모델  (0) 2015.08.05
윈도우즈 기반 I/O 모델  (0) 2015.08.05
Mutex 기반 동기화  (0) 2015.08.05
이벤트(Event Kernel Object)를 이용한 커널 모드 동기화  (0) 2015.08.05
객체 상태별 종류  (0) 2015.08.05
Posted by 뉴암스테르담
l