배타적 제어
- 여러 사람이 한 물건을 공유하는 상황에서 발생
- 다른 것을 배제하는 제어 for 성능
- 여러 사람이 공유하는 물건일 경우, 누군가 그 물건을 사용하고 있으면 다른 사람은 사용 불가 (동시 사용 시 고장)
- ex) 회의실 사용중/공실 표기 → 다른 사람의 이용에 영향
배타적 제어가 필요한 경우 = 병렬 처리
- 병렬 처리에서 배타적 제어가 필요한 이유
- 병렬 처리 → 공유 데이터 이용
- 부분적으로 직렬 처리를 사용해야만 되는 경우 문제 발생 多
배타적 제어의 특징
- 복수의 처리가 공유 자원(CPU, 메모리, 디스크 등)에 동시에 액세스(주로 갱신) → 불일치 발생 가능성 보호
- 특정 처리가 공유 자원을 이용하고 있는 동안 다른 처리가 이용할 수 없게 함
- ex) 3차선 도로 → 1차선 도로 : 병목 현상 발생 가능 ⇒ 배타적 제어 (한 대의 차가 통과중일 시 다른 차가 못들어오게 제어)
배타적 제어의 장단점

배타적 제어 사용되는 곳
1. DBMS
- 특정 프로세스가 공유 데이터를 변경중
→ 다른 프로세스가 해당 공유 데이터를 읽거나 공유 데이터를 동시에 변경하지 못하도록 배타적 제어
DBMS 배타적 제어 종류
1) 래치(Latch) = 스핀락(Spin-lock)
* 스핀(Spin) : 락을 획득할 때까지 해당 스레드가 빙빙 돌고있는 것 (Spinning)
- 매우 짧은 시간 동안만 락(Lock) 유지
- 대기중인 프로세스나 스레드가 CPU에서 의미없는 처리를 반복(루프)하며 대기, 락이 개방되길 기다리는 방식
- 단시간의 락에서 사용
2) 슬립락 (Sleep-lock)
- 비교적 장시간 락을 유지하도록 큐를 이용해서 관리
- 슬립해서 기다리면 컨텍스트 스위치 발생
3) 어댑티브 락 (Adaptive-lock)
- 상황에 따라 스핀/슬립할지 판단
- ex) CPU에서 단순히 의미없는 처리를 계속 반복만 하는 것이 아니라 스핀해서 락을 확보하지 못하면 슬립
2. OS
빅 커널락(BKL)
- 리눅스 커널은 하나의 스핀락으로 유지됨 (경합 처리) → BKL이 이용되는 부분은 처리가 직렬화됨
⇒ 동시에 하나의 CPU만 커널 코드 실행 가능 (← 병목지점)
- 컴퓨터가 여러 CPU를 유용하게 활용해서 병렬 처리를 늘리기 위해 리눅스 커널에서는 BKL로 보호된 커널 코드를 수정함
3. 클러스터 DB
- Active-Active 클러스터 DB에서도 배타적 제어 가능
- 여러 대의 DB 서버를 조합해서 하나의 DB로 사용
- 각 서버에서 병럴 처리 → 처리 속도↑
- 서버간 배타적 제어 → 대기 처리↑ → 서버 많아도 병렬 처리 불가
⇒ 중요한 것
1) 서버 간 데이터 교환을 줄이는 것
2) 배타적 제어에 대한 대기상태를 줄이는 것
※ 멀티프로세서 시스템의 배타적 제어
- 여러 개의 CPU 코어를 탑재한 컴퓨터는 동시에 복수의 프로세스나 스레드로 실행할 수 있어 배타적 제어가 어려움
⇒ 하드웨어를 이용한 배타적 제어
- 멀티 코어 환경에서 사용
1) CPU
- 'test and set', 'Compare And Swap(CAS)' 라는 기능(명령) 존재
- 여러 개의 CPU에서 확실하게 배타적 제어를 하기 위한 구조
2) 리눅스 커널
- 커널 전체는 하나의 스핀락(BKL)으로 보호
- BKL이 사용되고 있는 커널 코드 수정 → 락 단위 세분화 ⇒ 병렬 성능 향상
출처 : 야마자키 야스시 외 3, 「그림으로 공부하는 IT 인프라 구조」, 제이펍