공유 자원(Shared Resource)의 개념과 필요성
공유 자원(Shared Resource)이란 둘 이상의 프로세스 또는 스레드가 동시에 접근 가능한 시스템 자원을 말합니다. 예를 들어 다음과 같은 것들이 대표적인 공유 자원입니다.
- 메모리 변수
- 파일
- 프린터
- 네트워크 포트
- 데이터베이스 레코드
공유 자원은 시스템 자원의 효율적인 활용을 위해 필수적이지만, 동시에 접근 시 문제가 발생할 수 있습니다. 이러한 문제가 바로 경쟁 상태(Race Condition)의 근본 원인이 됩니다.
경쟁 상태(Race Condition)의 개념과 발생 원인
경쟁 상태란 둘 이상의 스레드 또는 프로세스가 동시에 공유 자원에 접근할 때, 실행 순서에 따라 프로그램의 결과가 달라지는 상황을 의미합니다.
경쟁 상태가 발생하는 이유
- 스레드가 동시에 자원에 접근해 값을 읽고 수정할 때
- 동기화 장치 없이 여러 작업이 병렬로 실행될 때
- 컨텍스트 스위칭이 중간에 발생하여 작업 순서가 뒤바뀔 수 있을 때
간단한 예시 (공유 변수 증가)
int counter = 0;
void increment() {
counter++; // 읽기 → 증가 → 쓰기
}
두 스레드가 동시에 counter++를 실행하면 다음과 같은 문제가 발생할 수 있습니다:
- 스레드 A가 counter를 읽고 증가 중인 사이, 스레드 B도 같은 값을 읽음
- 결과적으로 둘 다 같은 값을 저장하여, 실제로는 1만 증가해야 할 값이 중복 계산되어 잘못된 결과 발생
이런 상황을 방지하기 위해 임계 영역(Critical Section) 개념이 도입됩니다.
임계 영역(Critical Section)의 개념과 목적
임계 영역이란 하나의 프로세스 또는 스레드만 접근할 수 있도록 보장해야 하는 코드 영역입니다.
해당 영역에서는 공유 자원을 읽거나 쓰는 작업이 이루어지므로, 동시에 둘 이상의 스레드가 접근해서는 안 됩니다.
임계 영역의 목적
- 데이터 일관성 유지
- 경쟁 상태 방지
- 시스템 안정성 확보
임계 영역 구현 조건 (뮤텍스 기반)
- 상호 배제(Mutual Exclusion)
동시에 두 개 이상의 프로세스는 임계 영역에 들어갈 수 없습니다. - 진행(Progress)
임계 영역이 비어 있을 때, 대기 중인 프로세스 중 하나는 반드시 진입할 수 있어야 합니다. - 한정된 대기(Bounded Waiting)
어떤 프로세스도 무한정 대기해서는 안 됩니다.
임계 영역을 보호하는 동기화 기법
1. 뮤텍스(Mutex, Mutual Exclusion Object)
- 임계 영역을 진입할 수 있는 권한을 하나만 부여
- 락을 획득한 스레드만 임계 영역 진입 가능
pthread_mutex_lock(&lock);
// 임계 영역
pthread_mutex_unlock(&lock);
2. 세마포어(Semaphore)
- 공유 자원의 사용 가능 개수를 카운트
- wait()으로 자원 확보, signal()로 자원 반환
sem_wait(&sem); // 자원 획득
// 임계 영역
sem_post(&sem); // 자원 해제
3. 모니터(Monitor)
- 고급 언어에서 제공되는 동기화 추상화 객체
- 내부에서 락과 조건 변수 등을 자동 처리
synchronized void criticalSection() {
// 임계 영역
}
4. 스핀락(Spinlock)
- 락을 획득할 때까지 루프를 돌며 대기
- 짧은 시간 잠금일 경우 효율적이지만 CPU 낭비
실무에서의 공유 자원 및 임계 영역 적용 사례
1. 웹 서버 로그 처리
- 다중 요청이 동일한 로그 파일을 쓸 경우 뮤텍스를 이용해 순차적 접근 보장
2. 은행 계좌 시스템
- 동시에 여러 거래가 같은 계좌에 접근할 경우, 잔액 정보의 일관성을 보장해야 함
3. 데이터베이스 트랜잭션
- 여러 트랜잭션이 하나의 데이터 레코드에 접근할 때 락을 설정하여 충돌 방지
동기화 문제와 교착 상태(Deadlock)의 가능성
임계 영역을 잘못 관리하면 다음과 같은 문제가 발생할 수 있습니다.
- 교착 상태: 두 프로세스가 서로가 점유한 자원을 기다리며 무한정 대기
- 기아 상태(Starvation): 어떤 프로세스가 락을 획득하지 못해 계속 대기
- 우선순위 역전(Priority Inversion): 낮은 우선순위 스레드가 락을 점유하여 고우선순위 스레드가 기다리는 상황
이러한 문제를 예방하기 위한 설계가 동기화에서 매우 중요합니다.
면접 대비 질문과 답변 예시
Q1. 경쟁 상태란 무엇이며 어떻게 방지할 수 있나요?
A. 경쟁 상태는 여러 스레드가 동시에 공유 자원에 접근해 실행 순서에 따라 결과가 달라지는 문제입니다. 이를 방지하기 위해 뮤텍스나 세마포어로 임계 영역을 보호합니다.
Q2. 임계 영역의 조건에는 어떤 것이 있나요?
A. 상호 배제, 진행, 한정된 대기 조건이 만족되어야 합니다.
Q3. 뮤텍스와 세마포어의 차이는 무엇인가요?
A. 뮤텍스는 하나의 스레드만 진입 가능한 락 객체이고, 세마포어는 다수의 리소스를 카운트하여 제한된 동시 접근을 허용합니다.
Q4. 실무에서 공유 자원이 자주 사용되는 사례는 무엇인가요?
A. 웹 로그 파일, 데이터베이스, 캐시 메모리, 장치 드라이버 등 다양한 곳에서 사용됩니다.
정리
- 공유 자원은 프로세스 간 또는 스레드 간 동시에 접근 가능한 데이터나 자원을 의미합니다.
- 경쟁 상태는 공유 자원을 동시에 접근할 때 발생하는 문제로, 잘못된 결과나 시스템 오류를 유발할 수 있습니다.
- 임계 영역은 이러한 경쟁 상태를 방지하기 위한 보호 영역이며, 적절한 동기화 메커니즘이 필수입니다.
- 실무에서는 안정성과 성능 사이의 균형을 고려해 락 구조를 설계하고 적용해야 합니다.
- 면접에서는 동기화 방식 선택의 이유, 실무 예시, 문제 해결 경험 등을 명확하게 설명할 수 있어야 합니다.
'CS 공부일지 > 운영체제 공부일지' 카테고리의 다른 글
교착 상태란? 조건, 예시, 해결 방법 (0) | 2025.05.04 |
---|---|
동기화 기법 완전 이해: Mutex, Semaphore, Monitor (0) | 2025.05.04 |
IPC란 무엇인가? 프로세스 간 통신 방식 (0) | 2025.05.03 |
멀티프로세싱과 멀티스레딩 차이점 (1) | 2025.05.02 |
프로세스 상태란? Ready, Running, Waiting (0) | 2025.05.02 |