-
반응형
1. 스핀락의 특징
스핀락의 특징 알아보기
스핀락이 지닌 특징은 뮤텍스 비행 구현 복잡도가 낮다는 것이다. 스핀락은 __raw_tickets 구조체의 owner와 next 로 스핀락의 세부 동작을 처리한다. 또한 spin_lock_irq(), spin_lock_irq_save() 등등 추가 기능이 포함된 함수를 제공한다. 스핀락은 이러한 함수와 같이 스핀락을 획득하면서 인터럽트를 비활성화할 수 있는 스핀락 함수를 제공한다. 스핀락 구현부는 아키텍처에 의존적이다. CPU 아키텍처(ARMv7, x86)에 따라 스핀락 구현부가 다르다. 따라서 스핀락의 동작 방식을 제대로 이해하기 위해서는 어셈블리 코드를 분석해야한다.
스핀락의 동작 원리
1. 화장실에 이미 다른 사람이 있어 잠금쇠가 잠겨 있을 때 어떻게 할까?
이미 누군가가 스핀락을 획득했으면 스핀락을 획득할 때까지 다른 일을 하지 않고 계속 기다린다. 화장실에 잠금쇠가 잠겨 있을 때 밖에서 잠금쇠를 보면서 계속 기다린다. 스핀락을 다른 프로세스가 해제할 때까지 스핀락을 쳐다보면서 계속기다린다. 그렇다면 프로세스가 스핀락을 기다리는 동안 다른 일을 할 수 있을까? 다른 일을 하지 않고 오로지 스핀락을 계속 기다린다. 다른 관점으로 보면 프로세스는 CPU를 소모하면서 기다린다고 볼 수 있다. 이를 전문 용어로 Busy-wait라고 한다.
2. 화장실에 있는 사람이 잠금쇠를 풀고 나올 때 어떻게 동작할까?
프로세스는 다른 프로세스가 스핀락을 획득했으면 스핀락을 해제할 때까지 계속 기다린다. 따라서 다른 프로세스가 스핀락을 해제하면 바로 스핀락을 획득하고 임계 영역을 실행한다. 화장실에 있던 사람이 잠금쇠를 풀고 나올 때 바로 화장실에 들어간다. 스핀락을 다른 프로세스가 해제하면 바로 스핀락을 획득하고 임계 영역을 실행한다고 볼 수 있다.
위 두 가지 상황을 통해 알아본 스핀락의 특징은 다음과 같이 정리할 수 있다.
스핀락을 획득할 때까지 다른 일을 하지 않고 계속 기다리며, 스핀락을 계속 기다렸으니 바로 스핀락을 획득할 수 있다.
"스핀락을 획득한 다음 임계 영역을 실행하는 시간이 오래 걸리면 안 된다"는 점을 도출할 수 있다. 스핀락을 획득하고 임계 영역을 실행할 때 다른 프로세스가 스핀락을 획득하려고 하면 Busy-wait로 계속 기다린다. 여기서 말하는 Busy-wait란 다른 일을 하지 않고 CPU를 소모하는 동작이므로 임계 영역 구간의 코드를 실행하는 시간이 오래 걸리면 시스템에 악영향을 끼칠 수 있다. 스핀락으로 임계 영역을 보호하는 방법은 임계 영역에 실행 중인 프로세스만 접근하기 위해서는 임계 영역의 코드 구간에 스핀락을 걸어 다른 프로세스가 임계 영역에 접근하는 것을 막아야 한다.
반응형