스핀 락 ( Spin Lock ) 이란?

  • 자신의 퀀텀타임을 포기하지 않고 무한 루프를 통해 자원에 대한 배타적인 접근을 시도하는 방식의 락을 말한다.




스핀 락 ( Spin Lock ) 코드

bool isUse = false;

// 접근 시도
while ((bool)InterlockedExchange8((char*)&isUse, false) == true)
{
    YieldProcessor();
}

// 대입은 원자적으로 이루어지기 때문에 Interlocked 함수를 사용하지 않는다.
isUse = false;
  • InterlockedExchange() 함수를 이용해서 원자적으로 isUse 의 값을 확인하면서 true로 값을 셋팅하여 무한 루프를 통해 배타적인 접근을 시도한다.




YieldProcessor() vs SwitchToThread() vs Sleep(0)

  • 배타적인 접근에 실패하였을 때 YieldProcessor(), SwitchToThread(), Sleep(0) 중 하나를 호출하여 다른 쓰레드가 실행될 수 있는 기회를 줄 수 있다.

YieldProcessor()

  • 하이퍼 쓰레드를 지원하는 CPU를 사용하는 머신에서 YieldProcessor()를 호출하였을 때, YieldProcessor()를 호출한 쓰레드가 실행되고 있는 물리 코어에 속해있는 논리 코어에게 실행을 양보한다.




SwitchToThread()

  • SwitchToThread()를 호출하였을 때 우선순위가 낮아 일정시간 동안 퀀텀 타임을 할당받지 못한 쓰레드에게 수행될 기회를 제공한다.




Sleep(0)

  • Sleep(0) 을 호출하였을 때 현재 퀀텀 타임을 포기하고 블락 큐에 인큐되지만, 자신 보다 우선순위가 같거나 높은 쓰레드가 없다면은 운영체제에 의해서 다시 퀀텀 타임을 할당받아 수행된다.




스핀 락 ( Spin Lock )의 장.단점

장점

  • 자신의 퀀텀 타임 이내에 배타적인 접근에 성공하였다면, 동기화 객체를 사용함으로서 발생될 수 있는 커널 모드로의 전환 및 컨택스트 스위칭으로 발생되는 오버헤드를 줄여 그만큼 성능에서 이점을 얻을 수 있다.




단점

  • 자신의 퀀텀 타임 이내에 배타적인 접근에 실패하였다면, 다른 쓰레드가 운영체제로부터 퀀텀 타임을 할당받아 수행될 수 있는 기회를 주지 못했기 때문에 전체적인 쓰레드 처리량이 떨어진다.

+ Recent posts