Soft Ware/Windows Driver

스핀록에 대해서 ~~

달려가보자 2012. 2. 17. 00:06

스핀 록은 상호배제를 형태로 제공되는데요

상호 배제란 하나의 스레드가 자원을 소유하고 사용하고 있으면 그 자원을 사용하는 다른 스레드는

자원을 쓰고 있는 스레드가 자원을 반납했을시 그 자원을 쓸수 있다는 방식입니다 ^^

자 그럼 자원을 기다리는 스레드는 자원을 기달리는 동안 무슨일을 할 까요?ㅎㅎㅎ

자원을 기달리는 스레드는 검사와 설정 과정을 반복 하면서 스핀락을 획득할려고 합니다 ^^

이처럼 자원을 획득할때까지 검사와 설정과정을 반복하면서 어떤 동작도 실행하지 않는것을

비지 웨이팅(busy-Waiting)이라고 하네요 ^^

스핀락을 원리와 사용시에 항상 같이 나오는 놈이 있는데요 바로 데드락 이라는 놈이죠 ^^ㅋㅋ

데드락은 멀티 프로세서에서 하나의 프로세서에서 하나의 스레드가 자원A를 획득하고

다른 하나의 프로세서에서 하나의 스레드가 자원B를 획득한 상태에서

자원 A를 획득한 스레드가 자원B를 획득할려고 검사와 설정 과정을 반복하고

자원 B를 획득한 스레드가 자원 A를 획득할려고 검사와 설정 과정을 반복 한다면

두 스레드는 비지 웨이팅  상태가 되겠죠? ㅎㅎㅎ

이 상태를 데드락이라고 합니다 ^^

데드락을 피하기 위해서는 스핀 록을 하나만 사용하구요

만약 두개를 사용해야 할 경우에는 어느 한방향으로 데이터 전송이 발생하는 경우에만 

스핀록을 사용하는것이 좋다고 하네요 

아참 여기서 또 기억해야 할것이

1. 스핀 록 을 획득한 후 사용되는 모든 코드들은 페이징이 불가능한 코드 여야 하고

2. 스핀 록은 디스패치 레벨 이나 그 아래 IRQL에서만 요청되구요 스핀 록을 획득시에는 디스패치 루틴
   으로 상승한다고 하네요 ^^

3. 스핀 록은 마이크로 소프트의 DDK 문서에서 25 마이크로세컨드 이상 소유 하지 않도록 권고하네요

4. 멀티 프로세서를 위한 커널은 스핀 록을 얻기 위한 비지 웨이팅 방법과 현재 스레드가 동작하고
   있는 IRQL을 디스패치 레벨로 올리는 방법이 있지만   
   단일 프로세스를 위한 커널은 스핀 록을 획득할때 현재 스레드가 동작하고 있는 IRQL을 디스패치
   레벨로 높여 주기만 할뿐이라고 하네요 ^^