컴퓨터 과학

[운영체제] 동기화와 교착 상태 - 임계구역

Data Jun 2025. 11. 29. 21:16

운영체제를 공부하다 보면 반드시 등장하는 개념이 바로 **동기화(synchronization)**와 **교착(race condition, 임계 구역 문제)**입니다.
특히 멀티코어 환경에서는 여러 스레드가 동시에 실행되기 때문에 공유 자원을 안전하게 다루지 않으면 다양한 문제가 발생합니다.

이번 글에서는 아래 내용을 중심으로 살펴봅니다.

  • 공유 자원(shared resource)이 무엇인가
  • 임계 구역(critical section)이 왜 위험한가
  • 스레드 간 문맥 교환이 문제가 되는 이유
  • 레이스 컨디션(race condition)이 실제로 어떻게 발생하는가
  • 동기화가 필요한 이유

1. 공유 자원(shared resource)

공유 자원(shared resource)이란 여러 프로세스 혹은 스레드가 함께 사용하는 자원을 말합니다.

  • 메모리
  • 파일
  • 전역 변수
  • 입출력 장치

✔ 프로세스와 스레드의 공유 방식 차이

 

1️⃣ 프로세스 간 공유

 

프로세스는 고유한 메모리 공간을 각각 따로 사용합니다.
하지만 프로세스 간 통신(IPC)을 통해 일부 영역(공유 메모리)을 함께 쓸 수 있습니다.

이미지에서 보듯 프로세스 A와 B는 각각 독립적인 메모리 공간을 가지지만,
중간의 “공유 메모리” 영역을 통해 소통합니다.

 

 

2️⃣ 스레드 간 공유

 

반면 스레드는 같은 프로세스 내부에서 실행되기 때문에

  • 코드
  • 데이터
  • 파일
    이 모두 공유됩니다.

다만 스레드마다 별도로 가진 **스택(stack)**은 개별 공간입니다.

즉,

항목 프로세스 스레드
코드, 데이터, 파일 공유 X 공유 O
스택 개별 개별
메모리 완전 분리 일부 공유

이 때문에 스레드는 서로 간섭하기도 훨씬 쉽습니다.

 

2. 임계 구역(critical section)

공유 자원에 접근하는 코드 중, 동시에 실행되면 문제가 생길 수 있는 부분

 

예를 들어 같은 메모리 값을 수정하는 코드가 동시에 실행된다면?

  • 결과가 덮어씌워지거나
  • 순서가 어긋나거나
  • 계산된 값이 예상치 못한 결과를 낳을 수 있습니다.

운영체제는 실제로 여러 프로세스와 스레드를 빠르게 번갈아 실행하기 때문에,
두 작업이 ‘동시에 읽고 동시에 쓰는’ 상황이 얼마든지 발생합니다.

 

✔ 올바른 순서 vs 올바르지 않은 순서

 

이미지에서처럼

  • 왼쪽은 "프로세스 A → B" 순서
  • 오른쪽은 A와 B가 얽혀 순서가 엉망

이렇게 순서가 엉키면 우리가 의도한 값이 저장되지 않는 문제가 생깁니다.

 

3. 동시에 파일을 수정하는 스레드

예를 들어 파일에 다음과 같은 작업을 하려 한다고 가정해 봅시다.

파일 읽기

  • 내용 수정
  • 파일 저장

스레드 A는 파일에 "thread A"라는 내용을 추가하고,
스레드 B는 "thread B"를 추가하려고 합니다.

⚠ 하지만 스레드 A와 B가 같은 시점에 실행되면?

두 스레드 모두 "first"라는 초기값을 읽고, 서로 수정한 뒤 저장하려고 하지만
저장 순서가 뒤섞이면 아래와 같은 이상한 결과가 나옵니다.

  • A 작업이 사라짐
  • B 작업이 덮어씀
  • 둘 중 하나만 반영됨

이게 바로 임계 구역 문제의 전형적 예시입니다.

 

4. 문맥 교환(Context Switch)으로 인한 문제

운영체제는 스레드 A, B를 동시에 돌리는 것처럼 보이지만
실제로는 빠르게 스위칭하면서 배분합니다.

 

따라서 다음 시나리오가 가능합니다:

  • 스레드 A가 파일 읽기까지 했다가 멈춤
  • 스레드 B가 파일 읽기까지 함
  • 스레드 B가 먼저 파일을 써버림
  • 다시 A가 돌아와 덮어씀

결과적으로 정상적인 작업 순서가 깨지면서 값이 엉망이 됩니다.

 

5. 레이스 컨디션(race condition)

레이스 컨디션은 다음을 의미합니다:

둘 이상의 프로세스나 스레드가 동시에 임계 영역에 진입하려고 해서 결과가 예측 불가능해지는 상황

 

예를 들어:

  • 스레드 A는 공유 값 +1을 10,000번
  • 스레드 B는 공유 값 -1을 10,000번

이 작업을 동시에 수행하면 최종값은 0이어야 하는데…

 

실제 실행 결과는?

  • -3394
  • -3457
  • 1848

이처럼 실행할 때마다 다른 값이 출력됩니다.
두 스레드가 공유 자원을 엉망으로 덮어쓴 결과입니다.

이것이 바로 레이스 컨디션의 전형적인 모습입니다.

 

6. 레이스 컨디션 방지 = 동기화(synchronization)

레이스 컨디션이 발생하는 이유는 명확합니다.

두 스레드가 동시에 임계 구역을 실행하기 때문.

 

이를 방지하기 위해 필요한 것이 바로 동기화입니다.

동기화의 핵심 조건은 2가지입니다.

1️⃣ 실행 순서 제어

프로세스와 스레드가 올바른 순서로 실행되도록 하는 것
(ex. mutex lock, semaphore)

2️⃣ 상호 배제(Mutual Exclusion)

임계 구역에는 항상 하나의 스레드만 진입하도록 만드는 것

이 2가지만 충족되면

  • 임계 구역 문제 해결
  • 레이스 컨디션 방지
  • 프로그램 일관성 유지
  • 안전한 멀티스레딩 가능

 

정리하면

구분 설명
공유 자원 여러 프로세스 / 스레드가 함께 사용하는 메모리 ·파일 등
임계 구역 공유 자원에 접근하는 코드 중, 동시에 실행되면 위험한 부분
레이스 컨디션 동시에 임계 영역 실행 → 실행 결과 예측 불가
동기화 올바른 순서 + 상호 배제를 통한 문제 해결