스핀락(SpinLock)
- Windows Server 2008
스핀락은 멀티프로세서 상호배제를 달성하기 위해 커널이 사용하는 메커니즘이다. 어느 한쪽 임계 영역으로 진입하기 전에 커널은 보호 DPC 큐와 관련된 스핀락을 획득해야 한다. 스핀락이 프리(free) 상태가 아니라면 커널은 획득에 성공할 때까지 계속 시도한다. 스핀락의 이름은 커널이 락을 얻을 때까지 돌면서(spinning) 대기하는 것에서 유래 했다.
스핀락은 자신이 보호하는 데이터 구조체처럼 시스템 주소 공간에 매핑된 넌페이지드 메모리에 존재한다. 스핀락을 획득하고 해제하는 코드는 속도 측면과 하부의 프로세서 아키텍처가 제공하는 락 메커니즘을 이용하기 위해 어셈블리로 작성 된다. 스핀락은 운영체제의 스케줄링 지원을 받지 않기 때문에 해당 스레드에 대한 문맥 교환이 일어나지 않는다.
첫 번째 스레드가 변수를 테스트하고 락을 획득하는 사이에 두 번째 스레드가 락을 가로채 가는 것을 방지 한다. 윈도우에서 모든 커널모드 스핀락은 DPC/디스패치 레빌이나 그 이상의 레벨과 관련된 IRQL을 가진다. 따라서 스레드가 스핀락 획득을 시도하면 스핀락 IRQL 또는 더 낮은 IRQL의 모든 다른 행위는 해당 프로세서에서 중지 된다. 스레드 디스패칭은 DPC/디스패치 레벨에서 일어나기 때문에 스핀락을 소유한 스레드는 절대로 선점되지 않는다.
스핀락을 소유하는 동안 커널은 실행명령 수를 최소화 하도록 매우 신중하게 스핀락을 사용한다. 스핀락 획득을 시도하는 모든 프로세서는 실제로 매우 바쁠(busy)것이며 무한히 대기하고 또한 전력을 소비(busy wait는 CPU 100% 사용량을 차지 한다.)하지만 실질적인 작업은 수행하지 않는다.
스핀락은 아직 잠금을 확보하지 않은 경우에도 스레드의 시간 간격을 계산할 수 있다. 이는 스레드 우선 순위 반전을 방지하고 가비지 수집기가 작업을 진행 할 수 있도록 하기 위한 것이다.
스핀락은 유저 프로그램이 사용할 수는 없다. 모든 경우 인터럽트 스핀락으로 보호받는 코드는 극히 짧은 시간 동안만 실행해야 한다. 조금의 지연이라도 생긴다면 일반적인 인터럽트 지연보다 클 수 있으며 성능에 좋지 않은 심각한 영향을 줄 수 있다.
커널 스핀락은 자신을 사용하는 코드에 제약을 수반한다. 스핀락은 DPC/디스패치 레벨이나 그 이상의 IRQL을 항상 갖기 때문에 스핀락을 소유하는 코드가 스케줄러로 하여금 디스패치 동작을 하게 하거나 페이지 폴트를 유발하면 시스템이 크래시 된다.
다중 코어 컴퓨터에서 대기 시간이 짧을 것으로 예상되고 경합이 적으면 다른 종류의 잠금보다 스핀락을 수행하는 것이 효과적이다. 스핀락은 지정된 시간에 잠금을 유지하는 스레드를 추적하기 위해 스레드-추적 모드를 지원한다. 이는 디버깅시 매우 유용하지만 성능을 저하시킬 수 있다.
[참고자료]
- Windows Internals
강성욱 / http://sqlmvp.kr
'Windows , IIS' 카테고리의 다른 글
인스택 큐드 스핀락(InStack Queued SpinLock) (0) | 2015.07.16 |
---|---|
큐드 스핀락(Queued SpinLock) (0) | 2015.07.16 |
객체구조 – 객체 유지 (0) | 2015.07.16 |
객체구조 – 객체 보안 (0) | 2015.07.16 |
객체구조 – 객체 핸들과 프로세스 핸들 테이블 (0) | 2015.07.16 |