- 동기화란 무엇인지 알아본다.
- 공유 자원과 임계 구역 문제를 이해한다.
- 임계 구역 문제를 해결하기 위한 동기화 기법들을 학습한다.
동기화
란 작업들 사이의 수행 시기를 맞추는 것
동기화의 종류 | |
---|---|
실행 순서 제어 | 프로세스를 올바른 순서대로 실행하기 |
상호 배제 | 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기 |
특정 조건
이 만족되어야만 실행을 이어나갈 수 있음 ➡
동시에 실행되는 프로세스를 올바른 순서대로 실행하는 것이 실행 순서 제어를 위한 동기화
상호 배제
: 공유가 불가능한 자원의 동시 사용을 피하기 위해 사용하는 알고리즘
공유 자원
: 여러 프로세스에서 사용하는 공동의 자원 (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
을 호출하면 대기 상태
에 있던 프로세스가 재개됨➡ 모니터
는 조건 변수
를 사용하여 프로세스 실행 순서 제어를 위한 동기화를 제공