본문 바로가기

Programming/Operating System

운영체제 · 세마포어, 뮤텍스

세마포어와 뮤텍스의 차이점


세마포어 : Signaling mechanism / 일종의 카운터로서 크리티컬 섹션에 프로세스(스레드)가 동시에 N개 접근할 수 있다. 카운터 값이 0과 1로만 제한되면 Binary semaphore이며, 그 이상의 값을 가지면 Counting semaphore이다.

뮤텍스 : Locking mechanism / 락(Lock)을 가진 하나의 프로세스(스레드)만 크리티컬 섹션에 접근할 수 있다. Binary semaphore로 구현될 수 있다.






세마포어 (Semaphore)


✓ 각 프로세스에 제어 신호를 전달하여 순서대로 작업을 수행하도록 하는 동기화 기법이다.

✓ 세마포어 S는 P와 V 연산으로만 접근 가능한 카운터 변수이며, 0 이상의 값을 가질 수 있다.

✓ S의 값이 0과 1로만 제한되면 이진 세마포어(Binary semaphore)이며, 그 이상의 값을 가지면 카운팅 세마포어(Counting semaphore)이다.

✓ Binary semaphore를 통해 Mutex를 구현할 수 있지만, Mutex로 Semaphore를 구현할 수는 없다.


P 연산 : Wait 동작 / 자원을 사용하려는 프로세스들의 진입 여부를 자원 카운트(S)를 통해 결정한다. 카운트를 감소시켜서(S--) 자원 점유를 알린다.

V 연산 : Signal 동작 / 대기 중인 프로세스를 깨우는 신호이다. 카운트를 증가시켜서(S++) 자원 반납을 알린다.


// Semaphore structure
typedef struct {
    int value;
    struct process *list;
} Semaphore;
// P
void Wait(Semaphore *S) {
    S->value--;
    if (S->value < 0) {
        /* Push the process into S->list. */
        Block();
    }
}
// V
void Signal(Semaphore *S) {
    S->value++;
    if (S->value <= 0) {
        /* Pop process P from S->list. */
        WakeUp(P);
    }
}

// Semaphore implementation
do {
    Wait(&S);
    /* Critical Section */
    Signal(&S);
    /* Remainder Section */
} while (true);





뮤텍스 (Mutex)


✓ 특정 프로세스(스레드)가 공유 자원을 사용하고 있는 상황이라면, 다른 프로세스가 공유 자원을 사용하지 못하도록 하는 동기화 기법이다.

✓ 공유 자원 점유한 프로세스는 락(Lock)을 지니며, 자원 사용을 마치면 락을 반납한다.


// P and V
wait(S) {
    while (S <= 0);
    S--;
}
signal(S) {
    S++;
}

// Mutex implementation in binary semaphore
do {
    wait(&mutex);
    /* Critical Section */
    signal(&mutex);
    /* Remainder Section */
} while (true);