CS 상식 - 운영체제

[CS 상식 - 운영체제] 동기화 기법

beginner-in-coding 2025. 2. 19. 17:33

01. 뮤텍스 락(Mutex lock; MUTual Exclusion lock)

  • 동시 접근해서는 안되는 자원에 동시에 접근하지 않도록 만드는 도구
  • 상호 배제를 위한 동기화 도구
  • 뮤텍스 락을 통해 현재 자신이 임계 구역에 있음을 알릴 수 있음
  • 다른 프로세스가 뮤텍스 락을 통해 임계 구역이 잠겨있다면 기다림
  • 임계 구역이 잠겨있지 않으면 진입이 가능함
  • 구성
    • 자물쇠 역할: 프로세스들이 공유하는 전역변수 lock
    • 임계 구역을 잠그는 역할: acquire 함수
    • 임계 구역의 잠금을 해제하는 역할: release 함수
  • acquire 함수
    • 프로세스가 임계 구역에 진입하기 전에 호출하는 함수
    • 임계 구역이 열릴(lock이 false가 될 때 까지)때까지 반복적으로 임계 구역을 확인
    • 임계 구역이 열려있다면 구역을 잠그는 역할을 함(lock을 true로)
  • release 함수
    • 임계 구역에서의 작업이 끝나고 호출하는 함수
    • 현재 잠긴 임계 구역을 열어주는 역할(lock을 false로)
  • 바쁜 대기 (busy wait): 쉴 새 없이 잠금의 유무를 확인하는 것
acquire();    //lock 걸려있는 지 확인, lock=false라면 true로 만들고 들어감
// 임계 구역   //임계 구역에서의 작업 진행
release();    //lock을 false로 반환

02. 세마포(semaphore)

  • 뮤텍스와 유사, 좀 더 일반화된 방식의 동기화 도구
  • 공유 자원이 여러 개 있는 상황에서도 적용이 가능한 동기화 도구
  • 종류: 이진 세마포(binary semaphore), 카운팅 세마포(counting semaphore)
  • 구성
    • 임계 구역에 진입할 수 있는 프로세스의 개수(사용가능한 공유 자원의 개수)를 나타내는 전역 변수 S
    • 임계 구역에 들어가도 좋은지, 기다려야 하는지 알려주는 wait 함수
    • 임계 구역 앞에서 기다리는 프로세스에 허락 신호를 주는 signal 함수
  • wait 함수
    • 만일 임계 구역에 진입할 수 있는 프로세스 개수가 0 이하
    • 사용할 수 있는 자원이 있는지 반복적으로 확인
    • 임계 구역에 진입할 수 있는 프로세스 개수가 하나 이상이면 S를 1감소시키고 임계 구역 진입
  • signal 함수
    • 임계 구역에서의 작업을 마친 후 S를 1 증가
  • 문제: 사용할 수 있는 공유자원이 없는 경우, 프로세스는 무작정 무한히 반복하여 확인해야 함(busy wait)
    • CPU 주기를 낭비
  • 해결 방안: wait 함수가 만일 사용 가능한 자원이 없을 경우, 해당 프로세스 상태를 대기로 상태로 만들고, 그 프로세스의 PCB를 세마포를 위한 대기 큐에 넣음, 다른 프로세스가 임계 구역에서의 작업이 끝나고 signal 함수를 호출하면 sginal 함수는 대기 중인 프로세스를 대기 큐에서 제거, 프로세스 상태를 준비 상태로 변경한 뒤 준비 큐로 옮겨줌
wait();    
// 임계 구역   
signal();

03. 모니터(monitor)

  • 임계 영역의 전처리/후처리로 wait과 signal을 명시하는 번거로움을 해결
  • 공유 자원과 공유 자원에 접근하기 위한 인터페이스(통로)를 묶어 관리
  • 모니터를 통해 공유 자원에 접근하고자 하는 프로세스들을 에 삽입
  • 큐에 삽입된 순서대로 하나씩 고유 자원을 이용하도록 함
  • 모니터 -> 공유 자원을 다루는 인터페이스에 접근하기 위한 큐(모니터에 진입하기 위한 큐)를 만들고, 모니터 안에 항상 하나의 프로세스만 들어도록 하여 상호 배제를 위한 동기화를 제공
  • 조건 변수 (condition variable): 특정 조건을 바탕으로 프로세스를 실행하고 일시 중단하기 위해 사용
    • wait와 signal 연산을 수행할 수 있음
    • wait: 호출한 프로세스의 상태를 대기 상태로 전환하고 일시적으로 조건 변수에 대한 대기 큐에 삽입하는 연산