동기화와 임계 구역

기술노트
Admin (토론 | 기여)님의 2025년 9월 11일 (목) 16:50 판 (Gemini 벌크 업로더로 자동 업로드)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

동기화와 임계 구역

동기화(Synchronization)는 여러 프로세스나 스레드가 동시에 실행되는 병행(Concurrency) 환경에서, 공유 자원에 대한 접근 순서를 조절하여 데이터의 일관성을 유지하고 경쟁 상태(Race Condition)를 방지하는 기법입니다. 이때 공유 자원에 접근하는 코드 영역을 임계 구역(Critical Section)이라고 합니다.


🤝 동기화 (Synchronization)의 필요성

  • 경쟁 상태 (Race Condition)

> * '정의': 여러 프로세스/스레드가 공유 자원에 동시에 접근하여 조작할 때, 접근 순서에 따라 실행 결과가 달라지는 상황입니다. > * '문제점': 예측 불가능한 결과와 데이터 불일치(Inconsistency)를 초래하여 프로그램의 신뢰성을 떨어뜨립니다. > * '예시': 은행 계좌 잔액 업데이트 (두 스레드가 동시에 잔액을 읽고, 각자 계산 후 다시 쓸 때 최종 잔액이 잘못될 수 있음).

  • 데이터 일관성 (Data Consistency) : 공유 자원의 무결성을 유지하고, 항상 올바른 상태를 보장하기 위해 동기화가 필수적입니다.

🔒 임계 구역 (Critical Section)

  • 정의 (Definition) : 공유 자원에 접근하는 코드 블록입니다. 이 구역은 한 번에 하나의 프로세스/스레드만 진입하여 실행할 수 있도록 보장되어야 합니다.
  • 임계 구역 문제 (Critical Section Problem) : 여러 프로세스/스레드가 동시에 임계 구역에 진입하는 것을 막는 방법을 설계하는 문제입니다.
  • 해결을 위한 3가지 요구 조건

> 1. 상호 배제 (Mutual Exclusion) : 한 번에 하나의 프로세스/스레드만 임계 구역에 진입할 수 있어야 합니다. > 2. 진행 (Progress) : 임계 구역에 진입하려는 프로세스/스레드가 없고, 임계 구역 밖에 있는 프로세스/스레드가 임계 구역에 진입할 수 있다면, 다음 진입할 프로세스/스레드를 유한한 시간 내에 선택해야 합니다. > 3. 한정된 대기 (Bounded Waiting) : 어떤 프로세스/스레드도 임계 구역 진입을 무한정 기다려서는 안 됩니다. (기아 현상 방지)


🛠️ 동기화 해결 도구

  • 뮤텍스 (Mutex)

> * '정의': 상호 배제를 위한 가장 기본적인 동기화 도구. '상호 배제(Mutual Exclusion)'의 약자입니다. > * '동작': 임계 구역에 진입하기 전에 락(Lock)을 획득하고, 임계 구역을 벗어날 때 락을 해제합니다. 락을 획득한 스레드만이 임계 구역에 진입 가능합니다. > * '특징': 락을 소유한 스레드만이 락을 해제할 수 있습니다. (소유 개념)

  • 세마포어 (Semaphore)

> * '정의': 공유 자원에 대한 접근을 제어하는 데 사용되는 변수. 카운터 역할을 합니다. > * '동작': `P()` (또는 `wait()`) 연산으로 세마포어 값을 감소시키고, `V()` (또는 `signal()`) 연산으로 세마포어 값을 증가시킵니다. 세마포어 값이 0보다 크면 자원 사용 가능합니다. > * '종류': 이진 세마포어(0 또는 1)와 계수 세마포어(여러 개의 자원 제어)가 있습니다. > * '특징': 락을 소유하지 않은 스레드도 락을 해제할 수 있습니다. (소유 개념 없음)

  • 모니터 (Monitor)

> * '정의': 공유 자원과 그 자원에 접근하는 프로시저(메서드)들을 하나의 캡슐화된 객체로 묶은 고수준 동기화 도구입니다. > * '특징': 모니터 내의 프로시저는 한 번에 하나의 스레드만 실행 가능하도록 컴파일러/런타임 레벨에서 상호 배제를 보장합니다. (Java의 `synchronized` 키워드, C#의 `lock` 키워드)


💡 개발자 핵심 Point

  • 동기화는 멀티스레딩/멀티프로세싱 환경에서 필수적이지만, 과도한 동기화는 성능 저하를 유발할 수 있습니다. (락 경합, 컨텍스트 스위칭 증가)
  • 데드락 (Deadlock) 위험 : 동기화 도구를 잘못 사용하면 교착 상태(Deadlock)가 발생할 수 있습니다. (예: 두 스레드가 서로 다른 락을 잡고 상대방의 락을 기다리는 상황)
  • 락의 최소화 : 임계 구역의 크기를 최소화하고, 락을 잡고 있는 시간을 줄이는 것이 성능 최적화에 중요합니다.
  • 원자적 연산 (Atomic Operation) : 더 이상 분해될 수 없는 단일 연산. CPU 명령어 수준에서 한 번에 완료되므로 동기화 없이도 안전하게 수행될 수 있습니다. (e.g., `i++`는 읽기, 증가, 쓰기의 세 단계로 나뉘므로 원자적이지 않음)