운영체제(9) - 임계구역 문제

1 minute read

임계구역 문제

임계구역이란?

멀티플 쓰레드가 일어나면 공통 변수에 대해 여러 자원이 접근하게 되고 그 과정에서 데이터 불일치 문제가 발생할 수 있다.

  • 해결 방법
    – Mutual exclusion (상호배타): 오직 한 쓰레드만 진입해야 한다.
    – Progress (진행): 진입 결정은 유한 시간 내 이루어져야 한다.
    – Bounded waiting (유한대기): 어느 쓰레드라도 유한 시간 내에 진입할 수 있다.

프로세스/쓰레드 동기화의 목적

  • 임계구역 문제 해결(틀린 답이 나오지 않게)
  • 프로세스 실행 순서 제어(원하는대로)

동기화 도구

  • Semaphores
  • Monitors
  • Misc

세마포 (Semaphores)

  • 동작
    – P: Proberen (test) → acquire() ex.스레드를 감옥에 가둔다.
    – V: Verhogen (increment) → release() ex.스레드를 감옥에서 풀어준다.
void acquire() {
    value--;
    if (value < 0) {
        add this process/thread to list;
        block;
    }
}

void release() {
    value++;
    if (value <= 0) {
        remove a process P from list;
        wakeup P;
    }
}

세마포의 일반적인 사용

  • Mutual exclusion

sem.value = 1이라고 해보자. 어떠한 프로세스가 실행되면 sem.acquire()가 실행되고 value는 0이 된다. 하지만 0 미만은 아니기 때문에 false로 Critical-Section으로 들어가게 된다.

다음 두번째 프로세스가 실행되면 또 다시 sem.acquire()가 실행되고 value는 -1이 된다. 이번에는 값이 0 미만이므로 sem.release()이 실행되고 두 번째 프로세스는 큐에 세미포 큐에 갇히게 되면서 Critical-Section에 프로세스가 하나만 실행될 수 있도록 한다.

  • Ordering

내가 원하는 순서대로 프로세스를 실행하고 싶다면 먼저 수행하고 위와 같이 세마포를 배치한다. 만약 P1의 S1을 먼저 실행시키고 싶다면 P2가 시작할 때 sem.acquire()를 실행시키고 P2가 멈추면 컨텍스 스위칭이 일어나면서 P1을 실행시킨다. 그리고 P1이 다 끝나면 sem.release()을 통해 P2 프로세스를 다시 릴리즈 시킨다.

Tags:

Categories:

Updated:

Leave a comment