상호 배제를 구현하는 도구
전역 변수 lock
을 사용해서 둘 이상의 프로세스가 임계 구역에 동시에 접근할 수 없도록 구현
acquire()
함수를 임계 구역 진입 전에 호출하여 임계 구역 잠금 (lock
을 true
로 변경)
release()
함수를 임계 구역 작업이 끝난 뒤 호출하여 임계 구역 잠금 해제 (lock
을 false
로 변경)
프로세스는 lock
이 true
인 경우 임계 구역 잠금이 해제될 때까지 반복해서 확인하고, lock
이 false
가 되는 순간 acquire()
를 호출하며 임계 구역 진입
acquire() {
while (lock == true) // 1. 임계 구역이 잠긴 경우
; // 2. 열릴 때까지 반복해서 확인하고
(바쁜 대기)
lock = true; // 3. 열리면 임계 구역에 진입하며 잠금
}
release() {
lock = false; // 4. 작업이 끝난 뒤 잠금 해제
}
여러 개의 공유 자원에 대한 상호 배제를 구현하는 도구
종류
**대기 신호(wait)**와 **진입 신호(signal)**를 사용해서 임계 구역 관리
wait() {
while ( S <= 0 ) // 1. 진입 가능한 프로세스가 0개 이하라면
; // 2. 바쁜 대기하고
S--; // 3. 진입 가능 개수가 확보되면
S를 감소시키며 임계 구역 진입
}
signal() {
S++; // 4. 작업이 끝난 뒤 S를 1 증가시키며
다음 작업이 진입할 수 있게 함
}
S
를 사용해서 임계 구역에 진입 가능한 프로세스 개수 관리wait()
함수를 임계 구역에 진입할 때 호출
S
가 0 이하라면 진입 가능한 프로세스가 없으므로 바쁜 대기 실행S
가 0보다 커지면 S
를 1 감소시키며 임계 구역 진입signal()
함수를 임계 구역 작업이 끝난 뒤 호출
S
를 1 증가시키며 다른 프로세스가 진입할 수 있도록 함