컴퓨터 공학 & 통신

[개념 정리/운영체제] 경쟁 상태 해결 방법 - 뮤텍스, 세마포어, 모니터

왈왈디 2023. 7. 26. 21:51
728x90

경쟁 상태 해결 방법

공유 자원에 대한 경쟁 상태를 해결하는 방법에는 대표적으로

뮤텍스, 세마포어, 모니터 3가지가 있다.

이들은 상호 배제, 한정 대기, 진행의 융통성 조건을 만족시키며

경쟁 상태를 해결한다.

 

아래 설명은 프로세스, 스레드 모두 적용되는 내용이다.

 

  • 상호 배제(mutual exclusion): 한 프로세스가 임계 영역에 들어갔을 때 다른 프로세스는 들어갈 수 없다.
  • 한정 대기(bounded waiting): 특정 프로세스가 임계 영역 진입을 요청한 후 해당 요청이 승인되기 전까지 다른 프로세스가 임계 영역에 진입하는 횟수를 제한하는 것을 말한다. 이를 통해 특정 프로세스가 영원히 임계 영역에 들어가지 못하는 것을 방지한다.
  • 진행의 융통성(progress): 어떠한 프로세스도 임계 영역을 사용하지 않는다면, 임계 영역 외부의 어떠한 프로세스든 들어갈 수 있으며, 이때 프로세스끼리 서로 방해하지 않는 것을 의미한다.

 

뮤텍스

뮤텍스(mutex)는 공유 자원을 lock()을 통해 잠금 설정하고

사용한 후에 unlock()을 통해 잠금해제 되는

객체 lock()을 기반으로 경쟁 상태를 해결한다.

 

잠금이 설정되면 다른 프로세스나 스레드는 잠긴 코드 영역에 접근할 수 없고

해제는 그와 반대가 된다.

한 번에 하나의 프로세스만 임계 영역에 있을 수 있다. 

비유적으로, 변기가 하나인 화장실 한 칸을 생각할 수 있다.

Mutex lock;
void f(){
    mutex_lock(&lock);
    ...
    {Critical Section}
    ...
    mutex_unlock(&lock);
}

 

세마포어

세마포어(semaphore)는 일반화된 뮤텍스를 말한다.

간단한 정수 S와

두 가지 함수 wait() 및 signal()로

공유 자원에 대한 접근을 처리한다.

 

이를 통해 여러 프로세스가 동시에 임계 영역에 접근할 수 있다.

 

  • S는 현재 사용 가능한 공유 자원의 수다.
  • wait()는 S를 1씩 감소시킨다. 감소시키다가 S가 음수가 된다면, 공유자원을 쓸 수 없기 때문에 프로세스는 차단되며, 대기열에 프로세스를 집어넣는다.
  • signal()은 S를 1씩 증가시킨다. 공유자원을 프로세스가 사용 완료한 상태를 말한다. 이 때 S가 0 이하라면 대기열에 있던 프로세스가 동작하게 된다.

비유로는 5명의 사용자만이 로그인하여 들어갈 수 있는 게임이 있다.

struct Semaphore {
    int value;
    Queue<process> q; //PCB를 담고 있음
};
wait(Semaphore s)
{
    s.value = s.value - 1;
    if(s.value < 0) {
    //대기열에 삽입
    	q.push(p);
        block();
    } else return;
}

signal(Semaphore s)
{
    s.value = s.value + 1;
    if(s.value <= 0) {
    //대기열에 있던 프로세스를 꺼내 공유자원에 대한 작업 진행
    	Process p = q.pop();
    	wakeup(p);
    } else return;
}

참고로, signal()은 V()라고도 하며, wait()은 P()라고도 한다.

 

세마포어는 바이너리 세마포어 카운팅 세마포어로 나뉜다.

 

바이너리 세마포어

바이너리 세마포어는 0과 1의 두 가지 값만 가질 수 있는 세마포어이다.

구현의 유사성으로 인해 뮤텍스를 바이너리 세마포어라고 볼 수도 있으나,

엄밀히 말하면 뮤텍스는 잠금을 기반으로 상호배제가 일어나는 잠금 메커니즘을 사용하고,

세마포어는 신호를 기반으로 상호 배제가 일어나는 신호 메커니즘을 사용하는 점이 다르다.

 

신호 메커니즘은 휴대폰에서 노래를 듣다가

친구로부터 전화가 오면 노래가 중지되고

통화 처리 작업에 관한 인턴페이스가 등장하는 상황과 같다.

 

카운팅 세마포어

카운팅 세마포어는 여러 개의 값을 가질 수 있는 세마포어이다.

 

모니터

모니터(monitor)는 둘 이상의 스레드나 프로세스가

공유자원에 안전하게 접근할 수 있도록

공유자원을 숨기고 해당 접근에 대해 인터페이스만 제공하는 객체다.

 

이를 통해 공유자원에 대한 작업들을 순차적으로 처리한다.

모니터와 세마포어의 차이

모니터는 세마포어보다 구현하기 쉽고,

한 번에 하나의 프로세스만 공유자원에 접근할 수 있다.

때문에 상호 배제가 자동으로 구현된다.

인터페이스를 기반으로 구축된다.

 

세마포어는 모니터보다 구현하기 어렵고,

한 번에 여러개의 프로세스가 공유자원에 접근할 수 있다.

이 때문에 상호 배제를 명시적으로 구현해야 한다.

또한 정수 변수를 기반으로 구축된다.

 

참고: inflearn 강의 'CS 지식의 정석 - 큰돌'

728x90