프로세스 동기화와 데드락

SIHA·2026년 1월 8일

CS복습_OS

목록 보기
5/7

프로세스 동기화와 데드락

운영체제에서 프로세스 동기화(Process Synchronization)
여러 프로세스나 스레드가 공유 자원(shared resource)을 사용할 때
데이터의 일관성과 정확성을 보장하도록 실행 순서를 제어하는 것을 의미한다.

동기화가 제대로 이루어지지 않으면
Race Condition, Critical Section 문제, Deadlock과 같은 문제가 발생할 수 있다.


프로세스 동기화가 필요한 이유

여러 프로세스 또는 스레드가 동시에 실행되는 환경에서는
다음과 같은 상황이 발생할 수 있다.

  • 여러 실행 흐름이 하나의 공유 자원에 동시에 접근
  • 실행 순서가 매번 달라질 수 있음
  • 운영체제가 미세한 실행 타이밍까지 완벽하게 제어할 수 없음

이로 인해 의도하지 않은 결과가 발생할 수 있으며,
이를 대표적으로 설명하는 개념이 Race Condition이다.


Race Condition

두 개의 연산이 동시에 공유 자원에 접근할 때,
결과가 일관성을 보장받지 못하는 상태

Race Condition은 다음 두 조건이 동시에 충족될 때 발생

  • 공유 자원 사용: 여러 스레드/프로세스가 동일한 자원을 동시에 사용함
  • 동시성: 두 스레드/프로세스가 동시에 실행되며, 실행 순서를 운영체제가 제어하지 못함

Race Condition은 단순한 버그가 아니라
동기화가 없는 동시 실행 환경에서 필연적으로 발생할 수 있는 문제이다.


OS의 Race Condition 발생과 해결

운영체제는 커널 내부에서도 Race Condition이 발생할 수 있기 때문에 이를 방지하기 위한 여러 방법을 사용한다.

1. 커널 작업 중 인터럽트 발생 시, 인터럽트 지연 처리

중요한 데이터에 접근하고 있을 때는 인터럽트를 바로 처리하지 않고 해당 작업 이후에 처리한다.

2. 프로세스가 커널 모드 수행 중인데 문맥 교환이 발생할 경우, 커널 모드에서 문맥 교환을 방지함

커널 모드에서는 커널 주소 공간의 데이터를 사용하기 때문에 race condition이 발생할 수 있어서,

커널 모드에서 수행 중일 때는 CPU를 빼앗기지 않고 사용자 모드로 돌아갈 때 CPU를 반납한다.

3. 다중 CPU 환경에서의 동기화

다중 CPU 환경, 즉 여러 개의 CPU가 같은 데이터에 접근하는 경우에는 데이터 락(lock)을 사용함

커널 내부에 있는 각 공유 데이터에 접근할 때마다 그 데이터에 lock/unlock을 걸어서 다른 접근을 차단한다.


크리티컬 섹션 (Critical Section)

두 개 이상의 프로세스나 스레드가 동시에 접근하면 안 되는 공유 자원을 사용하는 코드 영역을 의미한다.

공유 자원의 데이터 일관성을 보장하기 위해 한 번에 하나의 프로세스 또는 스레드만 크리티컬 섹션을 실행할 수 있도록 제어해야 한다.

Race Condition은 크리티컬 섹션에 대한 접근 제어가 실패했을 때 발생한다고 볼 수 있다.


크리티컬 섹션 문제 (Critical Section Problem)

여러 프로세스가 동시에 크리티컬 섹션에 접근하면 Race Condition이 발생할 수 있어,

운영체제는 다음 세 조건을 만족하는 방법으로 크리티컬 섹션 문제를 해결한다.

1. 상호 배제 (Mutual Exclusion)

한 번에 하나의 프로세스만 크리티컬 섹션에 진입할 수 있어야 한다.

2. 진행 조건 (Progress)

크리티컬 섹션에 프로세스가 없다면 진입을 원하는 프로세스는 들어갈 수 있어야 한다.

3. 유한 대기 (Bounded Waiting)

대기 중인 프로세스가 일정한 시간 내에 크리티컬 섹션에 진입할 수 있어야 한다.


각 조건이 충족되지 않는 예시

상호 배제 불충족

  • 여러 프로세스가 동시에 공유 자원에 접근
    → 데이터 일관성이 흐트러지는 문제 발생

진행 조건 불충족

  • 크리티컬 섹션에 프로세스가 없음에도 진입이 불가
    → 예를 들어, 두 프로세스가 대기 상태이나
    운영체제에서 이를 제대로 처리하지 못해 어느 쪽도 진입하지 못해 자원이 낭비됨

유한 대기 불충족

  • 우선순위를 정하여 크리티컬 섹션에 접근하는 순서를 정하는 방식
    → 높은 우선순위의 프로세스가 계속 들어오면 특정 프로세스가 계속 기다려야 하는 상황 발생

크리티컬 섹션 문제의 해결 – 세마포어

세마포어 (Semaphore)란

운영체제에서 여러 프로세스나 스레드가 공유 자원에 접근하는 것을 동기화하기 위해 사용하는 기술

세마포어는 정수 값을 사용하여 자원 접근 가능 여부를 제어함


세마포어 주요 특징

  • 세마포어는 정수 값을 가지며, 자원 개수를 나타냄
  • 값이 0보다 크면 자원을 사용할 수 있고, 0이면 자원이 모두 사용 중임

작업 단위

  • P(S) 연산: 자원 획득 연산, 세마포어 값을 1 감소 (0이면 대기)
  • V(S) 연산: 자원 반납 연산, 세마포어 값을 1 증가

동기화 보장

  • 한 번에 하나의 프로세스만 크리티컬 섹션에 접근하도록 보장
  • 자원 개수를 기준으로 동시 접근을 제한할 수 있음

세마포어의 종류

카운팅 세마포어 (Counting Semaphore)

  • 정수 값이 0 이상을 가지며, 동시에 접근 가능한 자원의 개수를 나타냄
  • 예: 프린터가 3대 있을 경우, 최대 3개의 프로세스가 동시에 프린터를 사용할 수 있음

이진 세마포어 (Binary Semaphore) = 뮤텍스 (Mutex)

  • 값이 0 또는 1
  • 한 번에 하나의 프로세스만 접근 가능

세마포어의 두 가지 대기 상태 처리 방식

Busy-Wait

  • 프로세스가 자원을 사용하기 위해 세마포어 값을 계속 확인하며 대기하는 방식
  • 자원이 사용 가능해질 때까지 CPU를 사용하며 루프 반복

Block / Wakeup

  • 자원이 사용 중일 때 프로세스를 Blocked 상태로 전환하고
    자원이 가용해지면 깨움(Wakeup)으로써 실행을 재개하는 방식
  • CPU를 낭비하지 않고 효율적으로 대기함

동작 방식

  • P(S) 호출 시, 세마포어 값이 0 미만이면 프로세스가 block() 호출
    → 운영체제는 이 프로세스를 세마포어의 Wait Queue에 추가하고 CPU 제어권을 빼앗음
  • V(S) 호출 시, Wait Queue에서 대기 중인 다른 프로세스를 깨워 실행 재개

※ Critical section의 길이가 짧으면 block/wakeup의 오버헤드가 더 커질 수 있어서 busy wait이 더 효율적인 경우도 있다.


데드락 (Deadlock, 교착 상태)

두 개 이상의 프로세스가 서로가 소유한 자원을 요청하며 대기 상태에 빠져 더 이상 실행을 진행할 수 없는 상황

공유 자원이나 동기화 기법을 잘못 설계했을 때 발생함


데드락의 발생 조건 4가지

1. 상호 배제 (Mutual Exclusion)

  • 자원은 한 번에 하나의 프로세스만 사용할 수 있어야 함

2. 점유 대기 (Hold and Wait)

  • 프로세스가 이미 할당된 자원을 점유한 상태에서 추가로 다른 자원을 요청하며 대기함

3. 비선점 (No Preemption)

  • 이미 할당된 자원은 해당 프로세스가 작업을 끝낼 때까지 강제로 뺏을 수 없음

4. 순환 대기 (Circular Wait)

  • 프로세스들이 순환 형태로 자원을 요청하며 대기

예: 프로세스 A가 B의, B가 A의 자원을 요청


데드락 해결 방법

1. 예방 (Prevention)

데드락이 발생하려면 4가지 조건이 모두 충족되어야 함
이 중 하나 이상의 조건을 충족하지 않도록 설계하여 데드락을 원천적으로 방지

상호 배제 방지

공유 자원을 여러 프로세스가 동시에 사용할 수 있도록 설계
예: 읽기 전용 데이터는 동시 접근 허용
제한: 쓰기 작업은 여전히 상호 배제가 필요

점유 대기 방지

자원을 점유한 상태에서 다른 자원을 요청하지 못하도록 설계
모든 필요한 자원을 한꺼번에 요청하도록 강제
단점: 자원 낭비 가능

비선점 방지

자원이 점유 중일 경우, 자원을 강제로 회수하여 다른 프로세스가 사용할 수 있도록 설정
단점: 데이터 일관성 문제, 오버헤드

순환 대기 방지

자원에 번호를 부여하고 증가 순서로만 요청
단점: 유연성 감소

2. 회피 (Avoidance)

시스템 상태를 평가하여 데드락이 발생하지 않을 경우에만 자원 할당
프로세스의 최대 자원 요구량을 미리 알아야 함

안전 상태(Safe State) 확인 후 자원 할당
(안전 상태: 모든 프로세스가 실행을 완료할 수 있는 상태)

동작
프로세스가 지원 요청
요청한 자원을 할당한 후의 시스템 상태를 시뮬레이션
할당 후에도 시스템이 안전 상태라면 자원을 할당, 아니라면 요청 거절

장점: 데드락 가능성 최소화
단점: 계산 비용 증가, 사전 정보 필요

3. 탐지 및 회복 (Detection & Recovery)

탐지 (Detection)

데드락이 발생했는지 주기적으로 검사
자원 할당 그래프를 사용하여 데드락 상태(사이클 존재 여부)를 확인

회복 (Recovery)

데드락 상태를 탐지한 후 문제를 해결하기 위한 조치를 취함
프로세스 종료 또는 자원 선점

프로세스 종료: 데드락을 유발하는 프로세스를 하나 이상 종료
자원 선점: 특정 프로세스에서 자원을 강제로 회수

단점: 데이터 일관성 문제 발생 가능

profile
뭐라도 해보자

0개의 댓글