공유 자원 & 임계 영역(Semaphore & Mutex)
동기화(Synchronization)
- 여러 프로세스/스레드를 동시에 실행해도 공유 데이터의 일관성을 유지하는 것
- 실행 순서 제어 : 프로세스를 올바른 순서대로 실행
- 상호 배제 : 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근
공유 자원과 임계 구역
공유 자원(Share Section)
- 공유 자원은 여러 프로세스나 스레드가 동시에 접근하거나 사용할 수 있는 자원
- 전역 변수, 파일, 입출력장치, 보조기억장치, 네트워크 소켓
- 특징
- 자원을 공유할 경우, 잘못된 동기화로 인해 데이터의 일관성이 깨질 수 있다.
- 예: 한 스레드가 공유 자원을 읽는 동안 다른 스레드가 해당 자원을 수정하면 데이터가 손상될 수 있다. 👉 경쟁 상태(Race Condition)
경쟁 상태(Race Condition) 두 개 이상의 스레드가 동시에 공유 자원에 접근하면서 올바른 실행 순서가 보장되지 않아 데이터 불일치 또는 손상이 발생하는 것 (예: 은행 계좌 입금 처리 중 두 명이 동시에 입금하면 최종 금액이 올바르지 않을 수 있음)
임계 구역(Critical Section)
- 공유 자원에 접근하고 수정하는 코드 영역
- 자원의 일관성을 위해 한 번에 하나의 스레드만 실행할 수 있어야 한다. → 상호 배제
- 임계 구역을 보호하기 위한 대표적인 도구로 뮤텍스(Mutex)와 세마포(Semaphore)가 있다.
Mutex
- 한 번에 하나의 스레드만 공유 자원(임계 영역)에 접근할 수 있도록 보장하는 동기화 도구
- 특징
- 스레드가 락을 획득하면 다른 스레드는 대기.
- 사용 후 반드시 Unlock해야 함.
- 주로 단일 자원의 보호에 사용.
동작 원리
- Lock
- 스레드는 임계 영역에 접근하기 전에 뮤텍스에 락을 요청한다.
- 락이 획득되면 스레드는 자원에 접근한다.
- 임계 영역 실행
- 스레드는 공유 자원을 사용하거나 처리한다.
- Unlock
- 스레드가 자원 사용을 마치면 락을 해제하여 다른 스레드가 자원을 사용할 수 있도록 한다.
- 대기(WAIT)
- 만약 자원이 이미 다른 스레드에 의해 락이 걸려 있다면, 새로운 스레드는 해제될 때까지 대기 한다.
acquire();
{ 임계 구역 }
release();
acquire() {
while(lock == true) {}
lock = true;
// 임계 구역에 진입
}
release() {
lock == false;
// 임계 구역 해제
}
acquire()
- 락 요청. 자원 사용 가능 시 진입.
release()
- 락 해제. 다른 스레드가 접근 가능하도록 허용.
Semaphore
- 하나 이상의 스레드가 자원에 접근할 수 있도록 제한하는 동기화 도구
- 공유 자원이 여러 개 있는 경우에도 적용 가능
- 특징
- 카운터 기반: 특정 개수의 허용 가능한 자원 개수를 관리한다.
- 프로세스의 순서를 정할 수 있다.
동작 원리
int value = 3; // 사용 가능한 공유 자원의 개수
wait();
{ 임계 구역 }
signal();
wait() {
while(value <= 0) {}
value--;
// 자원 사용
}
signal() {
value++;
}
wait()
- 자원이 없으면 대기 상태로 진입.
- 자원이 있으면 카운터 감소 후 접근 허용.
signal()
- 자원을 반환하고 카운터 증가.
항목 | Mutex | Semaphore |
---|---|---|
자원 개수 | 1개 (Binary, 락/언락) | 여러 개 (카운트 기반) |
사용 목적 | 단일 공유 자원 보호 | 제한된 자원 관리 |
소유권 | 소유권 있음 (락을 획득한 스레드만 해제) | 소유권 없음 (누구나 해제 가능) |
상호 배제만 필요하다면 뮤텍스를, 작업 간의 실행 순서 동기화가 필요하다면 세마포를 권장한다.
사용 사례
- Mutex
- 파일 시스템 접근
- 하나의 프로세스가 파일을 읽거나 수정할 때 다른 프로세스 접근 차단.
- 프린터 공유
- 출력 장치 접근을 순차적으로 관리.
- 파일 시스템 접근
- Semaphore
- 서버 연결 풀 관리
- DB 연결을 제한된 개수로 유지하여 과부하 방지.
- 리소스 대기열 관리
- 제한된 자원(예: API 호출)에 대한 접근 동시 처리.
- 서버 연결 풀 관리
참고
https://hapen385.tistory.com/55
https://www.youtube.com/watch?v=0YDjblJn30k
https://www.youtube.com/watch?v=gTkvX2Awj6g
https://www.youtube.com/watch?v=4u13f9Umq7Y&t=58s
https://mierminusone.tistory.com/4
https://one-armed-boy.tistory.com/entry/Mutex-Semaphore
https://www.javatpoint.com/mutex-vs-semaphore