:공유 자원은(shared resource)은 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 모니터, 프린터, 메모리, 파일 데이터 등의 자원이나 변수 등을 의미한다.
경쟁 상태(race condition): 공유 자원을 두 개 이상의 프로세스가 동시에 읽거나 쓰는 상황
-> 동시에 접근을 시도할 때 접근의 타이밍이나 순서가 결괏값에 영향을 줄 수 있는 상태
: 임계 영역(critical section)은 둘 이상의 프로세스, 스레드가 공유 자원에 접근할 때 순서등의 이유로 결과가 달라지는 코드 영역을 말한다.
임계 영역을 해결하기 위한 방법
1. 뮤텍스
2. 세마포어
3. 모니터
이 방법 모두 상호 배제, 한정 대기, 융통성이라는 조건을 만족한다.
-> 토대가 되는 매커니즘은 잠금(lock)이다.
상호 배제(mutual eclusion): 한 프로세스가 임계 영역에들어갔을 때 다른 프로세스는 들어갈 수 없다.
한정 대기(bounded waiting): 특정 프로세스가 영원히 임계 영역에 들어가지 못하면 안 된다.
융통성(progress): 만약 어떠한 프로세스도 임계 영역을 사용하지 않는다면 임계 영역 외부의 어떠한 프로세스도 들어갈 수 있으며 이 때 프로세스끼리 방해하지 않는다.
뮤텍스
: 뮤텍스(mutex)는프로세스나 스레드가공유 자원을 lock()을 통해 잠금 설정하고 사용한 후에는 unlock()을 통해 잠금 해제하는 객체이다.
잠금, 잠금 해제라는 두 상태만 가진다.
세마포어
: 세마포어(semaphore)는 일반화된 뮤텍스이다.
간단한 정수 값과 두 가지 함수 wait(P 함수라고도 함), signal(V 함수라고도 함)로 공유 자원에 대한 접근을 처리한다.
wait() - 자신의 차례가 올 때 까지 기다리는 함수
signal() - 다음 프로세스로 순서를 넘겨주는 함수
1. 프로세스나 스레드가 공유 자원에 접근
2. 세마포어에서 wait()작업 수행
3. 프로세스나 스레드가 공유 자원을 해제
4. 세마포어에서 signal()작업 수행
세마포어에는 조건 변수가 없고 프로세스나 스레드가 세마포어 값을 수정할 때 다른 프로세스나 스레드는 동시에 그 값을 수정할 수 없다.
바이너리 세마포어
: 0, 1 두 가지 값만 가질 수 있는 세마포어이다.
구현의 유사성으로 인해 뮤텍스는 바이너리 세마포어라고 할 수 있지만 엄밀히 말하면 뮤텍스는 잠금을 기반으로 상호배제가 일어나는 '잠금 메커니즘'이고,
세마포어는 신호를 기반으로 상호 배제가 일어나는 '신호 메커니즘'이다.
카운팅 세마포어
: 여러 개의 값을 가질 수 있는 세마포어이며, 여러 자원에 대한 접근을 제어하는 데 사용한다.
모니터
: 둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유 자원을 숨기고 해당 접근에 대해 인터페이스만 제공한다.
모니터는 모니터큐를 통해 공유 자원에 대한 작업들을 순차적으로 처리한다.
모니터와 세마포어의 차이
: 모니터가 더 구현하기 쉽고 상호 배제가 자동이다.
세마포어에서는 상호 배제를 명시적으로 구현해야 한다.