📑 본 글은 <혼공컴운>을 읽고 정리한 글입니다.
동기화
상호 배제
를 위한 동기화 관련 고전 문제
생산자 프로세스 → ‘총합’ 변수 +1
소비자 프로세스 → ‘총합’ 변수 -1
함께 사용하는 총합
이라는 데이터를 동시에 사용하는데 소비자가 생산자 작업이 끝나기 전에 총합을 수정함.
→ 프로세스와 소비자 프로세스가 제대로 동기화되지 않았기 때문이다.
→ 동시에 접근해서는 안 되는 자원에 동시에 접근했기 때문이다.
공유 자원(shared resource)
임계 구역(critical section)
레이스 컨디션(race condition)
🔑 상호 배제를 위한 동기화
→ 두 개 이상의 프로세스가 임계 구역에 동시에 접근하지 못하도록 관리하는 것
3원칙
뮤텍스 락(MUTEX Lock: Mutual Exclusion Lock)
acquire
함수release
함수acquire() {
while (lock == true) // 임계 구역이 잠겨있으면
; // 잠겨있는지 반복적으로 확인 -> Busy wait
lock = true;
}
release() {
lock = false;
}
Busy Wait
: 임계 구역이 잠겨 있을 경우 프로세스는 반복적으로 lock을 확인한다.
세마포(Semaphore)
대기
상태로 만든다.준비 상태
로 변경, 준비 큐로
옮겨준다.wait() {
S--; // 명부 적고 감요
if (S < 0) // 사용할 수 있는 자원이 없으면
add this process to Queue; // 프로세스의 PCB를 세마포를 위한 대기 큐에 집어넣는다.
sleep(); // 프로세스 -> 대기 상태로
}
signal() {
S++; // 자원 반납합니다요
if (S <= 0) // 쓰고 싶은 사람이 있네
remove process p from Queue; // 대기 중인 프로세스를 대기 큐에서 제거
wakeup(p); // 프로세스 -> 준비 상태로
}
Semaphore for 실행 순서 제어를 위한 동기화
모니터(Monitor)
Monitor for 실행 순서 제어를 위한 동기화
아래의 개념은 모니터의 개념 혹은 모니터에 진입하기 위해 삽입되는 큐와는 다른 것이다.
조건 변수
사용: 프로세스나 스레드의 실행 순서를 제어하기 위해 사용wait()
: 호출한 프로세스의 상태 → 대기, 조건 변수에 대한 큐에 삽입한다.signal()
: wait을 호출해서 큐에 들어간 프로세스의 실행을 재개한다.