공유 자원(shared resource)은 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 모니터, 프린터, 메모리, 파일, 데이터 등의 자원이나 변수 등을 의미한다.
👉 이 공유 자원을 두 개 이상의 프로세스가 동시에 읽거나 쓰는 상황을 경쟁 상태( race condition)라고 한다. 동시에 접근을 시도할 때 접근의 타이밍이나 순서 등이 결괏값에 영향을 줄 수 있는 상태.
이와 같이 A와 B가 동시에 접근하여 타이밍 서로 꼬여 정상 결괏값은 300인데 200이 출력된다.
둘 이상의 프로세스 또는 스레드가 공유자원에 접근할 때 순서 등의 이유로 결과가 달라지는 '코드'영역
1) 임계 영역을 해결하기 위한 방법은 크게 뮤텍스, 세마포어, 모니터 세 가지가 있다.
👉 모두 상호 배제, 한정 대기, 융통성이란 조건을 만족한다.
2) 상호 배제 : 한 프로세스가 임계 영역에 들어갔을 때 다른 프로세스는 들어갈 수 없다.
3) 한정 대기 : 특정 프로세스가 영원히 임계 영역에 들어가지 못하면 안된다.
4) 융통성 : 한 프로세스가 다른 프로세스의 일을 방해해서는 안된다.
5) 잠금(lock) : 임계 영역을 화장실에 비유하여 A라는 사람이 문을 잠그고 나오면 그 다음 사람이 쓸 수 있다.
1) 뮤텍스
스레드가 공유 자원을 lock()을 통해 잠금설정하고 사용한 후에 unlock()을 통해 잠금해제하는 객체
👉 잠금이 설정되면 다른 스레드는 잠긴 코드 영역에 접근할 수 없고 해제는 그와 반대이다. 뮤텍스는 잠금 또는 잠금해제라는 상태만 가진다.
2) 세마포어
일반화된 뮤텍스로, 간단한 정수 값과 두 가지 함수 wait(p 함수) 및 signal(v 함수)로 공유 자원에 대한 접근을 처리
👉 wait()는 자신의 차례가 올 때까지 기다리는 함수, signal()은 다음 프로세스로 순서를 넘겨주는 함수
👉 프로세스가 공유 자원에 접근하면 세마포어에서 wait 작업을 수행하고 프로세스가 공유 자원을 해제하면 signal 작업을 수행한다.
❓ 뮤텍스와 차이점 : 세마포어에는 조건변수가 없고 프로세스가 세마포어 값을 수정할 때 다른 프로세스는 동시에 세마포어 값을 수정할 수 없다. 뮤텍스는 한 개의 프로세스 또는 스레드만의 임계영역접근을 처리하지만 세마포어는 여러 개의 임계영역접근을 처리할 수 있다.
바이너리 세마포어 : 0과 1의 두 가지 값만 가질 수 있는 세마포어이다.
👉 뮤텍스와 유사해보이지만, 뮤텍스는 잠금을 기반으로 상호배제가 일어나는 잠금 메커니즘이 들어간 객체이고, 세마포어는 신호를 기반으로 상호배제가 일어나는 신호메커니즘이 들어간 객체이다.
✅ 신호메커니즘은 폰으로 노래를 듣다가 친구로부터 전화가 오면 노래가 중지되고 통화 처리작업에 관한 인터페이스가 등장하는 것을 상상하면 된다.
카운팅 세마포어 : 카운팅 세마포어는 여러 개의 값을 가질 수 있는 세마포어이며, 여러 자원에 대한 접근을 제어하는 데 사용된다.
둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유자원을 숨기고 해당 접근에 대해 인터페이스만 제공한다.
👉 모니터큐를 통해 공유 자원에 대한 작업들을 순차적으로 처리한다.
두개 이상의 프로세스들이 서로가 가진 자원을 기다리며 중단된 상태
👉 예를 들어 프로세스 A가 프로세스 B의 어떤 자원을 요청할 대 프로세스 B도 프로세스 A가 점유하고 있는 자원을 요청한다.
1) 원인
2) 해결방법
출처 : 면접을 위한 CS전공지식 노트 (책 / 강의)