박종훈 기술블로그

운영체제 7장 동기화 예제 - 연습문제 풀이

공룡책 (Operating System Concepts) 10th

개인적인 생각이므로 틀린 답변일 수 있습니다.


7.1

Windows와 Linux가 여러 락 기법을 구현하는 이유를 설명하라. 그들이 스핀락, mutex 락, 세마포 및 조건 변수를 사용하는 환경을 설명하라. 각각의 경우 그 기법이 필요한 이유를 설명하라

락 기법에는 각각의 장 단점이 있기 때문에 상황에 따라 여러 락 기법을 사용할 수 있도록 한다.

스핀락은 오버헤드가 적으나 busy-wait 을 하기 때문에 사용 시간이 짧은 자원에 대해 효과적입니다.
mutex 락은 하나의 쓰레드만 접근할 수 있도록 할 때 사용합니다.
세마포 및 조건 변수는 자원을 장기간 보유해야 하는 경우 유용합니다.

7.2

Windows는 슬림 reader-writer 락이라는 가벼운 동기화 도구를 제공한다. 대부분의 reader-writer 구현은 reader 또는 writer를 선호하거나 FIFO 정책을 사용하여 대기 스레드를 정렬하는 반면에, 슬림 reader-writer은 reader 또는 writer를 선호하지 않으며 대기 스레드를 FIFO 정책에 따라 정렬하지도 않는다. 이러한 동기화 도구를 제공하면 얻을 수 있는 이점을 설명하라.

일반적인 reader-writer 락에 비해 고려할 것이 줄어들었기 때문에 더 빠른 동기화 속도를 제공할 것으로 예상되며, 선호가 없기 때문에 writer만 점유하는 상황이 없을 것 입니다.

7.3 이진 세마포 대신 mutex 락을 사용할 수 있도록 하려면 그림 7.1 및 그림 7.2의 생산자와 소비자 프로세스를 어떻게 변경해야 하는지 설명하라.

이 문제는 유한 버퍼 문제에 대한 질문이다.

int n;
semaphore mutex = 1;
semaphore empty = n;
semaphore full = 0;
while (true) {
    ...
    /* produce an item in next_produced */
    wait(empty);
    wait(mutex);
    ...
    /* add next_produced to the buffer */
    ...
    signal(mutex);
    signal(full);
}
while (true) {
    wait(full);
    wait(mutex);
    ...
    /* remove an item from buffer to next_consumed */
    ...
    signal(mutex);
    signal(full);
    ...
    /* consume the item in next_consumed */
    ...
}

semaphore mutex = 1;
wait, signal 로 처리 되어 있는 부분을

available 변수를 만들고
acquire 와 release로 처리하도록 수정 (6.5장 참고)

7.4 식사하는 철학자들의 문제에서 교착 상태가 어떻게 가능한지 설명하라.

교착 상태(deadlock)의 발생 조건은 다음과 같다.

  1. 상호배제(mutual exclusion)
  2. 점유하며 대기(hold and wait)
  3. 비선점(no preemption)
  4. 순환 대기(circular wait)

모든 철학자가 오른쪽 젓가락을 집은 상태가 되면 위 조건을 만족하여 교착상태에 빠지게 된다.

7.5

windows dispatcher 객체의 signaled 상태와 nonsignaled 상태의 차이점을 설명하라.

signaled
스레드들이 이벤트를 처리하고 작업을 수행할 수 있게 합니다.

nonsignaled
스레드들이 대기하도록 만듭니다.

7.6

val이 Linux 시스템에서 원자적 정수라고 가정하자. 다음 연산이 완료된 후 val 값은 무엇인가?

atomic_set(&val, 10);
atomic_sub(8, &val);
atomic_inc(&val);
atomic_inc(&val);
atomic_add(6, &val);
atomic_sub(3, &val);

7