세마포어와 뮤텍스는 상호배제 기법입니다.

 

세마포어(Semaphore)

 

https://adithyaravik.wordpress.com/2015/03/31/semaphore-vs-mutex-vs-monitor/

멀티프로그래밍 환경에서 공유 자원에 대한 접근을 제한하는 방법으로 사용합니다.

 

세마포어 S는 정수값을 가지는 변수(Counter 라고도 표현)이며 P와 V라는 명령에 의해서만 접근할 수 있습니다.

 

S는 공유 자원에 접근할 수 있는 프로세스의 개수를 나타내는 변수로 볼 수 있습니다.

 

P는 임계구역에 들어가기 전에 수행되고 V는 임계구역에서 나올 때 수행됩니다..

 

P는 wait() 함수와 매칭되고 V는 signal() 함수와 매칭됩니다.

 

이해하기 쉽게 예를 들어보겠습니다. 회사에 프린터가 2개가 있다고 가정합시다. (S가 2인 상태입니다.)

 

여기서 1명이 프린터를 사용하면 S가 1로 변하고 또 1명의 사람이 프린터를 사용하면 S가 0이 됩니다.

 

그리고 추가로 1명이 사용을 하려면 S가 0이기 때문에 기다려야 합니다.

 

사용중인 1명이 사용이 끝나면 S가 1로 바뀌어서 사용이 가능해지죠. 

 

세마포어는 뮤텍스와 다르게 소유 개념이 없습니다.

 

교착상태에 대한 고전적인 해법이며 모든 교착상태를 해결해주진 못합니다.

 

임계영역(Critical Section)

 

공유자원에 접근하는 프로세스 내부의 코드영역으로

 

서로 다른 두 프로세스 혹은 스레드가 같이 접근해서는 안 되는 공유 영역입니다.

 

상호 배제

 

한 프로세스가 공유자원을 접근하는 임계영역 코드를 수행하고 있으면

 

다른 프로세스들은 공유 자원을 접근하는 임계영역 코드를 수행할 수 없다는 조건,

 

상호배제 방법에는 세마포어, 뮤텍스, 모니터 등이 있다.

 

 

뮤텍스(Mutex)

 

https://adithyaravik.wordpress.com/2015/03/31/semaphore-vs-mutex-vs-monitor/

세마포어가 공유자원의 여러 프로세스의 접근을 막는다면 뮤텍스는 쓰레드의 접근을 막습니다.

 

그리고 뮤텍스는 2개 이상의 쓰레드 접근을 막습니다.

 

임계영역 안에 1개의 스레드가 이미 작업 중(Lock)이면 다른 스레드는 간섭할 수 없습니다.

 

일종의 Binary Semaphore라고 볼수 있습니다.

 

일종의 Locking 매커니즘입니다.

 

위의 프린터 예제로 보면 뮤텍스의 경우 프린터가 1개인 경우죠.

 

여기서 세마포어는 뮤텍스가 될 수 있지만 뮤텍스는 세마포어가 될 수 없습니다.

 

 

세마포어와 뮤텍스을 설명하는 글을 보면

 

세마포어와 뮤텍스 모두 프로세스 혹은 스레드의 접근을 제어한다고 나와있는 경우도 있고

 

세마포어는 프로세스, 뮤텍스는 스레드와 연관이 있는 것처럼 설명해놓은 글이 많습니다.

 

무엇이 정확한 표현인지는 모르겠습니다.

 

 

프로세스와 스레드

 

프로세스 : 실행되고 있는 프로그램, 운영체제로부터 시스템 자원을 할당받는 작업의 단위

 

스레드 : 프로세스 내에서 실행되는 여러 흐름의 단위

 

멀티 프로세스 : 문맥 교환 중 오버헤드 발생

 

멀티 스레드 : 프로세스를 생성하여 자원을 할당하는 시스템콜이 줄어들어 자원을 효율적으로 관리 가능

 

동기화 문제, 설계하기가 까다로운 단점이 있습니다.

 

 

 

 

 

아무튼 뮤텍스와 세마포어를 정리하자면

 

둘다 공유자원에 대한 프로세스 혹은 스레드의 접근을 제어하는 것이고

 

차이점은 세마포어는 여러개의 프로세스가 사용이 가능하고, 뮤텍스는 오로지 1개의 스레드만 사용이 가능하다는 점! 

+ Recent posts