뮤텍스와 세마포어

Timo·2022년 8월 2일
0
post-thumbnail

임계영역 문제를 해결하기 위한 좀 더 높은 수준(higher-level)의 소프트웨어 전략으로 Mutex Locks, Semaphore, Monitor, Liveness가 있다.

6.5 뮤텍스 락(Mutex Lock)

  • mutex: mutual exclusion (상호 배제)
  • 상호배제를 제공하는 가장 간단한 동기화 방법
  • Lock을 사용한다.(열쇠 받고, 열쇠 반납하는 형식)
  • available 변수: Boolean 변수로 락을 획득할 수 있는 상황인지 확인하기 위해 사용한다.

acquire()

임계영역에 진입하기 전에 락(열쇠)을 획득해야 한다.

release()

임계영역을 빠져나온 후에는 락을 반납해야 한다.

💡 acquire(), release() 과정 모두 compare_and_swap 하드웨어 레벨의 연산을 사용하여 atomically 실행된다.

스핀락(Spinlock)

Busy Waiting(락을 획득하려고 무한 대기하는 것)을 사용하는 Mutex Lock
무한루프를 돌며 락의 상태를 확인하기 때문에 CPU를 낭비한다는 단점이 있다.
그러나 다음과 같은 일부 상황에서는 효율적이다.

  • CPU 코어가 여러 개(멀티코어)인 경우에는 다른 코어에서 대기하다가 컨텍스트 스위치 없이 바로 실행할 수 있다.
  • 임계영역에 진입하여 실행하는 작업 시간이 컨텍스트 스위치 시간보다 짧은 경우

6.6 세마포어(Semaphores)

시그널 메커니즘을 가진, 하나 이상의 프로세스/스레드가 임계영역에 접근 가능하도록 하는 장치

S

획득할 수 있는 락의 갯수를 가진 정수형 변수이다.

P - wait()

락이 전부 할당 되었을 때 (S <= 0) 해당 프로세스/스레드를 대기큐에서 대기하도록 하는 연산자이다.


S <= 0 즉, 획득할 수 있는 락이 남아있지 않은 경우 대기한다. 락이 반납되어 대기를 빠져나오면 락을 획득한 것이므로 S 변수의 값을 감소시킨다.

V - signal()

임계영역을 빠져나왔을 때 락을 반납하기 위해 사용하는 연산자이다.

락이 반납되었으므로 S 변수의 값이 증가한다.

이진 세마포어(Binary Semaphore)

S 값이 1인 세마포어, 1과 0의 상태밖에 없기 때문에 바이너리 세마포어라고 한다. 뮤텍스와 유사하다.

카운팅 세마포어(Counting Semaphore)

S 값이 N(1개 초과)인 세마포어, 복수개의 락을 관리한다. 여러 개의 인스턴스를 가진 자원에 사용할 수 있다.

profile
나는 매일 성장하는 사람

0개의 댓글