Skip to content

Latest commit

 

History

History
46 lines (43 loc) · 3.73 KB

뮤텍스와 세마포어.md

File metadata and controls

46 lines (43 loc) · 3.73 KB

세마포어와 뮤텍스

사전 지식

교착 상태(Deadlock)

교착 상태란?

두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태

발생 조건

  1. 상호 배제(mutual exclusion)
  2. 점유 대기(hold and wait)
  3. 비선점(no preemption)
  4. 순환 대기(circular wait) 네 가지 조건을 모두 만족하면 교착 상태가 발생

경쟁 조건(Race condition)

여러 프로세스나 스레드가 동시에 같은 데이터를 조작할 때 타이밍이나 접근 순서에 따라 결과가 달라질 수 있는 상황

공유 자원(Shared data or Critical data)

여러 프로세스나 스레드들이 공유하는 데이터

임계 영역(Critical section)

  • 공유 자원을 접근하는 코드 영역
  • 공유 데이터의 일관성을 보장하기 위해 둘 이상의 프로세스나 스레드가 동시에 접근해서는 안된다.
    1. 상호 배제(Mutual Exclution): 하나의 프로세스가 임계 영역에서 실행중이라면, 다른 프로세스는 해당 영역에 접근할 수 업어야 한다.
    2. 실행(Process): 임계 영역에서 실행중인 프로세스가 없을 때 들어가려는 프로세스가 여러 개라면 현재 대기중인 프로세스만이 진입 후보가 될 수 있고, 어느 것이 들어갈 것인지 결정해주어야 한다.
    3. 한정된 대기(Bounded Wating): 한 프로세스가 임계 영역에 진입 요청 후 받아들여질 때까지의 시간동안 다른 프로세스들이 임계 영역에 진입하는 횟수는 제한이 있어야 한다. 다른 프로세스들의 기아(Starvation) 상태를 막기 위함이다.

동기화(Synchronization)

여러 프로세스나 스레드를 동시에 실행해도 공유 데이터의 일관성을 유지하는 것

뮤텍스(Mutex)

여러 스레드를 실행하는 환경에서 자원에 대한 접근에 제한을 강제하기 위한 동기화 메커니즘

  • Boolean 타입의 Lock 변수를 사용한다. 따라서 1개의 공유자원에 대한 접근을 제한한다.
  • 공유자원을 사용 중인 스레드가 있을 때, 다른 스레드가 공유자원에 접근한다면 Blocking 후 대기 큐로 보낸다.
  • Lock 을 건 스레드만 Lock 을 해제할 수 있다.

세마포어(Semaphore)

멀티프로그래밍 환경에서 다수의 프로세스나 스레드가 n 개의 공유 자원에 대한 접근을 제한하는 방법으로 사용되는 동기화 기법

  • 세마포어 변수를 통해 wait, signal 을 관리한다. 세마포어 변수는 0 이상의 정수형 변수를 갖는다.
  • n 개의 공유자원에 대한 접근을 제한할 수 있으며 이를 계수 세마포어라고 한다. 접근 가능한 공유 자원의 수가 1개일 때는 이진 세마포어로 뮤텍스처럼 사용할 수 있다.
  • 큐에 연결된 스레드를 깨우는 방식에 따라 강성 세마포어(큐에 연결된 스레드를 깨울 때 FIFO 정책), 약성 세마포어(큐에 연결된 스레드를 깨울 때 순서를 특별히 명시하지 않음)로 구분된다.
  • Lock 을 걸지 않은 스레드도 Signal 을 보내 Lock 을 해제할 수 있다.

뮤텍스 vs 세마포어

  1. 가장 큰 차이점은 동기화 대상의 갯수이다.
    • Mutex는 동기화 대상이 only 1개일 때 사용
    • Semaphore는 동기화 대상이 1개 이상일 때 사용
  2. 세마포어는 뮤텍스가 될 수 있지만, 뮤텍스는 세마포어가 될 수 없다.
  3. Mutex는 자원 소유 가능 + 책임을 가지는 반면, Semaphore는 자원 소유 불가
  4. Mutex는 소유하고 있는 스레드만이 이 Mutex를 해제할 수 있다.
  5. Semaphore는 시스템 범위에 걸쳐 있고, 파일 시스템 상의 파일로 존재한다.