모니터

모니터는 데이터와 그 데이터를 다루는 함수들이 하나의 객체처럼 캡슐화된 동기화 구조입니다.
보통 언어나 시스템 레벨에서 제공되며, 락 + 조건변수(Condition variable)로 구성되어 있습니다.

구성요소

  • 공유 자원 (Shared data)
  • Lock (락) - 임계 구역 보호
  • 조건 변수 (Condition Variable) - 특정 조건이 만족될 때까지 대기 / 신호

주요 연산

  • wait() ( cond_wait() )
    → Lock을 놓고 기다림. 조건이 만족될 때 다시 락을 획득합니다. (Lock과 함께 사용)
  • signal() ( cond_signal() )
    → 대기 중인 스레드 하나 깨움
  • breadcast() ( cond_breadcast() )
    → 모든 대기 스레드 깨움

특징

  • 한 번에 하나의 스레드만 모니터 내부 함수 실행 가능합니다.
  • wait(), signal() 등의 조건 변수를 통해 스레드 간 대기와 알림 수행합니다.

PintOS에서

PintOS에서는 명시적으로 monitor 구조를 지원하지 않지만, Lock + Condition variable 를 조합하여 모니터 스타일로 구현할 수 있습니다.

lock_acquire(&lock);
while (!condition_met)
    cond_wait(&cond, &lock);
do_something();
lock_release(&lock);

cond_wait()는 내부적으로 락을 해제하고, 조건 변수 큐에 들어가고, 다시 락을 잡습니다.
해당 형태는 Project 2 이상에서 유저 프로그램 실행, 파일 시스템 등 다양한 상황에서 사용됩니다.

세마포어 VS 뮤텍스 VS 모니터

항목세마포어뮤텍스모니터
추상화 수준낮음 (기초 동기화 도구)중간 (락 전용)높음 (락 + 조건 변수 캡슐화)
락 소유 개념없음있음있음
조건 대기 지원busy-wait 또는 직접 처리직접 처리 필요조건 변수로 구조화됨
코드 구조느슨함단일 락 보호모듈화 / 안전성 뛰어남
profile
모든걸 기록하며 성장하고 싶은 개발자입니다. 현재 크래프톤 정글 8기를 수료하고 구직활동 중입니다.

0개의 댓글