동기화 조건 3가지
멀티 프로세스 또는 멀티 스레드 환경에서 공유 자원에 대한 안전한 접근을 보장하려면 다음 세 가지 동기화 조건이 충족되어야 한다.
1. Mutual Exclusion (상호 배제)
- 하나의 프로세스가 임계 구역(Critical Section)에 들어가서 자원을 사용하고 있을 때, 다른 프로세스는 해당 자원을 사용할 수 없어야 한다.
- 즉, 동시에 두 개 이상의 프로세스가 같은 임계 구역을 실행할 수 없다.
예제:
- Lock (예: Mutex, Spinlock)
- Semaphore (세마포어)
2. Progress (진행)
- 어떤 프로세스가 임계 구역에 들어가야 할 필요가 있을 때, 다른 프로세스들이 무한정 방해하지 않아야 한다.
- 즉, 임계 구역에 진입하려는 프로세스가 있을 경우, 제한된 시간이 지나면 반드시 실행될 수 있어야 한다.
예제:
- Context Switching을 통한 CPU 점유권 양보
3. Bounded Waiting (유한한 대기)
- 특정 프로세스가 임계 구역에 진입하기 위해 대기할 때, 무한정 기다리지 않도록 해야 한다.
예제:
- FIFO Queue (First-In-First-Out) 기반 동기화 기법
다양한 동기화 메커니즘
위 동기화 조건을 충족시키기 위해 다양한 동기화 기법이 사용된다. 대표적인 기법들은 다음과 같다.
1. 뮤텍스(Mutex)
- 하나의 스레드만 임계 구역에 접근할 수 있도록 하는 락이다.
- 락을 획득한 스레드만이 락을 해제할 수 있다.
특징:
- FIFO 대기 큐를 사용하여 컨텍스트 스위칭 오버헤드 발생 가능
- 데드락 위험 존재
2. 조건 변수(Condition Variable)
- 특정 조건이 충족될 때까지 스레드를 대기시키고, 조건이 만족되면 다른 스레드가 신호를 보내 깨울 수 있도록 하는 기법이다.
예제:
- 다중 스레드에서 특정 작업이 완료될 때까지 대기
- 제한된 버퍼(Buffer)에서 데이터 접근 제어
3. 세마포어(Semaphore)
- 뮤텍스와 비슷하지만, 여러 개의 스레드가 접근할 수 있도록 개수를 조절할 수 있다.
예제:
- 네트워크 접속 제한, 스레드 풀 관리
4. 스핀락(Spinlock)
- 락을 획득할 때 대기 중인 스레드가 "잠들지 않고" 계속 CPU를 사용하면서 대기하는 방식이다.
특징:
- 컨텍스트 스위칭 없음
- CPU 자원 낭비 가능성 있음
- 멀티코어 환경에서 효과적
5. 낙관적 락(Optimistic Locking)
- 충돌이 거의 발생하지 않는다고 가정하고, 별도의 락을 사용하지 않고 데이터 변경을 시도한 후 충돌 여부를 검사하는 방식이다.
특징:
- 컨텍스트 스위칭 오버헤드 없음
- 충돌 시 재시도 필요
6. Read-Write 락
- 여러 개의 스레드가 동시에 "읽기(Read)" 작업을 수행할 수 있지만, "쓰기(Write)" 작업은 한 번에 하나의 스레드만 수행할 수 있도록 제한한다.
특징:
- 읽기 작업이 많고 쓰기 작업이 적을 때 유용
- Write 요청이 많아지면 데드락 발생 가능성 있음
7. 분산 락(Distributed Lock)
- 여러 서버에서 공유 자원에 대한 동기화를 보장하는 기법이다.
특징:
- 여러 서버에서 동기화가 필요할 때 사용
- 네트워크 지연으로 성능 저하 가능
- 락이 해제되지 않으면 데드락 발생 가능
Non-Blocking 알고리즘
락을 사용하지 않고 동기화를 보장하는 비차단(Non-Blocking) 알고리즘도 존재한다.
락 기반 동기화 기법(Mutex, Semaphore, Read-Write Lock, Spinlock, Distributed Lock 등)은 공유 자원을 보호하기 위해 락을 사용하지만, 락을 사용할 경우 성능 저하와 교착 상태(Deadlock) 같은 문제가 발생할 수 있다.
이를 해결하기 위해 Lock-Free & Wait-Free 알고리즘 같은 비차단(Non-Blocking) 동기화 기법이 존재하며, CAS(Compare-And-Swap) 연산 같은 원자적 연산(Atomic Operation)을 활용해 동기화를 보장한다.
1. Lock-Free 알고리즘
- 시스템의 어느 한 스레드라도 계속 진행될 수 있도록 보장하는 알고리즘
특징:
- 적어도 한 개의 스레드는 계속 실행됨
- 데드락 없음
- 특정 스레드는 무한 재시도할 가능성 있음 (라이브락 가능)
2. Wait-Free 알고리즘
- 모든 스레드가 유한한 연산(제한된 단계) 안에서 반드시 완료될 수 있도록 보장하는 알고리즘
특징:
- 공정성(Fairness) 보장
- 데드락 및 라이브락 발생하지 않음
- 구현이 복잡하고 메모리 오버헤드가 클 수 있음
끝.
'Study' 카테고리의 다른 글
MySQL 인덱스의 종류와 사용 기준, 주의사항 (0) | 2025.04.20 |
---|---|
지속적 통합과 배포의 핵심, CI/CD 파이프라인 (0) | 2025.03.30 |
동기와 비동기, 블로킹과 논블로킹의 차이점 및 조합 이해하기 (0) | 2025.02.05 |
git Merge 4가지 방법 (3-way, fast-forward, squash, rebase) (0) | 2025.01.29 |
JVM의 구조와 동작 원리 (1) | 2025.01.23 |