데커 알고리즘 (Dekker’s Algorithm)
데커 알고리즘(Dekker’s Algorithm)은 두 프로세스 간 **상호 배제(Mutual Exclusion)**를 보장하기 위해 1965년 네덜란드의 수학자 Theodorus Dekker가 개발한 최초의 소프트웨어 상호 배제(mutual exclusion) 알고리즘이다.
이 알고리즘은 두 개의 프로세스가 공유 자원에 동시에 접근하는 것을 방지하여 경쟁 상태(race condition)를 해결하는 방법을 제시한다.
공유 자원에 대한 안전한 접근을 위해 **플래그(flag)**와 턴(turn) 변수를 활용하며, 하드웨어적 명령어 없이 소프트웨어만으로 구현 가능하다.
데커 알고리즘은 상호 배제 문제 해결의 역사적 중요성을 가지지만, 현대 시스템에서는 **세마포어(Semaphore)**나 **뮤텍스(Mutex)**와 같은 더 효율적인 동기화 기법이 주로 사용된다.
데커 알고리즘의 핵심 구성 요소
플래그(flag)
- 각 프로세스가 임계 영역(Critical Section) 진입 의사를 표시하는 변수이다.
flag[0]
과flag[1]
이 있으며, 초기값은false
이다.
턴(turn)
- 임계 영역에 진입할 프로세스의 순서를 결정하는 변수이다.
0
또는1
의 값을 가지며, 프로세스 간 충돌 시 우선권을 부여한다.
작동 원리
진입 의사 표시:
프로세스가 임계 영역에 진입하려면 먼저 자신의flag
를true
로 설정한다.상대 프로세스 확인:
상대방 프로세스의flag
가true
인지 확인한다.- 상대방이 진입 의사가 없으면(
flag
=false
) 즉시 임계 영역에 진입한다. - 상대방도 진입 의사를 표시했다면
turn
변수를 확인한다.
- 상대방이 진입 의사가 없으면(
턴(turn) 기반 양보:
turn
이 상대방을 가리키면 자신의flag
를false
로 변경하고,turn
이 변경될 때까지 대기한다.turn
이 자신을 가리키면 다시flag
를true
로 설정하고 임계 영역에 진입한다.
임계 영역 종료:
임계 영역 실행 후flag
를false
로 재설정하고,turn
을 상대방으로 변경한다.
예제 코드 (Python)
|
|
- 동작 특징:
- Busy Waiting: CPU를 점유하며 대기하므로 리소스 효율이 낮음.
- Deadlock 방지:
turn
변수를 통해 교착 상태를 회피.
강점과 한계
강점 | 한계 |
---|---|
1. 하드웨어 지원 없이 순수 소프트웨어로 구현 가능. | 1. 두 프로세스만 지원하며 확장성 부족. |
2. 교착 상태(Deadlock)와 기아 현상(Starvation) 방지. | 2. 복잡한 조건 검사로 인한 오버헤드 발생. |
3. 경쟁이 없는 경우 빠른 임계 영역 진입 가능. | 2. 현대 CPU의 최적화(예: 메모리 재배치)로 인한 동작 실패 가능성. |
적용 사례
- 초기 운영체제: 다중 프로세서 시스템에서 공유 메모리 동기화.
- 임베디드 시스템: 제한된 리소스 환경에서 경량화된 상호 배제 필요 시.
- 교육용 예제: 상호 배제 개념 설명과 병행 프로그래밍 기초 학습.