Soft Ware/Windows Driver

인스택 큐 스핀 록에 대해서 ~~!!

달려가보자 2012. 2. 17. 01:32

인스택 큐 스핀 록은 익스큐티브 스핀 록의 단점을 보안 하고자 나온 스핀 록이다 .

자 그럼 익스큐티브 스핀 록 에 단점에 대해서 알아 봐야 겠죠? ㅎㅎ

그래야 이해 하기 쉬우니깐요 ㅎㅎㅎㅎ

익스큐티브 스핀 록은 서로 경쟁 상태에 있는  프로세서가 스핀 록을 얻기 위해

같은 메모리 영역을 계속 수정해야 하며, 메모리 영역을 수정하게 되면 스핀 록을

얻고자 하는 프로세서는 동일한 캐시 라인을 반복해서 메모리로 가져와야 합니다.

즉 cpu가 메모리로부터 데이터를 가져올때 32바이트,64,128바이크 크기의

캐시 라인을 가져 오는데요 캐시 라인은 성능 향상을 위해 존재하는것이지만

멀티스레드 환경에서는 메모리의 갱신을 어렵게 합니다.

그 이유는 하나의 CPU 코어에서 읽어들인 캐시 라인 데이터를 변경하는 시점에서

다른 CPU 코어가 동일한 캐시 라인에 있는 데이터를 읽어 들이고자 한다면

변경된 데이터가 메모리에 저장된후 다시 읽어 들어여 하기 때문이죠

즉 데이터 구조체를 작성할때에는 데이터 의 변경 빈도에 따라 캐시 라인을 고려

하여야 한다는것이죠  - 김민수 님 블러그에서 -

이러한 점때문에 XP는 Interlocked Exchange 와 Compare-Exchange 동작을 사용하여

스핀록을 기다리는 개체와 사용하는 개체를 추적함으로써, 익스큐티브 스핀 록을 얻기 위해

프로세서가 캐시 라인을 계속 메모리로 가져오는 과정을 피할수 있도록 인스택 스핀 록을 설계!!


인스택 큐 스핀 록은 드라이버가 접근 할수 없는 고정된 크기의 록 포인터 테이블에 의존 하기 때문에

드라이버가 직접 사용할수 없어요 ㅠㅠ

자 이점을 유의하고 사용방법에 대해 알아 볼께요 ^^

우선 스핀 록 변수를 페이징이 불가능한 영역에 할당하고

KeInitializeSpinLock() 함수를 사용하여 변수를 초기화 하고 익스큐티브 스핀 록 초기화 함수와

다른점이 이 함수는 큐 메커니즘을 사용하여 대기 상태에 있는 프로세서를 추적합니다
!! ㅎㅎ

자 그럼 초기화 했으면 무엇을 해야 할가요? 스핀록을 획득 해야 겠죠? ㅎㅎㅎ

그러기전에 아까 위에 글 기억나세요? 이늠은 드라이버가 접근하지 못한  고정된 크기의 록 포인터

테이블이 있다고 ㅋㅋㅋㅋ

그 늠을 쓰기 위해서 페이징이 불가능한곳에 KLOCK_QUEUE_HANDLE 이라는 구조체의 변수를 선언

해야 되요 ㅎㅎ

자 선언 했으면 KeAcquireInStackQueuedSpinLock 함수에 매개변수로 스핀 록 변수 주소 값과

KLOCK_QUEUE_HANDLE 의 구조체 변수의 주소 값을 넣어주시면 됩니다 ^^

해제시에는 KeReleaseInStackQueuedSpinLock() 함수에  KLOCK_QUEUE_HANDLE의 구조체 변수

주소를 넣어주시면 스핀 록을 반납 합니다 ^^


'Soft Ware > Windows Driver' 카테고리의 다른 글

디스패처 오브젝트 중 이벤트 오브젝트  (0) 2012.02.18
디스패처 오브젝트 !!  (0) 2012.02.18
익큐티브 스핀 록에 대해서 ~~~  (0) 2012.02.17
스핀록에 대해서 ~~  (0) 2012.02.17
디바이스 정리  (0) 2011.11.21