OS

[운영체제] 멀티스레딩 환경에서 발생하는 문제와 Deadlock을 피하는 방법

sagecode 2025. 6. 8. 04:27

멀티스레딩은 CPU 자원을 효율적으로 활용하고 작업 성능을 높이는 데 유용한 기술이다. 하지만 여러 스레드가 동시에 자원에 접근할 수 있는 환경에서는 데이터 충돌, 교착 상태(Deadlock) 등 여러 문제가 발생할 수 있습니다.


교착 상태의 조건과 이를 예방하기 위한 전략들을 정리해보자.

멀티스레딩

멀티스레딩은 프로세스 내 작업을 여러 개의 스레드, 멀티스레드로 처리하는 기법이며 스레드끼리 서로 자원을 공유하기 때문에 효율성이 높다. 예를 들어 웹 요청을 처리할 때 새 프로세스를 생성하는 대신 스레드를 사용하는 웹 서버의 경우 훨씬 적은 리소스를 소비하며, 한 스레드가 중단되어도 다른 스레드는 실행 상태일 수 있기 때문에 중단되지 않은 빠른 처리가 가능하다.

멀티스레딩 환경에서 발생할 수 있는 문제

1. 동기화 문제

 

  • 여러 스레드가 동시에 하나의 공유 자원(임계영역)에 접근할 때, 미리 접근한 스레드에 의해 데이터의 정보가 바뀌면서 생길 수 있는 문제
    • 임계영역이란? 멀티스레딩 환경에서 여러 스레드가 동시에 접근하면 문제가 발생할 수 있는 공유 자원에 접근하는 영역을 말한다.
    • 임계 영역은 한 번에 하나의 스레드만 진입할 수 있도록 해야 한다.
  • Lock, synchronized, Atomic 변수 등을 활용해 자원 접근을 순차화해야 한다.

2. 교착 상태 (Deadlock)

  • 두 개 이상의 스레드가 서로가 가진 자원을 기다리며 영원히 대기하는 상태이다.
  • 교착 상태 발생 조건 (4가지 모두 충족 시 발생)
    1. 상호 배제 (Mutual Exclusion) - 자원은 한 번에 하나의 프로세스만 사용 가능
    2. 점유 대기 (Hold and Wait) - 자원을 가진 상태로 다른 자원을 기다림
    3. 비선점 (No Preemption) - 자원을 강제로 회수할 수 없음
    4. 순환 대기 (Circular Wait) - 자원을 기다리는 관계가 원형으로 형성
  • 교착 상태의 해결방법
    • 자원을 할당할 때 애초에 조건이 성립되지 않도록 설계한다 - 같은 순서로 항상 요청하도록
    • 교착 상태 가능성이 없을 때만 자원 할당되며, 프로세스당 요청할 자원들의 최대치를 통해 자원 할당 가능 여부를 파악하는 '은행원 알고리즘'을 쓴다.
    • 일정 시간 내 락을 획득하지 못하면 잠금 포기 후 재시도한다.
    • 운영체제가 주기적으로 자원 그래프를 분석해 Deadlock을 감지하고, 프로세스 강제 종료 등으로 복구한다.