본문 바로가기
CS/운영체제

동기화 문제의 해결책 (Mutex, Semaphore)

by 쌩욱 2021. 12. 13.

동기화 문제

  • 동기화 : 한정적인 시스템 자원에 여러 스레드가 동시에 접근해서 사용하면 문제가 발생할 수 있다. 이 문제를 방지하기 위해 여러 스레드에게 하나의 자원에 대한 처리 권한을 주거나 순서를 조정하는 기법이다.

임계 영역 (Critical Section)

  • 동일한 자원을 동시에 접근하는 작업(ex. 공유 변수)을 실행하는 코드 영역을 임계영역 (Critical Section)이라고 한다.

동기화 기법

  • 유저 모드의 동기화
    • 커널의 힘을 빌리지 않는 동기화 기법(커널의 코드가 실행되지 않음.)
    • 성능상 이점이 있으나 기능상의 제한이 존재.
    • 임계 구역 기반의 동기화, 인터락 함수 기반의 동기화.
  • 커널 모드의 동기화
    • 커널에서 제공하는 동기화 기능을 이용하는 방법.
    • 커널 모드로의 변경이 필요하고 이는 성능 저하로 이어진다. 그러나 다양한 기능을 활용할 수 있다.
    • 세마포어, 뮤텍스, 모니터 등

뮤텍스(Mutex, Mutal Exclusion)

  • 공유된 자원의 데이터를 여러 프로세스, 스레드가 접근하는 것을 막는 방법
  • Lock, Unlock을 사용하여 Lock을 소유한 스레드만 공유 자원에 접근할 수 있고, Lock을 반납할 수 있다.
  • 뮤텍스 객체를 두 스레드가 동시에 사용할 수 없음 (상호 배제)

세마포어 (Semaphore)

  • 공유된 자원의 데이터를 여러 프로세스, 스레드가 접근하는 것을 막는 방법
  • OS가 동시에 접근할 수 있는 '허용 가능한 갯수'를 가지고 있는 Counter를 사용해 관리
  • 세마포어 Counter의 갯수에 따라 다음과 같이 나뉜다.
    • 1개 : Binary Semaphore(뮤텍스와 같다.)
    • 2개 이상 : Counting Semaphore
  • Counter의 개수만큼 동시에 사용자가 접근하여 사용할 수 있다.

뮤텍스와 세마포어의 차이점

  • 동기화 대상의 개수
    • Mutex는 동기화 대상이 하나, Semaphore는 동기화 대상이 하나 이상일 때 사용
  • Semaphore는 소유할 수 없는 반면, Mutex는 소유가 가능하다.
    • Semaphore를 소유하지 않는 다른 스레드가 Semaphore를 해제할 수 있다.

 

문제점

Deadlock(교착상태)

  • 둘 이상의 프로세스가 Critical Section 진입을 무한정 기다리고 있고, Critical Section 에서 실행되는 프로세스는 진입 대기 중인 프로세스가 실행되야만 빠져나올 수 있는 상황

'CS > 운영체제' 카테고리의 다른 글

Sync / Async, Block / Non-block 차이점  (0) 2022.01.18
Thread-Safe란 무엇일까?  (0) 2022.01.17
Process/Thread 정리, 차이점  (0) 2021.12.04