2012-08-12 3 views
2

코드에 스핀 록을 구현하려고하지만 위키 피 디아를 기반으로 구현 한 스핀 록은 성능이 매우 떨어집니다.이 스핀 락 기능의 성능을 향상시킬 수있는 간단한 방법이 있습니까?

int lockValue = 0; 

void lock() { 
    __asm__("loop: \n\t" 
      "movl $1, %eax \n\t" 
      "xchg %eax, lockValue \n\t" 
      "test %eax, %eax \n\t" 
      "jnz loop"); 
} 

이 기능을 향상시켜 더 빨리 만들 수있는 방법이 있습니까?

감사합니다.

+1

난 당신이 잘못된 일을 최적화하기 위해 노력하고 생각합니다. 잠금 경합이 너무 많다면, 알고리즘을'lock()'밖의 코드로 다시 생각해야한다. 또는 자물쇠를 단지 몇 번 돌린 다음 다시 돌아와서 유용한 (또는 수면) 무언가를 할 수도 있습니다. –

답변

5

어때? (KeAcquireSpinLock 구현입니다.) 불행하게도, 조립은 &입니다.

spin_lock: 
    rep; nop 
    test lockValue, 1 
    jnz spin_lock 
    lock bts lockValue 
    jc spin_lock 
+2

다음을 참조하십시오 : [rep; nop; x86 어셈블리에서 의미가 있습니까?] (http://stackoverflow.com/questions/7086220/what-does-rep-nop-mean-in-x86-assembly) 및 [x86 중단 명령이 스핀 록에서 어떻게 작동하며 사용할 수 있습니까? 다른 시나리오에서?] (http://stackoverflow.com/questions/4725676/how-does-x86-pause-instruction-work-in-spinlock-and-can-it-be-used-in-other-sc) – nhahtdh

+2

참고 사항 : [x86 어셈블리에서 "잠금"명령의 의미는 무엇입니까?] (http://stackoverflow.com/questions/8891067/what-does-the-lock-instruction-mean-in-x86-assembly) 및 [x86 LOCK on multi-core CPU] (http://stackoverflow.com/questions/3339141/x86-lock-question-on-multi-core-cpus/3339380#3339380) 및 [단일 코어/핵심] (http://wiki.osdev.org/Atomic_operation) – nhahtdh

+0

@nhahtdh 위대한 링크를 제공하고 있습니다. 좋은 것들을 유지하십시오 :-) – cnicutar

4
"movl $1,%%edx  \n\t" // edx = 1; 
    ".set lockloop,. \n\t" // symbol lockloop set to pc 
    "xorl %%eax,%%eax \n\t" // eax = 0; 
    "lock cmpxchgl %%edx,(%%ebx)\n\t" // if (*mu_ptr == eax) *mu_ptr = edx; 
           // else { eax = *mu_ptr; 
    "jnz  lockloop  \n\t" //   goto lockloop; } 
관련 문제