[운영체제] 스핀락(Spin Lock)이란?

[운영체제] 스핀락(Spin Lock)이란?

Spin Lock은 이름이 뜻하는대로, 만약 다른 스레드가 lock을 소유하고 있다면 그 lock이 반환될 때까지 계속 확인하며 기다리는 것이다.

'조금만 기다리면 바로 쓸 수 있는데 굳이 Context Switching으로 부하를 줄 필요가 있나?'라는 컨셉으로 개발된 것으로 Critical Section에 진입이 불가능할 때 컨텍스트 스위칭을 하지 않고 잠시 루프를 돌면서 재시도를 하는것을 말합니다.

Lock-Unlock과정이 아주 짧아서 락하는 경우가 드문 경우 유용합니다.
( = 적절하게 크리티컬 섹션을 사용한 경우 )

예를 들어 어떤 숫자를 단순히 +1해주는데 사용될 락이 있다고 생각해보자
이 경우는 거창하게 Context Switching을 하면서 구현할 필요가 없다.
잠깐 밖에서 값을 검사해보고 내가 사용가능하면 바로 처리 하도록 하는게 효율적이다.
이 개념이 '스핀 락' 개념이다.

그냥 단순히 적절한 시간동안 외부에서 for이나 while로 루프를 돌면서 락을 검사하고 처리하게 되는 것이다.
이 때 임계 영역은 굉장히 작거나 아주 빨리 처리가 가능할 경우 이런 락을 쓰게 된다.


Spin Lock의 특성

  • Lock을 얻을 수 없다면, 계속해서 Lock을 확인하며 얻을 때까지 기다린다.
    이른바 바쁘게 기다리는 busy waiting이다.
  • 바쁘게 기다린다는 것은 무한 루프를 돌면서 최대한 다른 스레드에게 CPU를 양보하지 않는 것이다.
  • Lock이 곧 사용가능해질 경우 Context Switching을 줄여 CPU의 부담을 덜어준다.
    하지만, 만약 어떤 스레드가 Lock을 오랫동안 유지한다면 오히려 CPU 시간을 많이 소모할 가능성이 있다.
  • 하나의 CPU나 하나의 코어만 있는 경우에는 유용하지 않다.
    그 이유는 만약 다른 스레드가 Lock을 가지고 있고 그 스레드가 Lock을 풀어 주려면 싱글 CPU 사용률 100%를 만드는 상황이 발생하므로 주의해야한다.
    스핀락은 기본적으로 무한 for루프를 돌면서 lock을 기다리므로 하나의 스레드가 lock을 오랫동안 가지고 있다면, 다른 Blocking된 스레드는 busy waiting을 하므로 CPU를 쓸데없이 낭비하게 된다.
장점은 Spin Lock을 잘 사용하면 context switch를 줄여 효율을 높일 수 있습니다.
무한 루프를 돌기 보다는 일정 시간 lock을 얻을 수 없다면 잠시 sleep하는 back off 알고리즘을 사용하는것이 훨씬 좋습니다.


또한 뮤텍스(Mutex)라는 락이 있는데 이는 Mutualy Exclusive라는 락이다.
결국 이것도 세마포어이긴 한데, 특별히 카운트가 1인 락으로 봐도 모방하다.
이와 반대로 스핀 락은 자지 않고 계속해서 버틴다고 볼 수 있다.



출처

댓글

이 블로그의 인기 게시물

[Python] # -*- coding: utf-8 -*-를 쓰는 이유

[소프트웨어공학] NS(Nassi-Schneiderman) 차트

[컴퓨터네트워크] Telnet이란?