CS/운영체제
동기화 문제의 해결책 (Mutex, Semaphore)
쌩욱
2021. 12. 13. 23:31
동기화 문제
- 동기화 : 한정적인 시스템 자원에 여러 스레드가 동시에 접근해서 사용하면 문제가 발생할 수 있다. 이 문제를 방지하기 위해 여러 스레드에게 하나의 자원에 대한 처리 권한을 주거나 순서를 조정하는 기법이다.
임계 영역 (Critical Section)
- 동일한 자원을 동시에 접근하는 작업(ex. 공유 변수)을 실행하는 코드 영역을 임계영역 (Critical Section)이라고 한다.
동기화 기법
- 유저 모드의 동기화
- 커널의 힘을 빌리지 않는 동기화 기법(커널의 코드가 실행되지 않음.)
- 성능상 이점이 있으나 기능상의 제한이 존재.
- 임계 구역 기반의 동기화, 인터락 함수 기반의 동기화.
- 커널 모드의 동기화
- 커널에서 제공하는 동기화 기능을 이용하는 방법.
- 커널 모드로의 변경이 필요하고 이는 성능 저하로 이어진다. 그러나 다양한 기능을 활용할 수 있다.
- 세마포어, 뮤텍스, 모니터 등
뮤텍스(Mutex, Mutal Exclusion)
- 공유된 자원의 데이터를 여러 프로세스, 스레드가 접근하는 것을 막는 방법
- Lock, Unlock을 사용하여 Lock을 소유한 스레드만 공유 자원에 접근할 수 있고, Lock을 반납할 수 있다.
- 뮤텍스 객체를 두 스레드가 동시에 사용할 수 없음 (상호 배제)
세마포어 (Semaphore)
- 공유된 자원의 데이터를 여러 프로세스, 스레드가 접근하는 것을 막는 방법
- OS가 동시에 접근할 수 있는 '허용 가능한 갯수'를 가지고 있는 Counter를 사용해 관리
- 세마포어 Counter의 갯수에 따라 다음과 같이 나뉜다.
- 1개 : Binary Semaphore(뮤텍스와 같다.)
- 2개 이상 : Counting Semaphore
- Counter의 개수만큼 동시에 사용자가 접근하여 사용할 수 있다.
뮤텍스와 세마포어의 차이점
- 동기화 대상의 개수
- Mutex는 동기화 대상이 하나, Semaphore는 동기화 대상이 하나 이상일 때 사용
- Semaphore는 소유할 수 없는 반면, Mutex는 소유가 가능하다.
- Semaphore를 소유하지 않는 다른 스레드가 Semaphore를 해제할 수 있다.
문제점
Deadlock(교착상태)
- 둘 이상의 프로세스가 Critical Section 진입을 무한정 기다리고 있고, Critical Section 에서 실행되는 프로세스는 진입 대기 중인 프로세스가 실행되야만 빠져나올 수 있는 상황