프로세스 동기화 기법 - 뮤텍스, 세마포, 모니터
프로세스 동기화 기법 - 뮤텍스, 세마포, 모니터
핵심 내용 요약
- 동기화의 필요성: 프로세스 동기화를 통해 실행 순서를 제어하고
상호 배제를 보장함으로써 데이터 일관성과 정확성을 유지합니다. - 뮤텍스 락 (Mutex Lock): 하나의 프로세스만 임계 구역에 접근하도록 보장하는 도구.
- 세마포 (Semaphore): 다수의 자원에 대해 다수의 프로세스 접근을 관리하는 도구.
- 모니터 (Monitor): 조건 변수를 사용하여 상호 배제와 실행 순서 제어를 보다 편리하게 구현하는 도구.
동기화의 의미
동기화는 여러 프로세스가 협력하여 올바르게 실행되고 자원의 일관성을 보장하는 기법입니다.
동기화가 없다면 겉보기에는 문제가 없어 보이는 코드도 예기치 못한 방식으로 작동할 수 있습니다.
프로세스 동기화의 필요성
프로세스 동기화는 두 가지 주요 기능을 제공합니다:
- 실행 순서 제어: 프로세스를 올바른 순서대로 실행합니다.
- 상호 배제: 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 합니다.
뮤텍스 락 (Mutex Lock)
뮤텍스 락은 하나의 프로세스만 임계 구역에 접근하도록 보장하는 도구입니다.
예를 들어, 옷가게의 탈의실을 생각해볼 수 있습니다.
탈의실은 한 번에 한 명만 사용할 수 있으며, 사용 중일 때는 자물쇠가 걸려 있습니다.
마찬가지로 뮤텍스 락은 임계 구역에 자물쇠를 걸어 다른 프로세스가 접근하지 못하도록 합니다.
뮤텍스 락 구현
뮤텍스 락의 간단한 구현은 하나의 전역 변수와 두 개의 함수로 이루어집니다:
- 자물쇠 역할: 전역 변수
lock
- 임계 구역 잠금:
acquire
함수 - 임계 구역 잠금 해제:
release
함수
1
2
3
4
5
6
7
8
9
10
11
12
bool lock = false;
void acquire() {
while (lock == true) {
// 바쁜 대기 (busy waiting)
}
lock = true;
}
void release() {
lock = false;
}
세마포 (Semaphore)
세마포는 뮤텍스 락과 비슷하지만,
다수의 자원에 대해 다수의 프로세스 접근을 관리할 수 있는 더 일반적인 동기화 도구입니다.
세마포는 두 종류로 나뉩니다:
- 이진 세마포 (binary semaphore): 뮤텍스 락과 유사.
- 카운팅 세마포 (counting semaphore): 여러 개의 프로세스가 여러 개의 자원에 접근할 수 있도록 관리.
세마포 구현
세마포는 두 개의 함수로 구성됩니다:
- wait: 임계 구역에 진입하기 전 호출.
- signal: 임계 구역을 벗어날 때 호출.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int S = n; // n은 임계 구역에 진입할 수 있는 프로세스의 최대 개수
void wait() {
S--;
if (S < 0) {
// 대기 상태로 전환하고 대기 큐에 삽입
}
}
void signal() {
S++;
if (S <= 0) {
// 대기 큐에서 프로세스 제거하고 준비 상태로 전환
}
}
모니터 (Monitor)
모니터는 세마포보다 사용하기 편리한 동기화 도구입니다.
모니터는 공유 자원과 공유 자원에 접근하기 위한 인터페이스를 묶어 관리하며,
프로세스는 반드시 인터페이스를 통해서만 공유 자원에 접근할 수 있습니다.
모니터의 조건 변수
모니터는 조건 변수를 사용하여 특정 조건이 만족될 때까지 프로세스를 대기 상태로 만들고, 조건이 만족되면 다시 실행을 재개합니다.
1
2
3
4
5
6
7
8
9
monitor Example {
condition x;
void procedure() {
x.wait(); // 조건 변수가 충족될 때까지 대기
// 임계 구역
x.signal(); // 조건 변수가 충족되었음을 알림
}
}
확인 문제
- 뮤텍스 락과 세마포에 대한 설명으로 옳지 않은 것을 고르세요.
- 뮤텍스 락은 임계 구역을 잠근 뒤 임계 구역에 진입함으로써 상호 배제를 위한 동기화를 이룹니다.
- 세마포는 공유 자원이 여러 개 있는 상황에서도 이용할 수 있습니다.
- 세마포를 이용해 프로세스 실행 순서 제어를 위한 동기화도 이룰 수 있습니다.
- 세마포를 이용하면 반드시 바쁜 대기를 해야 합니다.
- 조건 변수 x와 y가 있다고 가정해 보겠습니다. 스레드 A는 실행 과정에서
x.wait
를 호출하였고, 스레드 B는y.wait
를 호출했습니다. 스레드 C가y.signal
을 호출했을 때 실행이 재개되는 스레드는 무엇일까요?- 스레드 ( )
- 빈칸에 들어갈 알맞은 말을 보기에서 골라 써 보세요. (실행 순서 제어, 상호 배제, 입출력장치)
- 세마포를 이용하면 동시에 실행되는 프로세스 혹은 스레드 간에
( ) 와 ( ) 를 위한 동기화를 할 수 있습니다.
- 세마포를 이용하면 동시에 실행되는 프로세스 혹은 스레드 간에
This post is licensed under CC BY 4.0 by the author.