[OS] Mutex vs Semaphore

Jay Lee·2022년 12월 26일
0

OS

목록 보기
1/2

Thread-Safe

스레드 안전(Thread Safety)은 멀티 스레드 프로그램이에서 일반적으로 어떤 공유 자원에 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없음을 의미합니다.
Thread Safe를 지키기위한 방법은 네 가지로 이루어져 있습니다.

  • Mutual Exclusion (상호 배제)
  • Atomic Operation (원자 연산)
  • Thread-local Storage (쓰레드 지역 저장소)
  • Re-entrancy (재진입성)

Mutual Exclusion (상호 배제)

  • 공유자원에 하나의 스레드만 접근할 수 있도록, 뮤텍스/세마포어로 락을 통제하는 방법입니다.
  • ex) Python의 경우 Thread Safe하게 메모리관리를 하지 않기 때문에 GIL을 사용해 Thread Safe를 보장한다.

Atomic Operation (원자 연산)

  • 공유 자원에 원자적으로 접근하는 방법
  • 공유 자원 변경에 필요한 연산을 원자적으로 분리한 뒤, 실제로 데이터 변경이 이루어시는 시점에 Lock을 거는 방법

Thread-local Storage (쓰레드 지역 저장소)

  • 공유 자원의 사용을 최대한 줄이고, 각각의 쓰레드에서만 접근 가능한 저장소들을 사용함으로써 동시 접근을 막는 방법입니다.

Re-entrancy (재진입성)

  • 스레드 호출과 상관없이 프로그램에 문제가 없도록 작성하는 방법

Mutex(뮤텍스)

공유된 자원(Critical Section) 등에 하나의 Process 혹은 Thread가 접근하는 것을 막아줌(동기화 대상이 하나밖에 없을 때)

Key를 이용한 상호배제 기법으로 Key에 해당하는 객체를 생성하고 해당 객체를 소유한 스레드/프로세스만이 공유 자원에 접근할 수 있도록 한다.
이 때, 만약 키를 자신이 취할 수 있으면 아무도 공유 자원에 접근 중이지 않다는 것을 의미한다. 만약 2개 이상의 스레드가 Key를 받기위해 대기 중이라면 어떻게 할까?

Semaphore(세마포어)


공유된 자원(Critical Section)에 여러 Process or Thread가 접근하는 것을 막아줌 (동기화 대상이 하나 이상)

사용하고 있는 Thread/Process 수를 공통으로 관리하는 하나의 값을 이용해 상호 배제를 구현한다. 공유자원에 접근할 수 있는 프로세스의 최대 허용치만큼 동시에 사용자가 접근할 수 있으며, 각 프로세스는 세마포어의 값을 확인하고 변경할 수 있다.
자원을 반환할 때, 대기하던 프로세스가 즉시 자원을 사용하고, 이미 다른 프로세스에 의해 사용중이면, 일정 시간 대기 후 재시도하게 된다.

Mutex와 Semaphore의 차이점

  • 가장 큰 차이점은 동기화 대상의 개수이다. Mutex의 경우 동기화 대상이 오직 1개일 때, 가용하며 Semaphore의 경우 동기화 대상이 여러개일 때 사용한다.
  • Mutex의 경우 Key를 사용하여 해당 자원을 소유하지만 Semaphore의 경우 공통 값을 활용해 자원에 접근한다.
  • Mutex는 상태가 0과 1뿐이기 때문에 하나의 스레드에서 Lock을 걸고 나면 해당 스레드만이 이 Mutex를 해제할 수 있지만 Semaphore의 경우 그렇지 않다.
profile
Data Engineer

0개의 댓글