본문 바로가기

CS/OS

뮤텍스(Mutex)와 세마포어(Semaphore)의 차이💁‍♂️

뮤텍스 ( 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