[CS] 동기화와 교착 상태

눈치없어·2025년 2월 18일

기본 의미

  • 📌 공유 자원(Shared Resource)
    - 여러 프로세스 또는 스레드가 공통으로 사용하는 자원
    - 메모리, 파일, 전역 변수, 입출력 장치 등

  • 📌 임계 구역(Critical Section)
    - 공유 자원에 접근하는 코드 영역
    - 동시에 실행되면 데이터 충돌(오류) 발생 가능

  • 📌 레이스 컨디션(Race Condition)
    - 여러 프로세스/스레드가 동시에 공유 자원에 접근하여 실행 결과가 꼬이는 문제
    - 실행 순서에 따라 결과가 달라짐

    예시:
    1. 프로세스 A가 공유 메모리에 데이터를 쓰기
    2. 프로세스 B가 공유 메모리에서 데이터를 읽기
    3. 만약 프로세스 B가 A의 쓰기 작업이 끝나기 전에 실행되면, 잘못된 데이터를 읽을 수도 있음

  • 📌 동기화(Synchronization)
    - 여러 프로세스 또는 스레드가 공유 자원을 올바르게 접근하도록 제어하는 것
    - 레이스 컨디션 방지

  • 📌 동기화의 두 가지 개념
    - 실행 순서 제어: 프로세스 및 스레드를 올바른 순서로 실행하기
    - 상호 배제: 동시에 접근해서는 안 되는 자원에 하나의 프로세스 및 스레드만 접근하기


동기화 기법

뮤텍스 락(Mutex Lock)

📌 개념

  • 하나의 프로세스 또는 스레드만 공유 자원에 접근 가능하도록 제한하는 동기화 기법
  • 상호 배제를 보장
  • "Lock → 자원 사용 → Unlock" 방식

📌 원리

  • 임계 구역(공유 자원)에 접근하려면 반드시 락을 획득해야 함
  • 한 번에 하나의 프로세스/스레드만 락을 획득 가능
  • 작업이 끝나면 락을 해제하여 다른 프로세스/스레드가 접근 가능

📌 예시 코드(java)

lock.acquire();  // 락 획득 (다른 프로세스/스레드는 접근 불가)
    // 공유 자원 접근 (임계 구역)
lock.release();  // 락 해제 (다른 프로세스/스레드 접근 가능)

세마포(Semaphore)

📌 개념

  • 뮤텍스보다 일반화된 동기화 도구
  • 공유 자원이 여러 개 존재할 때 동기화 가능 (뮤텍스는 하나의 자원만 관리)
  • 일정 개수의 프로세스/스레드만 접근 가능

📌 원리
1. 공유 자원의 개수를 나타내는 변수 S (세마포 값) 사용
2. wait() 호출 시 S 값을 1 감소, signal() 호출 시 S 값을 1 증가
3. S > 0 → 접근 가능 / S = 0 → 접근 불가 (대기)

📌 예시 코드(java)

wait(S) {  // 자원 사용 전
    S--;  
    if (S < 0) wait();  // 사용 가능한 자원이 없으면 대기
}

signal(S) {  // 자원 사용 후
    S++;  
    if (S <= 0) wakeup();  // 대기 중인 프로세스 깨움
}

조건 변수와 모니터

📌 개념

  • 특정 조건이 충족될 때까지 프로세스/스레드를 대기시키는 기법
  • 실행 순서 제어에 활용
  • 뮤텍스와 함께 사용하여 동기화 구현

📌 원리

  • 특정 조건이 충족되지 않으면 wait() 호출 → 대기 상태 전환
  • 조건이 충족되면 signal() 호출 → 대기 중이던 프로세스/스레드 실행

📌 예시 코드(java)

if (!조건_충족) {
    cv.wait();  // 조건 충족될 때까지 대기
}
// 조건 충족 시
cv.signal();  // 대기 중인 스레드 실행

스레드 안전

📌 개념

  • 멀티스레드 환경에서도 데이터 손상이 발생하지 않는 상태
  • 레이스 컨디션을 방지하여 안정적인 실행을 보장

📌 해결 방법

  • 뮤텍스, 세마포, 모니터 등을 활용하여 동기화 구현
  • 자바의 synchronized 키워드 활용 (자동으로 동기화 보장)

📌 예시 코드(java)

public synchronized void add(int value) {  // 동기화 보장
    count += value;
}

교착상태

일어나지 않을 사건을 기다리며 프로세스의 진행이 멈춰버리는 현상

교착 상태의 발생 조건

1️⃣ 상호 배제: 한 번에 하나의 프로세스만 자원을 사용 가능
2️⃣ 점유와 대기: 프로세스가 자원을 점유한 채 추가 자원을 기다림
3️⃣ 비선점: 할당된 자원을 강제로 회수할 수 없음
4️⃣ 원형 대기: 프로세스들이 순환 구조로 자원을 기다림


교착상태의 해결 방법

1️⃣ 교착상태 예방

  • 교착상태를 원천 차단
  • 교착상태 발생 조건 4가지 중 하나라도 충족되지 않도록 설계
    - 상호 배제 방지 → 공유 가능한 자원을 늘리기
    - 점유와 대기 방지 → 프로세스가 자원을 한 번에 모두 할당받도록 함
    - 비선점 방지 → 다른 프로세스가 자원을 강제로 빼앗을 수 있도록 허용
    - 원형 대기 방지 → 자원에 고유한 번호를 매기고, 항상 증가하는 순서대로만 할당

📌 예시:
자원 X(0), 자원 Y(1), 자원 Z(2)
프로세스들이 반드시 오름차순 순서로만 자원을 할당받도록 제한하면 원형 대기 조건을 충족하지 않아 교착상태가 발생하지 않음

2️⃣ 교착상태 회피

  • 교착상태가 발생할 가능성이 있는 경우 자원 할당을 지연하여 회피
  • 프로세스의 자원 요구를 받아들이기 전에 안전한 상태인지 판단하고 자원 할당을 결정
  • 안전한 상태에서만 자원 할당
  • 자원을 너무 많이 할당하면 교착상태 발생 가능성 증가

📌 예시:
은행원 알고리즘(Banker's Algorithm)
프로세스의 최대 자원 요구량을 미리 확인하고, 교착상태가 발생하지 않는 경우에만 자원 할당

3️⃣ 교착상태 검출 후 회복

  • 교착상태가 발생한 후 이를 탐지하고 복구하는 방식
  • 운영체제가 주기적으로 교착상태 여부를 검사

✔ 교착상태 검출 방법

  • 프로세스가 자원을 요청할 때마다 검사
  • 주기적으로 시스템 상태를 점검하여 교착상태 탐지

✔ 교착상태 해결 방법 (복구 방법)

  • 자원 선점을 통한 회복
    - 교착상태가 해결될 때까지 다른 프로세스로부터 강제로 자원을 빼앗아 특정 프로세스에 할당

  • 프로세스 강제 종료
    - 교착상태에 놓인 프로세스 중 일부를 강제 종료하여 자원을 해제


참고: 북스터디 - 이것이 취업을 위한 컴퓨터 과학이다 (Chapter 3-3)

profile
dock 사이즈 다르잖아

0개의 댓글