- 뮤텍스, 세마포어, 모니터는 경쟁상태를 해결하는 대표적인 방법
- 이들은 상호배제, 한정대기, 진행의 융통성의 조건을 만족시키면서 경쟁상태를 해결함
✅ 상호배제
- Mutual Exclusion
- 한 프로세스가 임계영역에 들어갔을 때 다른 프로세스는 들어갈 수 없음
✅ 한정대기
- Bounded Waiting
- 임계영역에 진입하는 횟수에 제한을 두어, 특정 프로세스가 영원히 임계영역에 있는것을 방지함
✅ 진행의 융통성
- Progress
- 어떠한 프로세스도 임계영역을 사용하지 않는다면 임계영역의 외부의 어떠한 프로세스도 들어갈 수 있으며, 이때 프로세스끼리 서로 방해하지 않는 것
⭐ 뮤텍스
- 공유자원을
lock()
을 통해 잠금 설정하고 사용한 후에 unlock()
을 통해 잠금해제가 되는 객체 lock
을 기반으로 경쟁상태를 해결
- 잠금이 설정되면 다른 프로세스나 스레드는 임계영역에 접근 불가
- 한번에 하나의 프로세스만 임계영역에 존재
⭐ 세마포어
- 일반화된 뮤텍스를 의미함
- 정수
S
와 wait()
, signal()
로 공유자원에 대한 접근을 처리함
- 여러 프로세스가 동시에 임계영역에 접근가능
S
는 현재 쓸수 있는 공유자원의 수
wait()
는 S를 1씩 감소시키며, 프로세스가 임계영역에 들어간 상태, P( )라고도 함
signal()
은 S를 1씩 증가시키며 공유자원을 프로세스가 다 쓴 상태, V( )라고도 함
✅ 뮤텍스 VS 세마포어
- 뮤텍스는 잠금을 기반으로 상호배제가 일어나는
잠금 메커니즘
을 사용
- 세마포어는 신호를 기반으로 상호배제가 일어나는
신호 메커니즘
을 사용
⭐ 모니터
- 둘 이상의 스레드나 프로세스가 공유자원에 안전하게 접근할 수 있도록 공유자원을 숨기고 해당 접근에 대해
인터페이스를 제공
하는 객체
- 공유자원에 대한 작업들을 순차적으로 처리함
✅ 모니터 VS 세마포어
- 모니터는 구현하기 쉬우며,
한번에 하나의 프로세스
만 공유자원에 접근가능하며 인터페이스
를 기반으로 구축됨
- 세마포어는 구현하기 어려우며,
한번에 여러개의 프로세스
가 공유자원에 접근가능하며 상호배제를 명시적으로 구현
해야 함. 정수변수
를 기반으로 구축됨