OS/All

[OS] 뮤텍스(Mutex) & 세마포어(Semaphore)

0so0 2023. 9. 16. 19:00
728x90
반응형
SMALL

뮤텍스와 세마포어의 특징, 차이에 대한 정리

SMALL

임계 영역(Critical Section)

함수 내에 둘 이상의 스레드가 동시에 실행하면 문제를 일으키는 하나 이상의 문장으로 묶여있는 코드블록

쓰레드 동기화

  • 동일한 메모리 영역으로 동시 접근이 발생하는 상황에 필요
  • 동일한 메모리 영역에 접근하는 쓰레드의 실행 순서를 지정해야 하는 상황에 필요

뮤텍스(Mutex)

Mutual Exclution
임계영역에 여러 쓰레드의 동시접근을 허용하지 않는 기술
동기화 대상이 하나일때 사용

하기 두 함수를 통해 임계영역 보호

  • pthread_mutex_lock(pthread_mutex *mutex)
  • pthread_mutex_unlock(pthread_mutex *mutex)
pthread_mutex_lock(&mutex);
// 임계 영역 시작
// ...
// 임계 영역 끝
pthread_mutex_unlock(&mutex)

임계 영역의 시작과 끝을 감싸 사용 쓰레드가 임계영역을 빠져나갈 때까지 블로킹

* unlock이 호출 되지 않았을 때, lock 함수가 블로킹 상태에서 빠져나가지 못하는 Dead-Lock 상태에 주의해야 함

세마포어(Semaphore)

임계영역에 여러 프로세스, 쓰레드의 동시접근을 허용하지 않는 기술
접근 순서를 동기화 해야할때 사용
동기화 대상이 하나 이상일때 사용

하기 두 함수를 통해 임계영역 보호

  • sem_post(sem_t *sem) 가 호출되면 세마포어 +1
  • sem_wait(sem_t *sem) 가 호출되면 세마포어 -1(세마포어 값은 0보다 작아질 수 없음)
sem_wait(sem_t *sem);
// 임계 영역 시작
// ...
// 임계 영역 끝
sem_post(sem_t *sem);

wait 호출 시 세마포어 값이 0이 되며 post가 불리기 전까지 다른 쓰레드에서 임계영역 진입을 막음

 

뮤텍스 & 세마포어 차이

  • 동기화 대상의 개수 - 뮤텍스 : 1개, 세마포어 : 1개 이상
  • 뮤텍스는 소유하고있는 쓰레드만이 뮤텍스 해제 가능, 세마포어는 다른 쓰레드가 세마포어 해제 가능
  • 뮤텍스는 자원을 소유할 수 있고, 책임을 가지는 반면 세마포어는 자원 소유가 불가
728x90
반응형
LIST

'OS > All' 카테고리의 다른 글

[OS] 메모리 구조(stack, heap)  (0) 2023.09.08
[OS] 빅 엔디안 & 리틀 엔디안  (0) 2023.09.05
[ETC] CRLF / LF /CR  (0) 2023.07.21
[OS] 프로세스(Process)/스레드(Thread)  (0) 2023.06.25