CS

임계구역

baek-dev 2025. 5. 14. 13:02

임계구역(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