Semaphore & Mutex를 알아보자!

Karim·2022년 8월 18일
3

study

목록 보기
5/7
post-thumbnail

1. Critical Section 란

Critical Section

  • 둘 이상의 Thread가 한 공유 자원에 접근할 때, 오직 한 Thread만 접근을 허용해야 하는 경우 사용
  • 다른 프로세스가 접근할 수 없으므로 한 프로세스에 속한 스레드 간 동기화에만 사용
  • EX ) synchronized, Thread-safe Collection

2. DeadLock 란

DeadLock

  • multi-Thread 환경에서 하나의 thread가 공유 자원을 점유하고 있을 때, 나머지 thread들이 작업이 끝나기를 하염없이 기다리는 상태
  • 해결방안 : 한 자원에 대해 여러 Thread를 동시에 접근 가능하게 하는 기법 사용 => semaphore, mutex

    두 기법 모두 완벽한 기법은 아니다.
    이 기법들을 쓰더라도 데이터 무결성을 보장할 수 없으며 데드락이 발생할 수도 있다.
    하지만, 상호배제를 위한 기본적인 기법이며 여기에 좀 더 복잡한 매커니즘을 적용해 꽤나 우아하게 동작하는 프로그램을 구현할 수 있다.

✒️ DeakLock 발생 조건

  • 상호 배제 (Mutual Exclusion) : 한 자원에 대해 여러 쓰레드 동시 접근 불가
  • 점유와 대기 (Hold and Wait) : 자원을 가지고 있는 상태에서 다른 쓰레드가 사용하고 있는 자원 반납을 기다리는 것
  • 비선점 (Non Preemptive) : 다른 쓰레드의 자원을 실행 중간에 강제로 가져올 수 없음
  • 환형대기 (Circle Wait) : 각 쓰레드가 순환적으로 다음 쓰레드가 요구하는 자원을 가지고 있는 것

    위의 4가지 조건을 모두 충족할 경우 데드락이 발생
    반대로 말하면, 위 4가지 중 하나라도 충족하지 않을 경우 데드락을 해결할 수 있다는 뜻

3. Semaphore

Semaphore

  • 사전적 의미 : 신호를 보내는 것
  • Multi-Thread 환경에서 하나의 자원동시에 접근할 수 있는 Thread의 수제어할 수 있게 하는 기법
  • Counting semaphore : 현재 공유 자원에서 접근할 수 있는 2개 이상 Thread 수를 나타내는 값을 두는 기법
  • Binary semaphore : 현재 공유 자원에서 접근할 수 있는 Thread 수를 한 개로 처리하는 기법

✒️ Counting semaphore 처리 과정

  1. 공유 자원 access allow count 3 으로 초기 설정
  2. 프로세스 시작 -> Thread 5개 동작 시작
  3. Thread 0 접근 access allow count -1 / 현재 접근 가능한 수 2
  4. Thread 1 접근 access allow count -1 / 현재 접근 가능한 수 1
  5. Thread 2 접근 access allow count -1 / 현재 접근 가능한 수 0
  6. Thread 3 접근 access allow count -1 / 현재 접근 가능한 수 -1 이므로 (음수) !semaphore가 접근 차단!
  7. Thread 1 작업 종료 access allow count +1 / 현재 접근 가능한 수 1
  8. Thread 3 접근 access allow count -1 / 현재 접근 가능한 수 0
  9. Thread 4 접근 access allow count -1 / 현재 접근 가능한 수 -1 이므로 (음수) !semaphore가 접근 차단!
  10. ...

✒️ Binary semaphore 처리 과정

  1. 공유 자원 access allow count 무조건 1 으로 초기 설정
  2. 프로세스 시작 -> Thread 5개 동작 시작
  3. Thread 0 접근 access allow count -1 / 현재 접근 가능한 수 0
  4. Thread 1 접근 access allow count -1 / 현재 접근 가능한 수 -1 이므로 (음수) !semaphore가 접근 차단!
  5. Thread 0 작업 종료 access allow count +1 / 현재 접근 가능한 수 1
  6. Thread 1 접근 access allow count -1 / 현재 접근 가능한 수 0
  7. Thread 2 접근 access allow count -1 / 현재 접근 가능한 수 -1 이므로 (음수) !semaphore가 접근 차단!
  8. Thread 1 작업 종료 access allow count +1 / 현재 접근 가능한 수 1
  9. Thread 2 접근 access allow count -1 / 현재 접근 가능한 수 0
  10. ...

4. Mutex

Mutex

  • 사전적 의미 : mutual exclusion 상호 배제 약자
  • 현재 공유 자원에서 접근할 수 있는 Thread 수를 한 개로 처리하는 기법

✒️ Mutex 처리 과정

  1. 프로세스 시작 -> Thread 5개 동작 시작
  2. Thread 0 접근 mutex state : lock
  3. Thread 1 접근 lock 이기 때문에 차단 후 해당 스레드 대기 큐로 보냄
  4. Thread 0 작업 종료 mutex state : unlock
  5. Thread 1 접근 mutex state : lock
  6. Thread 2 접근 lock 이기 때문에 차단 후 해당 스레드 대기 큐로 보냄
  7. Thread 3 작업 종료 lock 이기 때문에 차단 후 해당 스레드 대기 큐로 보냄
  8. Thread 4 접근 lock 이기 때문에 차단 후 해당 스레드 대기 큐로 보냄
  9. ...

5. Mutex Semaphore 차이점

📝 차이점

  • 세마포어는 뮤텍스가 될 수 있지만(이진 세마포어) 뮤텍스는 세마포어가 될 수 없다.
  • 차이점 : 뮤텍스점유하고 있는 스레드unlock할 수 있지만, 세마포어점유하고 있지 않는(놀고 있는)스레드도 unlock을 할 수 있다.

📌 여담

  • 꾸준히 공부해야지!

📚 참고

profile
나도 보기 위해 정리해 놓은 벨로그

0개의 댓글