작업들 사이의 수행 시기를 맞추는 것
실행 순서 제어를 위한 동기화
: 프로세스를 올바른 순서대로 실행상호 배제를 위한 동기화
: 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기
여러 프로세스가 공동의 자원(공유 자원)을 두고 작업을 하는데, 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역을 임계 구역 이라고 합니다.
두 개 이상의 프로세스가 임계구역에 진입하고자 하면 둘 중 하나는 대기해야 합니다.
만약 잘못된 실행으로 인해 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 문제가 발생할 수 있는데, 이를 레이스 컨디션 이라고 합니다.
예를 들어 고급 언어는 실행 과정에서 저급 언어로 변환되어 실행되는데, 이때 실행 도중 문맥 교환이 일어날 수 있습니다.
운영체제는 상호 베제를 위한 동기화를 위해 이러한 임계 구역 문제를 세가지 원칙 하에 해결합니다.
상호 배제
: 한 프로세스가 임계구역에 진입했다면 다른 프로세스는 들어올 수 없다.진행
: 임계 구역에 어떤 프로세스도 없다면 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.유한 대기
: 임계 구역에 진입하고 싶은 프로세스는 언젠간 들어올 수 있어야 한다.
상호 배제를 위한 동기화 도구
임계 구역에 진입하는 프로세스는 뮤텍스 락을 이용해 임계 구역에 자물쇠를 걸어둘 수 있고, 다른 프로세스는 임계 구역이 잠겨 있으면 기다리고, 열려 있으면 진입할 수 있습니다.
acquire(){
while(lock == true) // 임계 구역이 잠겨 있다면
; // 잠겨 있나 반복적으로 확인
lock true; // 잠겨 있지 않다면 임계 구역 잠금
}
release() {
lock = false; // 임계 구역 작업이 끝났으니 잠금 해제
}
이는 마치 탈의실 문이 잠겨 있는지 쉴 새 없이 반복하며 확인해 보는 것과 같은데, 이런 대기 방식을 바쁜 대기(busy wait) 라고 합니다.
공유 자원이 여러 개 있는 상황에서도 적용이 가능한 동기화 도구.
한 사람만 들어갈 수 있는 탈의실이 3개 있어 3명이 동시에 탈의실 이용을 할수 있는 것과 같습니다.
락과 세마포는 문제점이 있는데, 바쁜 대기를 반복하며 CPU 주기가 낭비됩니다.
이를 위해 자원이 없을 경우 프로세스를 대기 상태로 만들고, 다른 프로세스가 작업이 끝나면 대기 중인 프로세스를 준비 큐로 옮깁니다.
wait(){
S--; // 사용 가능한 공유 자원의 개수 S
if (S < 0) {
add this process to Queue; // PCB를 대기 큐에 삽입
sleep(); // 대기 상태로 접어듬
}
}
signal() {
S++
if(S <= 0) {
remove a process p from Queue // 대기 큐에 있는 프로세스 p를 제거
wakeup(p) // 프로세스 p를 대기 상태에서 준비 상태로 만듬
}
}
세마포를 이용하면 동시에 실행되는 프로세스의 실행 순서도 제어할 수 있습니다.
세마포의 변수 S
를 0으로 두고 먼저 실행할 프로세스 뒤에 signal
함수, 다음에 실행할 프로세스 앞에 wait
함수를 붙이면 됩니다.
세마포는 매번 임계 구역에 앞뒤로 wait
와 signal
함수를 명시하는 문제점이 있습니다.
이에 최근에 등장한 동기화 도구가 모니터 입니다. 모니터는 공유 자원과 자원에 접근하기 위한 인터페이스를 묶어 관리합니다. 프로세스는 반드시 인터페이스를 통해 공유 자원에 접근할 수 있습니다.
인터페이스에 접근하기 위한 큐를 이용해 하나의 프로세스만 들어오도록 합니다.
특정 조건을 바탕으로 프로세스를 실행하고 일시 중단하기 위해 모니터는 조건 변수를 사용합니다.
모니터에 진입한 어떤 프로세스가 x.wait()
를 호출하면, 그 프로세스는 조건 변수 x에 대한 큐에 삽입되고 모니터는 다시 비게 됩니다.
wait
연산으로 일시 중지된 프로세스는 다른 프로세스의 signal
연산을 통해 실행이 재개될 수 있습니다. 어떤 프로세스가 x.signal()
을 호출하면, 대기 상태에 있던 프로세스가 깨어나 모니터 안으로 다시 들어올 수 있습니다.
- 특정 프로세스가 아직 실행될 조건이 되지 않았을 경우
wait
를 통해 실행을 중단- 특정 프로세스가 실행될 조건이 충족되었을 경우,
signal
을 통해 실행을 재개