공유자원
- 공유자원이란 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 자원이나 변수 등을 의미
ex) 모니터, 프린터, 메모리, 파일, 데이터
- 공유자원을 두 개 이상의 프로세스(스레드)가 동시에 읽거나 쓰는 상황을
경쟁 상태(race condition)이라고 함
동시에 접근을 시도 할 때 접근의 타이밍이나 순서 등이 결괏값에 영향을 줄 수 있는 상태
ex) 책의 예시, 우리 프로젝트에서의 좋아요, 티켓팅, 은행 입출금 등등
임계 영역
- 둘 이상의 프로세스, 스레드가 공유 자원에 접근할 때 순서 등의 이유로 결과가 달라지는 코드 영역
- 임계 영역을 해결하기 위한 방법으로는 뮤텍스, 세마포어, 모니터가 있음(lock 매커니즘을 토대로함)
- 위 방법 모두 상호 배제, 한정 대기, 융통성이란 조건을 만족함
상호배제(mutual exclusion)
- 한 프로세스가 임계 영역에 들어갔을 때 다른 프로세스는 들어갈 수 없다.
한정 대기(bounded waiting)
- 특정 프로세스가 영원히 임계 영역에 들어가지 못하면 안된다.
융통성(progress)
- 만약 어떠한 프로세스도 임계 영역을 사용하지 않는다면 임계 영역 외부의 어떠한 프로세스도 들어갈 수 있으며
이 때 프로세스끼리 서로 방해하지 않는다.
뮤텍스
- 프로세스나 스레드가 공유 자원을 lock()을 통해 잠금 설정하고
사용한 후에는 unlock()을 통해 잠금 해제하는 객체
→ 동시에 하나의 프로세스나 스레드만 공유자원을 점유하도록 보장
- 잠금 또는 잠금 해제라는 상태만을 가짐
- 장점
- 단순하고 이해하기 쉬우며, 임계 영역 접근을 엄격하게 제어할 수 있음
- 단점
- 데드락(Deadlock) 발생 가능성이 있으며, 스레드가 뮤텍스를 잡고 있을 때 다른 스레드는 대기 상태가 되어 자원 활용도가 낮아질 수 있음
세마포어
- 세마포어는 일반화된 뮤텍스
- 간단한 정수 값과 wait(P함수), signal(V함수)함수로 공유 자원에 대한 접근을 처리
- wait()은 자신의 차례가 올 때까지 기다리는 함수(0 < 세마포어 값 이면 세마포어 값 -1, 자원에 접근)
- signal()은 다음 프로세스로 순서를 넘겨주는 함수(공유자원의 사용을 마치면 세마포어 값 +1)
- 작동원리
- 세마포어는 원자적(Atomic)으로 제어되는 정수 변수로, 일반적으로 세마포어의 값이 0이면 자원에 접근할 수 없도록 블럭(Block) 하고 0보다 크면 접근함과 동시에 세마포어의 값을 1 감소시킴
- 반대로 종료하고 나갈 때에는 세마포어의 값을 1 증가시켜 다른 프로세스가 접근할 수 있도록 함