운영체제(6) - Process Syncronization(2)

‘운영체제’를 공부하여 정리한 내용입니다.

5. Semaphores

사용법

  • Binary Semaphore
    • 초기화는 1로 된다.
    • Critical Section 접근에 대한 Mutual Exclusion을 제공하기 위해서 사용한다.
    • Mutex Lock이라고도 표현한다.
  • Counting Semaphore
    • 초기화를 하면 2 이상의 값을 가진다.
    • 이 경우는 mutex가 아닌, 유한한 개수를 가진 자원에 대한 접근을 제어하는 데 사용한다.

구현

  • wait()에서 Semaphore가 음수인 것을 발견했을 때 어떻게 해야하는가? (정의 상으로는 Semaphore는 음수가 될 수 없다. 따라서 프로세스는 기다려야 한다.)

    1. Busy Wait을 할 수 있다.
      • 이는 프로세스가 Lock이 풀리는 것을 기다리는 동안 While(true);를 돌리는 것처럼 계속 돌아간다.
      • 오랫동안 기다리게 되는 경우는, CPU 타임을 쓸데없이 낭비하는 상황이 발생한다.
      • 오랫동안 기다리지 않는 것이 보장될 경우는 괜찮은 방법이다.
    2. block(봉쇄) 연산
      • 이는 프로세스를 Semaphore의 프로세스 리스트에 추가하고 Block()을 부르는 식이다.
      • Semaphore와 연관된 ready queue에 넣는 것과 같다.
      • 이러면 프로세스가 Waiting으로 넘어가게 된다.
      • 그리고 다시 signal() (C의 경우 sem_post())로 다른 프로세스를 요청할 경우는 이 리스트에서 꺼내주어 프로세스가 돌 수 있도록 한다.
      • 이 경우는 CPU 타임을 낭비하는 것을 막을 수 있다.
  • Semaphore 연산은 원자적으로 실행되어야한다.

    • SingleProcessing에서는 단순하게 인터럽트를 금지시키면, 원자적인 실행을 보장하는 것이 가능하다.
    • multipleprocessing에서는 모든 Processor에서 인터럽트를 금지해야 한다. 그렇지 않으면 Semaphore의 동작 부분이 또다른 Critical Section이 되어 올바른 동작을 보장할 수 없게될 수 있다.

DeadLock and Starvation

  • (추후 업데이트)

Priority Inversion

  • 상황을 가정하자.

    • 우선 순위는 다음과 같다. P3 < P2 < P1
    • 그런데 이 때, P3라는 프로세스가 사용하는 커널 데이터 R에 P1이 접근해야 하는 상황이 발생했다.
    • 하지만 통상적으로 커널 데이터는 Lock에 의해 보호되기 때문에 P3 프로세스가 자원의 사용을 마칠 때까지 P1은 기다려야 한다.
    • 이 때, P2가 사용가능해지고, P3를 Preemption하게 되면 P3보다 우선순위가 낮은 P2 프로세스가 P3의 스케쥴 작업에 영향을 주는 역설적인 상황이 발생한다.
  • 우리는 이 문제를 Priority Inversion이라고 한다.

    • 만약 Priority 종류가 2가지라면 일어나지 않는다. 하지만 이는 OS에서 사용하기에는 적은 양이다.
    • 그래서 대부분의 OS에서는 Priority-inheritance Protocol이라는 것을 구현한다.

6. Classic Problem of Synchronization

The Bounded-Buffer Problem

  • 프로젝트에서 많이 사용하기는 했다.
  • (추후 업데이트)

The Reader-Writes Problem

  • (추후 업데이트)

The Dining-Philosophers Problem

  • (추후 업데이트)

7. Monitors

  • (추후 업데이트)

Leave a Comment