뮤텍스 ( Mutex )
뮤텍스란 MUTual EXclusion 으로 우리말로 해석할 경우 ' 상호 배제 ' 라는 뜻이다.
Critical Section 을 가진 Thread들의 running time 이 서로 겹치지 않게, 각각 단독으로 실행되게 하는 기술이다.
만약 어느 Thread에서 Critical Section을 실행하고 있으면 다른 Thread들은 그 Critical Section에 접근할 수 없고
앞의 Thread가 Critical Section을 벗어나기를 기다려야 한다!
- 공유된 자원의 데이터를 여러 스레드가 접근하는 것을 막는 것.
- 다중 프로세스들의 공유 리소스에 대한 접근을 조율하기 위해 Synchronized 또는 lock 을 사용한다.
- 뮤텍스 객체를 두 스레드가 동시에 사용할 수 없다.
세마포어 ( Semaphore )
운영체제에서 많이 쓰이는 동기화 기법으로 세마포어를 많이 쓴다. 프로세스의 순차적인 처리를 위해 만든 기법으로
프로세스들끼리 경쟁을 막아 원활한 자원 공유를 가능하게 한다.
- 공유된 자원의 데이터를 여러 프로세스가 접근하는 것을 막는 것
- 리소스 상태를 나타내는 간단한 카운터로 생각할 수 있다.
운영체제 또는 커널의 한 지정된 저장장치 내의 값이다.
일반적으로 비교적 긴 시간을 확보하는 리소스에 대해 이용한다.
- 공유 리소스에 접근할 수 있는 프로세스의 최대 허용치만큼 동시에 사용자가 접근하여 사용할 수 있다.
- 각 프로세스는 세마포어 값은 확인하고 변경할 수 있다.
사용 중이지 않는 자원의 경우 그 프로세스가 즉시 자원을 사용할 수 있다.
이미 다른 프로세스에 의해 사용 중이라는 사실을 알게 되면 재시도하기 전에 일정 시간을 기다려야 한다.
세마포어를 사용하는 프로세스는 그 값을 확인하고, 자원을 사용하는 동안에는 그 값을 변경함으로써 다른 세마포어 사용자들이
기다리도록 해야 한다.
- 세마포어는 이진수를 사용하거나, 또는 추가적인 값을 가질 수도 있다.
semWait
세마포어 값을 감소시킨다. 만일 값이 음수가 되면 semWait 를 호출한 프로세스는 블록 상태가 된다. 음수가 아니면,
프로세스는 계속 수행가능하다.
semSignal
세마포어 값을 증가시킨다. 만약 값이 양수가 아니면 semWait연산에 의해 블록된 프로세스들을 깨운다.
struct semaphore{
int count;
queueType queue;
};
void semWait( semaphore s ) {
s.count--;
if(s.count<0){
// 현재 프로세스가 공유 자원에 접근하지 못한다는 것을 의미한다.
}
}
void semSignal ( semaphore s ){
s.count++;
if( s.count <= 0 ){
//count가 0보다 작거나 같다는 말은 대기하고 있는 프로세스( 또는 스레드) 가 존재한다는 것을 의미한다.
//s.queue에 연결되어 있는 프로세스를 큐에서 제거한다.
//프로세스의 상태를 실행 가능으로 전이시키고 ready list 에 연결한다.
}
}
const int n = 1;// 프로세스의 개수
semaphore s = 1;
void P ( int i ){
while( true) {
semWait(s);
semSingal(s);
}
}
둘의 차이
- 가장 큰 차이점은 동기화 대상의 개수이다.
뮤텍스의 경우 , 동기화 대상이 오직 하나뿐일 때, 세마포어는 동기화 대상이 하나 이상일 때 사용한다.
- 세마포어는 뮤텍스가 될 수 있지만, 뮤텍스는 세마포어가 될 수 없다.
뮤텍스는 상태가 0,1뿐인 binary 세마포어인 것이다.
- 세마포어는 소유할 수 없는 반면, 뮤텍스는 소유가 가능하며 소유주가 이에 대한 책임을 가진다.
뮤텍스의 경우 상태가 두 개 뿐인 lock 이므로 lock을 가질 수 있다.
- 뮤텍스의 경우 뮤텍스를 소유하고 있는 스레드가 이 뮤텍스를 해제할 수 있다. 하지만, 세마포어의 경우 이러한
세마포어를 소유하지 않는 스레드가 세마포어를 해제할 수 있다.
- 세마포어는 시스템 범위에 걸쳐있고, 파일시스템상의 파일 형태로 존재하는 반면, 뮤텍스는 프로세스 범위를 가지며
프로세스가 종료될 때, 자동으로 Clean Up 된다.
* Critical Section : 프로그램 상에서 동시에 실행될 경우 문제를 일으킬 수 있는 부분
'CS > OS' 카테고리의 다른 글
교착상태 ( DeadLock ) OS 🌙 (0) | 2021.04.26 |
---|---|
프로세스 vs 스레드💻 (0) | 2021.04.26 |
멀티 스레딩 (0) | 2021.04.14 |