임계구역(Critical Section)이란?
임계구역(Critical Section) 은 둘 이상의 스레드 또는 프로세스가 동시에 접근하면 안 되는 공유 자원(변수, 메모리, 파일 등)을 접근하는 코드 영역을 의미함.
여러 작업(스레드)이 이 구역을 동시에 실행하면 데이터 충돌, 레이스 컨디션(race condition), 이상 동작이 발생할 수 있기 때문에, 서로 배타적으로 접근하도록 제어해야 함.
1. 왜 임계구역이 필요한가?
멀티스레드 환경에서는 다음과 같은 문제가 발생함:
- 여러 스레드가 공유 변수에 동시에 접근함
- 한 스레드가 값을 수정하는 도중 다른 스레드가 동일 변수에 접근함
- 결과적으로 예상치 못한 값, 데이터 손실, 프로그램 오작동이 발생함
→ 이런 충돌을 막기 위해 '임계구역'을 정의하고, 한 번에 하나의 스레드만 들어올 수 있게 막아야 함
2. 임계구역 예시 (Java)
public class Counter {
private int count = 0;
public void increment() {
// 임계구역
count++;
}
public int getCount() {
return count;
}
}
멀티스레드 환경에서 increment() 를 여러 스레드가 동시에 호출하면 count 값이 꼬일 수 있음.
→ 임계구역을 보호하지 않으면 레이스 컨디션 발생
3. 임계구역 보호 방법 (동기화)
Java 예시 – synchronized 키워드
public synchronized void increment() {
count++;
}
또는 블록 단위로:
public void increment() {
synchronized(this) {
count++;
}
}
→ 한 스레드가 synchronized 블록 안으로 들어가면, 다른 스레드는 대기 상태가 됨
→ 동시 접근을 직렬화 하여 충돌 방지
4. 임계구역 제어를 위한 동기화 도구
도구 | 설명 |
synchronized (Java) | 자바 내장 키워드, 가장 기본적인 동기화 수단 |
ReentrantLock | 보다 세밀한 제어 가능 (타임아웃, tryLock 등) |
Semaphore | 제한된 수의 스레드만 접근 허용 |
volatile | 메모리 가시성만 보장, 동기화는 못 함 |
AtomicInteger | 락 없이 CAS 기반으로 안전한 연산 가능 |
Mutex, SpinLock | OS 또는 라이브러리 수준에서 사용하는 락 |
5. 임계구역 문제 – 레이스 컨디션(Race Condition)
임계구역이 제대로 보호되지 않으면, 여러 스레드가 동시에 공유 자원을 조작하면서 예기치 못한 결과가 발생함 → 이를 레이스 컨디션이라 함
예:
- 두 명이 동시에 같은 상품을 장바구니에 담으면서 재고가 음수가 됨
- 로그인 횟수 제한 로직이 무시됨
6. 임계구역 최소화 전략
임계구역은 너무 넓으면 성능 저하, 너무 좁으면 안정성 저하가 발생함 → 다음 원칙을 따름:
- 꼭 필요한 코드만 임계구역에 포함함
- 가능한 빠르게 실행되도록 작성함
- 락 획득/해제 시 예외 처리 철저히 해야 함
- 데드락(deadlock) 방지를 위해 락 순서에 주의함
7. 실무 적용 예시
사례 | 설명 |
웹 서버 로그인 횟수 증가 | 동시 접속 시 카운트 누락 방지 필요 |
Redis 카운터 증가 | INCR 같은 원자적 명령 사용하여 임계구역 대체 |
주문 시스템의 재고 차감 | 동시 주문으로 인한 재고 마이너스 방지 |
파일 쓰기 작업 | 파일 하나를 동시에 여러 스레드가 쓰지 않도록 제어 |
정리
임계구역(Critical Section) 은 여러 스레드가 동시에 접근하면 문제가 생기는 공유 자원에 대한 접근 코드를 의미함.
이를 보호하지 않으면 데이터 충돌, 레이스 컨디션, 예외 발생 등의 문제가 발생하며,
Lock, synchronized, atomic 등 다양한 동기화 기법을 통해 하나의 스레드만 진입하도록 제어해야 함.
성능과 안전성 모두를 고려해 적절한 범위와 방식으로 임계구역을 설정하는 것이 중요함.
출처 : ChatGPT
'CS' 카테고리의 다른 글
ConcurrentHashMap (1) | 2025.05.19 |
---|---|
분산락 (0) | 2025.05.15 |
Gof 디자인 패턴 (0) | 2025.05.13 |
세션 (0) | 2025.05.11 |
쿠키 (0) | 2025.05.10 |