[OS] 세마포어와 뮤텍스

2016. 11. 9. 23:35Basic/OS

반응형

운영체제와 프로그래밍 언어 수준에서 병행성을 제공하는 기법으로, 세마포어와 뮤텍스가 있습니다.

- 동기화 기법이라고 볼 수 있습니다.

- 세마포어와 뮤텍스 이외에도 모니터, 이벤트 플래그, 메시지, 스핀락 등이 있지만 나중에 포스팅 할 수 있도록 하겠습니다.


동기화

시스템의 자원은 한정적인데 이 한정적인 자원에 여러 스레드가 동시에 접근해서 사용하려하면 문제가 발생할 수도 있습니다. 이런 문제를 방지하기 위해 스레드들에게 하나의 자원에 대한 처리 권한을 주거나 순서를 조정해주는 기법입니다.


임계구역 (Critical Section)

공유자원에 접근하는 프로세스 내부의 코드 영역으로 어떤 한 프로세스가 이 영역을 수행중일 때 다른 프로세스가 같은 영역을 수행한다면 문제가 발생할 수 있습니다.


상호배제 (Mutual Exclusion)

한 프로세스가 공유 자원을 접근하는 임계영역 코드를 수행하고 있으면 다른 프로세스들은 공유 자원을 접근하는 임계영역 코드를 수행할 수 없다는 조건입니다.

- 임계영역을 보호하기 위한 개념

- 둘 이상의 프로세스가 공유자원에 대해 동시에 읽거나 쓰는 것을 방지하기 위한 기법

- 상호배제 기법에는 뮤텍스, 세마포어, 모니터, 메시지 전달 등의 기법이 있습니다.



세마포어 (Semaphores)

프로세스간의 시그널(신호, Signal)을 주고받기 위해 사용되는 정수 값, 리소스의 상태를 나타내는 카운터로 세마포어는 다음 세가지 원자적인 연산만을 지원합니다.

- initialize, decrement, increment

- initialize : 세마포어 초기화. (음이 아닌 정수값으로 초기화)

- decrement : 프로세스를 블록시킬 수 있습니다.

- increment : 블록되었던 프로세스를 깨울 수 있습니다. 이 세마포어를 카운팅 세마포어 또는 범용 세마포어라고 합니다.

세마포어의 값에 따라 운영체제는 프로세스가 즉시 자원을 사용할 지, 자원이 다른 프로세스에 의해 사용 중인걸 알게 될 경우엔 일정 시간을 기다려야 합니다.

프로세스가 자원을 사용하는 동안에는 세마포어 값을 변경함으로서 다른 프로세스들이 기다리게 해야합니다.

- 프로세스간 메시지를 전송하거나 공유메모리를 통해 특정 데이터를 공유하게 될 경우 공유 자원에 여러 프로세스가 접근하면서 문제가 발생하게 됩니다.

 + 하나의 프로세스만 자원에 접근 가능하도록 설정할 때 세마포어를 사용합니다.


이진 세마포어

- 0 또는 1의 값을 가지는 세마포어



뮤텍스 (Mutex)

MUTual EXclusion으로 상호배제라고도 합니다.

0또는 1의 값을 가지는 이진 세마포어와 유사합니다. Critical Section (임계구역)을 가진 스레드들의 실행 시간을 서로 겹치지 않게 단독으로 실행하게 하는 기술입니다.

- 프로세스들의 공유 리소스에 대한 접근을 조율하기 위해 Locking과 Unlocking을 사용합니다.

- 뮤텍스 객체를 두 스레드가 동시에 사용할 수 없습니다.



세마포어와 뮤텍스의 차이

- 세마포어는 뮤텍스가 될 수 있지만, 뮤텍스는 세마포어가 될 수 없습니다.

세마포어는 소유할 수 없으며, 뮤텍스는 소유할 수 있고 소유주가 그에 대한 책임을 집니다.

- 뮤텍스의 경우 뮤텍스를 소유하고있는 스레드가 이 뮤텍스를 해제할 수 있습니다. 하지만, 세마포어는 소유하지 않고 있는 스레드가 세마포어를 해제할 수 있습니다.

- 세마포어는 시스템 범위에 걸쳐있고 파일 시스템 상의 파일 형태로 존재합니다. 하지만, 뮤텍스는 프로세스 범위를 가지고 프로그램이 종료될 때 자동으로 지워집니다.

세마포어는 동기화 대상이 여러개 일 때, 뮤텍스는 동기화 대상이 오로지 하나 일 때 사용됩니다.


출처 : http://wonjayk.tistory.com/250

반응형