CS 박사되깅 4주차 동기화와 교착상태

윤현승·2025년 9월 28일

CS 스터디

목록 보기
4/9

Critical Section(임계구역) 문제

임계구역(Critical section)은 여러 프로세스나 스레드가 동시에 접근하면 경쟁조건(race condition) 이 발생할 수 있는 공유 자원(변수, 파일, 데이터 등)에 접근하는 코드 영역을 의미한다. 예를 들어 두 개의 프로세스가 은행 계좌 잔고를 동시에 수정하려 하면, 정상적으로 동작하지 않거나 값이 꼬일 수 있다.

임계구역 문제를 해결하기 위해서는 동기화(synchronization) 가 필요하다. 그 이유는 여러 프로세스가 순서를 지키지 않고 임계 구역에 진입하면 실행 결과가 예측할 수 없게 바뀌기 때문이다.

동기화의 개념과 예시

  • *동기화(Synchronization)란 여러 프로세스나 스레드가 동시에 실행될 때, 공유 자원**(예: 변수, 파일, 메모리 등)의 일관성과 정확성을 보장하기 위해 실행 순서나 접근을 제어하는 것을 말해요.

동기화가 필요한 이유는, 여러 실행 흐름이 동시에 같은 자원에 접근하면 경쟁 조건(Race Condition)이 발생해서 결과가 예측할 수 없게 되기 때문입니다. 동기화는 이런 문제를 막아줍니다.

동기화의 두 가지 목적

  1. 실행 순서 제어: 특정 작업이 반드시 다른 작업보다 먼저 실행되어야 할 때 순서를 맞추는 것.
  2. 상호 배제(Mutual Exclusion): 동시에 접근하면 안 되는 자원에 한 번에 하나의 프로세스만 접근하도록 제한하는 것

임계구역 문제 해결 조건

임계구역 문제를 올바르게 해결하려면 아래 세 가지 조건을 반드시 만족해야 한다.

  • 상호 배제(Mutual Exclusion): 한 번에 오직 하나의 프로세스만 임계구역에 들어갈 수 있어야 한다.
  • 진행(Progress): 한 프로세스가 임계구역 밖에 있다면, 나머지 프로세스가 임계구역에 들어갈지 여부를 유한시간 내에 결정할 수 있어야 한다.
  • 유한 대기(Bounded Waiting): 임계구역 진입을 기다리는 프로세스가 무한정 대기하지 않고, 유한 횟수 내에 반드시 임계구역에 들어갈 수 있어야 한다.

동기화 도구

뮤텍스(Mutex)

뮤텍스는 Mutual Exclusion(상호배제)의 줄임말로, 임계 구역에 한 번에 하나의 프로세스(스레드)만 들어가도록 lock/unlock 기법을 제공하는 동기화 도구다. lock을 소유한 프로세스만 임계구역 사용 권한이 있다. 작업이 끝나면 반드시 unlock하여 다른 프로세스가 들어올 수 있게 한다.

세마포어(Semaphore)

세마포어는 카운팅 가능한 동기화 객체로, 일정 개수의 자원을 여러 프로세스가 공유해야 할 때 사용한다. 대표적으로 wait(P 연산)signal(V 연산) 두 가지 기본 연산을 지원한다. wait는 자원을 요청하는 연산, signal은 자원을 반납하는 연산이다. 세마포어는 이진 세마포어(Binary Semaphore, 값이 0 또는 1)와 일반 세마포어(Counting Semaphore, 0 이상 정수)로 나뉜다.

모니터(Monitor)

모니터는 한 번에 하나의 프로세스만 임계구역 코드를 실행할 수 있도록 언어(자바의 synchronized 블록 등) 또는 운영체제 수준에서 lock과 조건변수를 제공한다. 즉, 뮤텍스 + 조건 변수의 조합. lock 관리가 자동으로 이루어져 코드가 간결해지고 디버깅이 쉬워진다. 단점은 성능 오버헤드가 발생할 수 있다.


Deadlock(교착상태) 발생 조건

Deadlock은 둘 이상의 프로세스가 서로 자원을 점유한 채, 상대방의 자원이 해제되기를 무한히 기다리는 상태다. 데드락의 4가지 발생 조건은 다음과 같다.

  • 상호배제(Mutual Exclusion): 자원을 한 번에 하나만 사용할 수 있다.
  • 점유와 대기(Hold and Wait): 최소한 하나의 자원을 보유한 상태에서 다른 자원을 추가로 기다린다.
  • 비선점(No Preemption): 이미 할당된 자원을 강제로 빼앗을 수 없다.
  • 환형 대기(Circular Wait): 각 프로세스가 다음 프로세스가 가진 자원을 기다리며 원형으로 대기 상태가 이루어진다.

4가지 조건이 동시에 성립하면 데드락이 발생한다.


Deadlock 해결 방법

데드락을 해결하거나 예방하는 대표적인 방법.

  • 예방(Prevention): 4가지 조건 중 한 가지 이상 성립하지 않게 한다(예: 자원을 모두 한번에 할당하거나 환형대기를 막는 등).
  • 회피(Avoidance): 자원 할당 시 안전 상태(Safe State)가 되는지 미리 점검하고, 불안전하면 할당하지 않는다(은행가 알고리즘 등).
  • 발견(Detection) 및 복구(Recovery): 데드락 발생을 허용하지만, 주기적으로 검사해서 데드락이 생기면 프로세스를 종료하거나 자원을 회수해 복구한다.

참고로 데드락의 발생 조건 중 일부만 달성된 상태를 "데드락이 예방된 상태" 또는 "데드락 발생 가능성이 없는 상태" 라고 부른다

profile
윤현승입니다!

5개의 댓글

comment-user-thumbnail
2025년 9월 28일

간단하게 정리해주셔서 보기 쉬웠어요!

답글 달기
comment-user-thumbnail
2025년 9월 28일

잘 정리해주셔서 이해하기 좋았어요!

답글 달기
comment-user-thumbnail
2025년 9월 28일

구조적으로 정리되어 있어서 흐름에 따라 이해하기 편했어요

답글 달기
comment-user-thumbnail
2025년 9월 29일

오 데드락 모든 조건이 충족하지 않을 때 상태가 궁금했는데 유익했습니다!

답글 달기
comment-user-thumbnail
2025년 9월 29일

글씨가 커서 읽기 편했습니다 감사합니다!

답글 달기