여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일 등이다. 공동으로 이용되기 때문에 프로세스들의 접근 순서를 정하여 예상치 못한 문제가 발생되지 않도록 해야한다.
2개 이상의 프로세스가 공유 자원을 병행적으로 읽거나 쓰는 상황
multi thread 시스템에서 스레드가 공통의 변수를 바꾸거나 table을 업데이트 하거나 파일에 써서 생기는 코드의 한 부분. 즉, 공유 자원에 접근하는 코드의 영역을 말한다.
따라서 이 영역은 공유자원 접근 순서에 따라 실행 결과가 달라지는 프로그램의 영역이, 프로세스들이 동시에 작업하면 안되는 영역이기도 하다.
프로세스들이 서로 공유하는 자원을 동시에 변경하여 쓰고 읽는다면 동기화가 제대로 되지 않게 되는 문제를 임계구역 문제라고 한다. 이 문제를 해결하기 위해서는 세가지 조건이 필요하다
오류를 방지하기 위해 데이터데 대한 업데이트는 한 순간에 오직 한 스레드만 진행할 수 있다.
문제를 일으키는 스레드들 사이 누가 먼저 우선권을 가지고 자원에 접근하여 작업을 진행할 것인가에 대한 결정이 빠르게 이루어져야 한다. 프로세스의 진행이 다른 프로세스로 인해 방해받지 않아야 한다 (경직된 동기화, lockstep synchronization).
임계 구역에 유한 시간 내 접근을 해야한다는 의미로, 무한시간동안 아무도 접근을 하지 않는 경우 (교착 상태, deadlock)를 만들어서는 안된다.
Semaphore(n) : 전역변수 RS를 n으로 초기화 (n = 공유 가능한 자원의 수, RS = 현재 사용 가능한 자원의 수 저장)
P() : 잠금을 수행하는 코드
- RS가 0보다 크면(사용 가능한 자원이 있으면) 1만큼 감소시키고 임계구역 진입
- RS가 0보다 작으면 (사용 가능한 자원이 없으면) 0보다 커질 때까지 대기 (block())
V() : 잠금 해제와 동기화를 같이 수행하는 코드
- RS 값을 1 증가시키고 세마포어 큐에서 기다리는 프로세스에게 임계구역에 진입하라는 wake_up 신호 보냄
P()와 V()의 내부 코드는 검사와 지정을 사용하여 분리 실행되지 않고 완전히 실행되게 해야 함
문제점 : 사용자의 잘못된 사용으로 임계구역이 보호받지 못할 수 있음
- 프로세스가 세마포어를 사용하지 않고 바로 임계구역에 들어간 경우
- P()를 두 번 사용하여 wake_up 신호가 발생하지 않은 경우 (세마포어 큐의 프로세스들이 무한대기)
- P()와 V()를 반대로 사용하여 상호 배제가 보장되지 않은 경우
세마포어의 단점을 보완하는 방식으로, 공유자원을 숨기고 공유자원에 접근하기 위한 인터페이스만 제공한다.