콘텐츠로 이동

임계구역 문제 (Critical Section Problem)

Jan 27, 2026

임계구역(Critical Section)이란 공유 데이터에 접근하는 코드 영역이다. 여러 프로세스가 동시에 임계구역을 실행하면 Race Condition이 발생하여 데이터 일관성이 깨질 수 있다. 임계구역 문제란, 이 영역을 안전하게 실행하기 위한 프로토콜을 설계하는 문제이다.

비유하면 화장실 칸이 하나인 상황과 같다. 한 명이 사용 중이면 다른 사람은 기다려야 하고, 비어 있으면 누군가는 반드시 들어가야 하며, 아무리 오래 기다려도 언젠가는 내 차례가 와야 한다.

while (true) {
/* entry section */ // 진입 구역: 임계구역 진입 허가 요청
critical section // 임계구역: 공유 데이터 접근
/* exit section */ // 퇴출 구역: 진입 허가 반납
remainder section // 나머지 구역
}

프로세스는 진입 구역에서 허가를 요청하고, 허가를 받으면 임계구역을 실행한 뒤, 퇴출 구역에서 허가를 반납한다. 이 프로토콜이 올바르려면 3가지 요구사항을 만족해야 한다.

요구사항설명화장실 비유
Mutual Exclusion (상호배제)한 프로세스가 임계구역 실행 중이면, 다른 프로세스는 진입 불가한 명만 사용 가능
Progress (진행)임계구역에 아무도 없고 진입 원하는 프로세스가 있으면, 진입 결정이 무한히 연기되면 안 됨비어있으면 누군가는 반드시 들어감
Bounded Waiting (유한대기)진입 요청 후, 다른 프로세스가 진입할 수 있는 횟수에 상한이 있어야 함아무리 오래 기다려도 언젠가는 내 차례

세 조건 중 하나라도 만족하지 못하면 올바른 해결책이 아니다.

유형특징장단점
Non-preemptive커널 모드에서 선점 불가Race condition 없음, 응답성 낮음
Preemptive커널 모드에서도 선점 가능응답성 높음, 설계 복잡, 실시간 시스템에 적합

비선점형 커널은 커널 모드에서 한 프로세스가 자발적으로 CPU를 반납할 때까지 다른 프로세스가 끼어들 수 없으므로, 커널 데이터에 대한 race condition이 본질적으로 발생하지 않는다. 하지만 응답성이 떨어져 현대 OS 대부분은 선점형 커널을 사용한다.

운영체제 내부에서 임계구역이 필요한 실제 상황:

  • fork() 시스템 콜: 새 프로세스에 PID를 할당할 때, 여러 프로세스가 동시에 fork()를 호출하면 같은 PID가 중복 할당될 수 있다
  • 열린 파일 목록 수정: 커널이 관리하는 파일 테이블에 동시 접근 시 일관성 문제 발생
  • 공유 메모리 업데이트: 두 프로세스가 동시에 같은 변수를 수정하면 결과가 예측 불가