Mutex

뮤텍스는 한 번에 하나의 스레드만 임계 영역(공유 자원 독점 보장)을 실행할 수 있도록 하는 이진 세마 포어(1또는 0만 존재)에 가까운 동기화 방법입니다.
Mutex는 mutual exclusion(상호배제)의 약자입니다.

구성요소

  • Lock 상태(flag): 현재 사용 중인지 아닌지 표시 (보통 바이너리 상태)
  • 소유자(owner): Lock을 현재 소유하고 있는 스레드 (PintOS에서는 holder)
  • 대기 큐(waiters): Lock을 기다리는 스레드 리스트 (자원기다림)

주요 연산

  • lock_acquire()
    → Lock을 획득. 하나의 자원 차지 (다른 스레드가 소유 중이면 대기합니다)
  • lock_release()
    → Lock 해제. (다음 대기 스레드에게 넘깁니다)
  • lock_held_by_current_thread()
    → 현재 스레드가 락의 소유자인지 확인.

특징

  • 소유자가 존재합니다. → 소유한 스레드만 Unlcok 가능
  • 일반적으로 lock()unlock()으로 사용합니다.

주의할 점 (우선순위 역전)

뮤텍스 사용시, 낮은 우선순위 스레드가 락을 가지고 높은 우선 스레드를 막는 문제가 생길 수 있습니다. Priority inversion(우선순위 역전) 이라고 합니다.

해결법 (Priority Donation)
Pintos에서는 이를 해결하기 위해 lock_acquire()에서 우선순위 기부(priority donation)를 구현해야 합니다.

  1. 높은 우선순위 스레드가 락을 기다림
  2. 락을 소유한 낮은 우선순위 스레드에게 운선순위를 임시로 빌려줌
  3. 락 해제 후 원래 순위로 복원

→ 해당 로직은 PintOS Project 1의 주요 구현 과제 입니다.

PintOS에서

Pintos에서는 synch.c의 struct lock이 뮤텍스 역할을 합니다. 내부적으로 세마포어를 사용하여 구현되어 있습니다.

lock_acquire(&lock);   // 락 획득
// critical section
lock_release(&lock);   // 락 해제

lock_acquire()lock_release() 는 내부적으로 sema_down()sema_up() 을 이용하며, 우선순위 기부(priority donation)를 처리합니다.
따라서 Project 1에서 구현 핵심 포인트 중 하나가 바로 이 뮤텍스와 우선순위 상속입니다.

왜? Mutex를 쓸까?

세마포어를 락처럼 사용해도 되지 않을까요?

1. 소유권 개념

세마포어는 어떤 스레드든 up() 이 가능하지만, Mutex는 락을 획득한 소유자만 해제 가능합니다.

구분세마포어뮤텍스
소유자 개념없음있음 (owner)
락 해제 가능아무 스레드나 가능락을 획득한 스레드만 가능

2. 사용 의도와 추상화 차이

세마포어는 일반적인 동기화 도구(자원 개수 관리)이고, Mutex는 임계 구역 보호 전용 도구(임계 구역 보호)입니다. → Mutex는 항상 한 번에 하나인 상호 배제 목적 전용 입니다.

3. 우선 순위 역전 대응 (OS 설계)

Mutex는 세마포어보다 더 높은 수준의 추상화이고 임계 구역 보호에 특화된 안전하고 명확한 동기화입니다.
구조적 안전성, 코드의 명확성, 실수 방지, 우선순위 처리 측면에서 우수합니다.

profile
모든걸 기록하며 성장하고 싶은 개발자입니다. 현재 크래프톤 정글 8기를 수료하고 구직활동 중입니다.

0개의 댓글