피터슨 알고리즘 (Peterson’s Algorithm)
피터슨 알고리즘(Peterson’s Algorithm)은 두 프로세스의 **상호 배제(Mutual Exclusion)**를 보장하기 위한 소프트웨어 기반 동기화 알고리즘이다.
1981년 개리 피터슨(Gary L. Peterson)이 제안한 이 알고리즘은 간결성과 이론적 엄밀성으로 운영체제 및 병행 프로그래밍 분야에서 널리 연구된다.
피터슨 알고리즘은 이론적 완결성을 인정받지만, 현대 시스템에서는 주로 하드웨어 기반 동기화 기법(예: TAS, CAS)이 사용됩니다. 그러나 병행 프로그래밍의 근본 원리를 이해하는 데 여전히 핵심적인 역할을 한다.
핵심 구성 요소
- 플래그 배열(flag)
- 각 프로세스의 임계 영역 진입 의사 표시 (
flag
,flag
초기값False
)
- 각 프로세스의 임계 영역 진입 의사 표시 (
- 턴 변수(turn)
- 임계 영역 진입 순서 결정 (0 또는 1 값을 가짐)
동작 원리
진입 의사 표시:
프로세스i
가 임계 영역 진입 전flag[i] = True
설정.턴 양보:
turn = 1 - i
로 상대 프로세스에 진입 기회 우선 부여.대기 조건:
임계 영역 실행:
조건 충족 시 임계 영역 코드 실행.종료:
flag[i] = False
로 재설정.
이론적 검증
조건 | 만족 여부 | 근거 |
---|---|---|
상호 배제 | ✔️ | turn 과 flag 의 조합으로 동시 진입 차단 |
진행(Progress) | ✔️ | turn 변수가 교대로 변경되어 기아 현상 방지 |
한정된 대기 | ✔️ | 최대 1회 대기 후 진입 보장 |
Python 구현 예시
|
|
실행 결과:
결과는 실행 순서에 따라 변동 가능
장단점 분석
장점 | 단점 |
---|---|
- 하드웨어 지원 없이 순수 소프트웨어 구현 | - Busy Waiting으로 CPU 자원 낭비 |
- 교착 상태/기아 현상 방지 | - 2개 프로세스 제한 (확장성 부족) |
- 코드 간결성 및 이식성 | - 현대 CPU 아키텍처(멀티코어, 캐시)에서 동작 불가능성 |
현대 시스템에서의 한계
- 메모리 재배치 문제:
CPU/컴파일러 최적화로 인해 코드 실행 순서 변경 가능 →volatile
키워드 필요. - 멀티코어 동기화 실패:
캐시 일관성 문제로 인해 플래그 값 갱신 지연 → 메모리 배리어(Memory Barrier) 추가 필요. - 성능 저하:
Busy Waiting이 CPU 자원을 지속 점유 → 세마포어(Semaphore)나 뮤텍스(Mutex)로 대체 권장.
교육적 가치
- 상호 배제 개념 학습: 임계 영역 문제의 3대 조건(상호 배제, 진행, 한정된 대기) 이해에 적합.
- 병행 프로그래밍 기초: 스핀락(Spinlock)과 소프트웨어 동기화 메커니즘의 원리 체험.
- 알고리즘 확장 모델: N-프로세스 버전(램포트 빵집 알고리즘)으로의 개념 확장 가능.