본문 바로가기
CS전공지식

[CS 전공지식] 동기화와 교착상태

by JINJINC 2025. 3. 29.
728x90
반응형

공유 자원, 동기화, 스레드 안전, 교착 상태까지 완벽 정리

운영체제나 멀티스레드 프로그래밍에서 자원 공유와 동기화 문제는 매우 중요한 이슈입니다. 이 글에서는 공유 자원(Shared Resource), 임계 구역(Critical Section), 레이스 컨디션(Race Condition), 동기화 기법, 스레드 안전(Thread Safety), 그리고 교착 상태(Deadlock)까지 핵심 개념을 총정리합니다.


✅ 공유 자원이란?

공유 자원(Shared Resource)이란 여러 프로세스나 스레드가 동시에 접근할 수 있는 자원을 의미합니다.

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

동시에 접근하면 충돌이 발생할 수 있어 동기화가 필요합니다.


🚨 임계 구역(Critical Section)과 레이스 컨디션

임계 구역

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

레이스 컨디션 (Race Condition)

  • 두 개 이상의 프로세스/스레드가 임계 구역에 동시에 진입하여 자원의 일관성이 깨지는 문제

동기화를 통해 임계 구역 접근을 제어해야 합니다.


🔐 동기화(Synchronization)란?

동기화는 아래 두 가지 조건을 만족해야 합니다:

  1. 실행 순서 제어: 코드가 정확한 순서로 실행되도록 보장
  2. 상호 배제(Mutual Exclusion): 하나의 프로세스/스레드만 자원에 접근

🔧 동기화 기법

1. 뮤텍스 락 (Mutex Lock)

  • 상호 배제를 보장하는 대표적인 동기화 도구
  • lock.acquire()로 락 획득, lock.release()로 해제
lock.acquire()
# 임계 구역
lock.release()

2. 세마포어 (Semaphore)

  • 여러 개의 공유 자원을 동시 접근 제어 가능
  • 카운팅 세마포: S 값 자유
  • 이진 세마포: S = 0 또는 1 (뮤텍스와 유사)
wait() {
    S--;
    if (S < 0) sleep();
}

signal() {
    S++;
    if (S <= 0) wakeup();
}

3. 조건 변수 (Condition Variable)

  • 실행 순서 제어 목적의 동기화 도구
  • wait()signal()로 상태 기반 실행 제어

4. 모니터 (Monitor)

  • 공유 자원 + 동기화된 인터페이스로 구성
  • 큐(Queue) 방식으로 내부 프로세스 순차 실행
  • 실행 순서 + 상호 배제 동기화 모두 가능

🧵 스레드 안전(Thread Safety)

  • 멀티스레드 환경에서 동시 접근 시에도 문제가 없는 함수나 변수 상태
  • 레이스 컨디션이 발생하지 않음

예시 (Java)

  • synchronized 키워드로 스레드 안전 보장=> vector 의 add 메서드 
  • ArrayList의 add메서드는 스레드 안전하지 않음  => synchronized 메서드에 포함되지않음 

💣 교착 상태(Deadlock)

정의

  • 자원을 서로 점유한 상태에서 상대 자원이 해제되기만을 기다려 프로세스가 멈추는 상태

예시

  • 프로세스 A는 자원 X 점유 중 → 자원 Y 기다림
  • 프로세스 B는 자원 Y 점유 중 → 자원 X 기다림

4가지 발생 조건

조건 설명
상호 배제 자원을 하나만 점유 가능
점유와 대기 점유한 상태로 다른 자원 대기
비선점 자원을 강제로 뺏을 수 없음
원형 대기 자원을 서로 순환하며 대기

🧯 교착 상태 해결 방법

1. 교착 상태 예방

  • 발생 조건 중 하나 이상을 충족하지 않게 설계
  • 자원을 순서대로 할당해 원형 대기 방지

2. 교착 상태 회피

  • 자원 상태를 미리 파악하고 판단
  • 대표 알고리즘: 은행가 알고리즘 (Banker's Algorithm)

3. 교착 상태 검출 후 회복

  • 발생을 허용, 이후 상태를 검사
  • 교착 상태 발생 시:
    • 자원 선점
    • 프로세스 강제 종료

📌 핵심 정리

개념 설명
공유 자원 여러 프로세스/스레드가 접근하는 자원
임계 구역 동시에 접근하면 충돌 발생하는 코드 영역
레이스 컨디션 임계 구역 충돌로 데이터 손상 가능성
동기화 실행 순서 제어 + 상호 배제
스레드 안전 여러 스레드가 동시에 접근해도 안전
교착 상태 자원을 점유한 채 서로 대기 중 정지된 상태

 


 

728x90
반응형

댓글