본문 바로가기
프로그래밍/개념, 용어

스핀락(Spinlock)

by 제페 2015. 1. 23.
728x90

스핀락(Spinlock)


스핀락(spinlock)은 바쁜 대기의 개념을 이용한 락으로, 

임계 구역(critical section)에 진입이 불가능할 때 진입이 가능할 때까지 

루프를 돌면서 재시도하는 방식으로 구현된 락을 가리킨다. 

스핀락이라는 이름의 유래는 락을 획득할 때까지 해당 스레드가 빙빙 돌고 있다(spinning)는 것을 의미한다.


뮤텍스 락과의 차이점은 락을 얻을 수 없을때 스레드 슬립 모드로 빠지지 않고, 

반복문을 계속 돌며 락을 얻으려는 시도를 한다는 것으로,

락이 해제될 때 별도의 스레드 문맥교환(context switching)에 대한 오버헤드 없이 임계구역에 접근을 한다는 점이다.


뮤텍스 락의 경우, 락이 해제되더라도 운영체제에 의해 스레드가 다시 깨어나야하지만, 

스핀락은 락을 얻을때까지 계속해서 CPU 자원을 점유하므로 CPU를 비효율적으로 낭비할 위험이 있다.

그러므로, 임계구역 진입을 위한 대기시간이 짧을 때 사용하는게 바람직하다.


구현


반복문에 원자적 변수를 계속 검사하고, 값을 변경해 잠그는 것으로 구현한다.


atomic<bool> locked;


...


while(locked.compare_exchange(...))

{

}


스핀락의 잘못된 구현

void lock_spin(atomic bool& locked)

{

  while(!locked){} // 락이 점유되어 있는 동안 블록

  locked = true; // while문에서 이 구문으로 넘어가는 사이에 다른 스레드에서 locked의 값을 변경할 수도 있음!

}


void unlock_spin(atomic bool& locked)
{

  locked = false;
}


CAS(Compare And Swap: 비교와 교환)


일반적인 변수로는 변수가 변경되기 직전에 직전에 다른 스레드에서 값을 변경할 수도 있으므로 비교와 교환을 동시에 하는 CAS 명령이 필요하다.


댓글0