💡 여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일등을 말한다. 공유 자원은 공동으로 이용되기 때문에 누가 언제 데이터를 읽거나 쓰느냐에 따라 그 결과가 달라질 수 있다. 따라서 프로세스들의 공유 자원 접근 순서를 정하여 예상치 못한 문제가 발생하지 않도록 해야한다.
💡 가장 단순한 방법은
잠금(lock)
을 이용하는 것이다. 임계구역에 들어갈 때 잠금을 걸고, 나올 때 잠금 해제와 동시에동기화 신호
를 보낸다.
turn
은 두 프로세스가 동시에 lock을 설정하여 임계구역에 못들어가는 상황에 대비하는 장치한계
// 공유 변수
boolean lock1 = false;
boolean lock2 = false;
int turn = 1;
// 프로세스 1
lock1 = true;
turn = 2;
while(lock2 == true && turn == 2);
/*** 임계구역 ***/
lock1 = false;
// 프로세스 2
lock2 = true;
turn = 1;
while(lock1 == true && turn == 1);
/*** 임계구역 ***/
lock2 = false;
한계
// 공유 변수
boolean lock1 = false;
boolean lock2 = false;
int turn = 1;
// 프로세스 1
lock1 = true;
while(lock2 == true) {
if(turn == 2) {
lock1 = false;
while(turn == 2);
lock1 = true;
}
}
/*** 임계구역 ***/
turn = 2;
lock1 = false;
// 프로세스 2
lock2 = true;
while(lock1 == true) {
if(turn == 1) {
lock2 = false;
while(turn == 1);
lock2 = true;
}
}
/*** 임계구역 ***/
turn = 1;
lock2 = false;
P(
)와 V()
의 내부 코드는 검사와 지정을 사용하여 분리 실행되지 않고 완전히 실행되게 해야한다.P()
나 V()
내부 코드가 실행되는 도중 다른 코드가 실행되면 상호 배제와 한정 대기 조건을 보장하지 못하기 때문한계
순서
Semaphore(n)
로 초기화를 한다. n
은 공유 가능한 자원의 수를 나타낸다. 전역변수 RS를 n으로 초기화 한다.P()
: 잠금을 수행하는 코드V()
: 잠금 해제와 동기화를 같이 수행하는 코드wake_up()
Semaphore(n); // RS = n;
P();
// if RS > 0 them RS = RS - 1
// else block()
/*** 임계구역 ***/
V();
// RS = RS + 1
// wake_up()
순서
P()
나 V()
를 사용하지 않고 모니터에 작업 요청을 한다.increase()
문을 사용wait()
: 모니터 큐에서 자신의 차례가 올때까지 기다린다. — P()
signal()
: 모니터 큐에서 기다리는 다음 프로세스에 순서를 넘겨준다. — V()