- 동기화란 무엇인지 알아본다.
- 공유 자원과 임계 구역 문제를 이해한다.
- 임계 구역 문제를 해결하기 위한 동기화 기법들을 학습한다.
동기화란 작업들 사이의 수행 시기를 맞추는 것
| 동기화의 종류 | |
|---|---|
| 실행 순서 제어 | 프로세스를 올바른 순서대로 실행하기 |
| 상호 배제 | 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기 |
특정 조건이 만족되어야만 실행을 이어나갈 수 있음 ➡ 동시에 실행되는 프로세스를 올바른 순서대로 실행하는 것이 실행 순서 제어를 위한 동기화 상호 배제 : 공유가 불가능한 자원의 동시 사용을 피하기 위해 사용하는 알고리즘
공유 자원 : 여러 프로세스에서 사용하는 공동의 자원 (Ex. 전역 변수, 파일, 입출력장치, 보조기억장치 등)
임계 구역 : 공유 자원 중 두 개 이상의 프로세스를 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역
레이스 컨디션 : 잘못된 실행으로 인해 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 문제가 발생하는 경우
➡ 이는 레이스 컨디션을 야기함
이러한 문제가 발생하지 않도록 두 개 이상의 프로세스가 임계 구역에 동시에 접근하지 못하도록 관리하는 것이 상호 배제를 위한 동기화
세가지 원칙이 지켜져야 상호 배제를 위한 동기화를 할 수 있음
상호 배제 : 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없음진행 : 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 함유한 대기 : 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 함 (임계 구역에 들어오기 위해 무한정 대기하면 안 됨)
- 뮤텍스 락
- 세마포
- 모니터
동시에 접근해서는 안 되는 자원에 동시에 접근하지 않도록 만드는 도구. 즉, 상호 배제를 위한 동기화 도구
| 자물쇠 역할 | 프로세스들이 공유하는 전역변수 lock |
| 임계 구역을 잠그는 역할 | acquire 함수 |
| 임계 구역의 잠금을 해제하는 역할 | release 함수 |
임계 구역에 진입하기 전에 호출하는 함수
만약 임계 구역이 잠겨 있다면 임계 구역이 열릴 때까지 임계 구역을 반복적으로 확인하고, 임계 구역이 열려 있다면 임계 구역을 잠그는 함수
acquire() {
while ( lock == true )
;
lock = true;
}
바쁜 대기임계 구역에서의 작업이 끝나고 호출하는 함수
현재 잠긴 임계 구역을 열어주는 함수
release() {
lock = false;
}
➡ 즉, 뮤텍스 락을 이용하면 상호 배제를 위한 동기화를 할 수 있음
뮤텍스 락과 비슷하지만, 조금 더 일반화 된 방식의 동기화 도구
뮤텍스 락 : 하나의 공유 자원에 접근하는 프로세스를 상정한 방식
세마포 : 여러 개의 공유 자원이 있는 상황에서 적용가능한 동기화 도구
이진 세마포 와 카운팅 세마포 가 있는데 이진 세마포는 뮤텍스 락과 비슷한 개념 ➡ 이 글에선 카운팅 세마포를 다룸| 전역 변수 S | 임계 구역에 진입할 수 있는 프로세스의 개수(사용 가능한 공유 자원의 개수) |
| wait 함수 | 임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 함수 |
| signal 함수 | 임계 구역 앞에서 기다리는 프로세스에게 진입가능한 것을 알려주는 함수 |
wait()
//임계 구역
signal()
wait() {
while ( S <= 0 )
;
S--;
}
signal() {
S++;
}
바쁜 대기➡ 바쁜 대기를 반복하며 확인할 시간에 CPU는 더 생상성 있는 작업을 할 수 있으므로 이는 CPU 주기를 낭비한다는 점에서 손해
wait 함수는 만일 사용할 수 있는 자원이 없을 경우 해당 프로세스 상태를 대기 상태로 만들고, 그 프로세스의 PCB를 세마포를 위한 대기 큐에 넣음
임계 구역에 있던 프로세스의 작업이 끝나고 signal 함수를 호출하면 signal 함수는 대기 중이었던 프로세스를 대기 큐에서 제거하고, 프로세스 상태를 준비 상태로 변경한 뒤 준비 큐로 옮김
wait() {
S--;
if ( S < 0 ) {
add this process to Queue;
slepp();
}
}
signal() {
S++;
if ( S <= 0 ){
remove a process p from Queue
wakeup(p)
}
}
세마포에 비해 사용자가 사용하기 편리한 동기화 도구로 조건 변수를 사용함
공유 자원과 공유 자원에 접근하기 위한 인터페이스를 묶어 관리함
프로세스는 반드시 인터페이스를 통해서만 공유 자원에 접근하도록 함

➡ 모니터는 공유 자원을 다루는 인터페이스에 접근하기 위한 큐를 만들고, 모니터 안에 항상 하나의 프로세스만 들어오도록하여 상호 배제를 위한 동기화를 제공
특정 조건을 바탕으로 프로세스를 실행하고 일시 중단하기 위해 모니터는 조건 변수를 사용함
조건 변수 : 프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 특별한 변수
조건 변수는 wait와 signal 연산을 수행함

wait 연산 : 호출한 프로세스의 상태를 대기 상태로 전환하고, 일시적으로 조건 변수에 대한 대기 큐에 삽입
signal 연산 : 조건 변수에 대해 signal 을 호출하면 대기 상태에 있던 프로세스가 재개됨➡ 모니터는 조건 변수를 사용하여 프로세스 실행 순서 제어를 위한 동기화를 제공