출처: http://blog.naver.com/tacma?Redirect=Log&logNo=20100065245

  • Semaphore 언제 사용하는가?
    • 프로세스 메시지를 전송하거나, 혹은 공유메모리를 통해서 특정 data 공유하게 경우 발생하는 문제는, 공유된 자원에 여러 개의 프로세스가 동시에 접근 하면서 발생한다. 단지, 한번에 하나의 프로세스만 접근 가능하도록 만들어 줘야 하고, 이때 Semaphore 쓴다.
    • Thread 에서는 뮤텍스, 프로세스에서는 세마포어
    • 교착상태를 방지하기 위해, A 프로세스가 접근했을 다른 프로세스의 접근을 막고, 끝난 접근을 풀어준다. 이때 세마포어로 접근을 막고 접근을 허용할 있다.
  • Semaphore 작동 방식
    • 차단을 원하는 자원에 대해서 semaphore 생성하면 해당 자원을 가리키는 semaphore 값이 할당된다.
    • 값이 0 이면 해당 자원에 접근할 없고, 0보다 크면 해당 자원에 접근할 있다.

    • 그러므로, 자원에 접근하기 전에 semaphore 값을 검사해서 값이 0 이면 자원을 사용할 있을 때까지 기다리고, 0 보다 크면 자원에 접근해서 semaphore 값을 0으로 감소 시켜서, 다른 프로세스가 자원에 접근할 없도록 하고, 자원의 사용이 끝나면 다시semaphore 값을 증가 시켜 다른 프로세스가 사용할 있게 해준다.

  • 뮤텍스와 세마포어
    • 뮤텍스(Mutex) – 상호 배제
      • 화장실에 들어가기 위한 열쇠를 사람이 가지고 있다면, 사람만이 들어갈 있다. 대기열() 기다리게 . à 세마포어의 일종이다.
      • Critical Section 가진 Thread 들이 running time 서로 겹치지 않게, 각각 단독으로 실행하게 하는 기술
      • 뮤텍스는 번에 하나의 Thread만이 실행되도록 하는 입장할 있는 코드 섹션 직렬화된 접근이 가능하게 사용
      • 뮤텍스 객체는 제어되는 섹션에 하나의 Thread만을 허용하기 때문에 해당 섹션에 접근하려는 다른 Thread들을 강제적으로 막음으로써 번째 Thread 해당 세션을 빠져 나올 때까지 기다린다.
    • 세마포어(Semaphore)
      • 화장실이 n(접근할 있는 최대 허용치 만큼 동시에 사용자 접근을 있게 ), 세마포어 카운트가 0이면 대기
      • Dead Lock 피하기 위한 기술 하나
      • Thread Critical Section 접근할 , 해당 Thread Semaphore 카운트를 감소시키고, 수행 종료 원래대로 증가.
      • 공유 리소스에 접근할 있는 최대 허용치 만큼 동시에 사용자 접근을 있게 하는 기술
      • 동기화 대상이 여러 개일 경우에 사용
  • "임계 영역에 동시 접근할 있는 쓰레드의 개수는 10" 의미
    • 세마포어는 내부에 카운트를 두어서 소유권을 가질 있는 쓰레드 들의 수를 설정할 있다.
    • 동시에 실행될 있는 쓰레드를 설정 있다는 .
    • 바이너리 세마포어가 아닌 경우는 세마포어(내부 카운트 2이상) 스레드가 동시에 같은 공유 자원에 접근할 있기 때문에 Critical Section이나 뮤텍스 같은 다른 동기화 자원과 함께 사용해야한다.
    • 동시에 접근 있는 쓰레드의 수를 설정하기 위해 쓰레드 풀링을 사용한다.
,