스핀 락 ( 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 )의 장.단점
장점
- 자신의 퀀텀 타임 이내에 배타적인 접근에 성공하였다면, 동기화 객체를 사용함으로서 발생될 수 있는 커널 모드로의 전환 및 컨택스트 스위칭으로 발생되는 오버헤드를 줄여 그만큼 성능에서 이점을 얻을 수 있다.
단점
- 자신의 퀀텀 타임 이내에 배타적인 접근에 실패하였다면, 다른 쓰레드가 운영체제로부터 퀀텀 타임을 할당받아 수행될 수 있는 기회를 주지 못했기 때문에 전체적인 쓰레드 처리량이 떨어진다.