[개발] Semaphore(세마포어)와 뮤텍스(Mutex)
개발자 | 2013. 4. 24. 00:46
출처: 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이나 뮤텍스 같은 다른 동기화 자원과 함께 사용해야한다.
- 동시에 접근 할 수 있는 쓰레드의 수를 설정하기 위해 쓰레드 풀링을 사용한다.
'개발자' 카테고리의 다른 글
$(document).ready 와 $(window).load (0) | 2013.07.24 |
---|---|
Gof(TheGang of Four)의 디자인패턴, 23가지 (0) | 2013.05.02 |
[개발] Thread 간 동기화에 관하여 (Critical Section) (0) | 2013.04.23 |
[개발] Types, Operators and Expressions (0) | 2013.04.22 |
[개발] OSI(Open System Interconnect) 7 Layer (0) | 2013.04.19 |