시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 모니터, 프린터, 메모리, 파일, 데이터 등의 자원이나 변수를 의미
공동으로 이용되기 때문에 누가 언제 데이터를 읽거나 쓰느냐에 따라 결과가 달라짐
경쟁 상태: 공유자원을 두 개 이상의 프로세스가 동시에 읽거나 쓰는 상황
ex) 공유자원이 예금 10만원이 존재한다고 가정, 프로세스 P1은 예금 확인 후 10만원 더 입금하고 프로세스 P2는 예금 확인 후 5만원 더 입금한다고 가정
→ 결론적으로는 25만원이 되어야 하지만, 20만원이라는 맞지 않는 문제 발생
공유 자원 접근 순서에 따라 실행 결과가 달라지는 프로그램의 영역
상호 배제(mutual exclusion)
한 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역 들어갈 수 없음
ex) 주방에서 두 요리사가 한 믹서에 각자의 재료들을 한 번에 넣고 갈면 안됨
한정 대기(bounded waiting)<.span>
특정 프로세스가 영원히 임계 영역에 들어가지 못하면 안됨 ⇒ 무한 대기 X
ex) 한 요리사가 믹서를 계속 사용해서 다른 요리사가 믹서를 사용하지 못한 채 기다리게 해서는 안됨
진행의 융통성(progress flexibility)
한 프로세스가 다른 프로세스의 일을 방해하면 안됨
ex) 요리사 A와 B가 믹서를 번갈아 사용할 때, 요리사 B가 믹서를 사용한 후 요리사 A가 사용하든 안하든 믹서 사용할 때까지 기다려야하는 상황에서 요리사 B는 요리사 A의 작업 속도와 관계없이 믹서가 비어있으면 언제든 사용 가능해야 함
⇒ 뮤텍스, 세마포어, 모니터
lock
을 함lock 해제
하면서 다른 사람 사용하라는 동기화 신호
보냄 프로세스나 스레드가 공유 자원을 lock()
을 통해 잠금 설정하고 사용한 후에는 unlock()
을 통해 잠금 해제하는 객체
간단한 정수 값과 두 가지 함수 wait(P함수) 및 signal(V함수)로 공유 자원에 대한 접근 처리
wait()
: 자신의 차례가 올 때까지 기다리는 함수wait()
작업 수행signal()
: 다음 프로세스로 순서 넘겨주는 함수signal()
작업 수행1. Semaphore(n); //전역 변수 RS를 n으로 초기화(RS: 현재 사용 가능한 자원의 수)
2. P(); // if RS>0 then RS=RS-1; else block();
/*
임계구역
*/
3. V(); // RS=RS+1; wake_up();
Semaphore(n)에서 전역 변수 RS를 n으로 초기화
RS가 0보다 크면(=사용 가능한 자원이 있다면) 1만큼 감소시킨 후 임계 구역 진입
만약, RS가 0보다 작으면(=사용 가능한 자원이 없으면) 0보다 커질 때까지 대기
V()는 잠금해제와 동기화 같이 수행하는 코드, RS값 1로 증가 시킨 후 세마포어에서 기다리는 프로세스에게 임계구역 진입해도 좋다는 wake_up 신호 보냄
0과 1의 두 가지 값만 가질 수 있는 세마포어
❗️뮤텍스의 흐름과 비슷해 보이지만, 뮤텍스는 잠금을 기반으로 하는 ‘잠금 메커니즘’이고, 세마포어는 신호를 기반으로 하는 ‘신호 메커니즘’
여러 개의 값을 가질 수 있는 세마포어
Mutex
는 동기화 대상이 오직 1개일 때 사용하며, Semaphore
는 동기화 대상이 1개 이상일 때 사용Mutex
는 자원을 소유할 수 있고, 책임을 가지는 반면 Semaphore
는 자원 소유가 불가능Mutex
는 상태가 0, 1뿐이므로 Lock을 가질 수 있고 소유하고 있는 스레드만이 이 Mutex를 해제할 수 있다.Semaphore
는 Semaphore를 소유하지 않는 스레드가 Semaphore를 해제할 수 있다.Semaphore
는 시스템 범위에 걸쳐 있고 파일 시스템 상의 파일로 존재한다. 반면 Mutex
는 프로세스의 범위를 가지며 프로세스가 종료될 때 자동으로 Clean up 된다.[10분 테코톡] 🎲 와일더의 Mutex vs Semaphore
쉽게 배우는 운영체제
면접을 위한 CS 전공지식 노트