"스핀 락"이란 정확히 무엇입니까?


108

나는 항상 그들이 무엇인지 궁금했습니다. 내가 그들에 대해들을 때마다 미래의 플라이휠과 같은 장치의 이미지가 내 마음을 통해 춤을 추고 (구르는?) ...

그들은 무엇인가?

답변:


125

일반 잠금 (뮤텍스, 중요 섹션 등)을 사용하면 운영 체제가 스레드를 WAIT 상태로 만들고 동일한 코어에있는 다른 스레드를 예약 하여 선점 합니다. 대기 시간이 정말 짧으면 스레드가 CPU 시간을 다시 받기 위해 선점을 기다려야하기 때문에 성능이 저하됩니다.

게다가, 커널 객체는 인터럽트 핸들러 나 페이징을 사용할 수없는 경우와 같이 커널의 모든 상태에서 사용할 수있는 것은 아닙니다.

스핀 록은 선점을 일으키지 않지만 다른 코어가 잠금을 해제 할 때까지 루프 ( "스핀")에서 대기합니다. 이렇게하면 스레드가 퀀텀 을 잃지 않고 잠금이 해제되는 즉시 계속됩니다. 스핀 락의 간단한 메커니즘을 통해 커널은 거의 모든 상태에서이를 활용할 수 있습니다.

이것이 단일 코어 머신에서 스핀 락이 단순히 스레드 스케줄링을 완전히 방지하는 "인터럽트 비활성화"또는 "IRQL 증가"인 이유입니다.

Spinlock은 궁극적으로 커널이 "Big Kernel Lock"(코어가 커널에 들어갔다가 종료 할 때 해제되는 잠금)을 피하고 커널 기본 요소에 대해 세분화 된 잠금을 갖도록하여 멀티 코어 시스템에서 더 나은 다중 처리를 유발하여 성능을 향상시킵니다.

편집 : 질문이 나왔습니다. "가능하면 스핀 락을 사용해야한다는 뜻입니까?" 그리고 나는 그것에 대답하려고 노력할 것입니다.

앞서 언급했듯이 Spinlock은 예상 대기 시간이 퀀텀 (읽기 : 밀리 초)보다 짧고 선점이 그다지 의미가없는 (예 : 커널 개체를 사용할 수 없음) 장소에서만 유용합니다.

대기 시간을 알 수 없거나 사용자 모드에있는 경우 Spinlock이 효율적이지 않습니다. 스핀 락을 사용할 수 있는지 확인하는 동안 대기중인 코어에서 100 % CPU 시간을 소비합니다. 퀀텀이 만료 될 때까지 다른 스레드가 해당 코어에서 실행되지 않도록합니다. 이 시나리오는 커널 수준의 짧은 버스트에만 가능하며 사용자 모드 응용 프로그램에 대한 옵션은 아닙니다.

다음은 Spinlocks, 얼마나 유용합니까?


가능한 한 뮤텍스, 임계 섹션 등 대신 스핀 록을해야한다는 의미입니까?

1
내가 틀렸다면 누군가 나를 정정 해주세요.하지만 스핀 락은 선점 (예 : 재 예약)을 비활성화하지 않습니다. 간단한 이유는 spinlock이 다른 프로세스에 의해 잠긴 리소스를 기다리고있는 경우 해당 두 번째 프로세스에 리소스를 실행하고 해제 할 수있는 기회가 주어져야합니다. 또는 두 번째 프로세스를 실행하려면 첫 번째 (회전) 프로세스를 선점해야합니다.
user1284631 2010

대신 spinlock이 수행하는 것은 프로세스 상태를 TASK_RUNNING에서 TASK_INTERRUPTIBLE (휴면 상태)로 변경하지 않으므로 해당 프로세스 (메모리, 캐시 등)에 대한 모든 것을 저장 하지 않습니다 . 대신 회전 프로세스가 선점되지만 "즉시 예약 가능한"프로세스를 종료하지 않습니다. 메모리에 유지되고 다른 프로세스 중 하나가 회전자가 대기중인 리소스를 해제 할 때까지 정기적으로 실행됩니다. spinlock은 단순히 돌아오고 회전 과정을 계속할 수 있습니다. 항상 TASK_RUNNING 상태로 기다립니다.
user1284631 2011

1
당신은 그것에 대해 옳습니다 (또한 이것 : linuxjournal.com/article/5833 참조 ), 사실은 자원을 잠그고 인터럽트를 비활성화하는 것은 유용하지만 공동으로 수행하는 것이 유용하지만 그렇지 않으면 관련이없는 개념입니다. 기본적으로 일관성없는 상태에서 발견 된 리소스를 사용하고 있지 않은지 확인하고 싶기 때문에 잠금을 테스트합니다. 인터럽트를 비활성화 (선점)하면 그렇습니다. 당신이 그것을 다루는 동안 아무도 당신의 부활을 망치지 않을 것입니다. 그러나이를 위해서는 자원을 획득 할 때 자원이 무료인지 확인해야합니다.
user1284631

1
(그런 다음 다른 작업이 당신을 선점하고 자원을 망치지 않도록 인터럽트를 비활성화하십시오). UP (단일 프로세서)에서는 항상 첫 번째 (및 이후의) 스핀 록이 부여되고 인터럽트 (예 : 선점)가 비활성화되며 리소스를 사용하는 작업이 선점되지 않습니다. 리소스에 대한 작업을 수행 한 다음 인터럽트를 활성화합니다 (따라서 선점). 선점이 활성화되면 리소스가 이미 사용 가능합니다. 기본적으로, UP에, 어떤 스핀 록 경합이없는기다릴 필요가 없습니다 . SMP에서는 그럴 수도 있습니다.
user1284631

25

리소스가 잠금으로 보호되고 있다고 가정하면 리소스에 액세스하려는 스레드가 먼저 잠금을 획득해야합니다. 잠금을 사용할 수없는 경우 스레드는 잠금이 해제되었는지 반복적으로 확인할 수 있습니다. 이 시간 동안 스레드는 CPU를 사용하여 잠금을 확인하지만 유용한 작업을 수행하지 않고 대기합니다. 이러한 잠금을 스핀 잠금이라고합니다.


2
좋은 대답입니다! +1
Jayesh Bhoi

18

특정 조건이 충족 될 때까지 계속되는 루프입니다.

while(cantGoOn) {};

1
그리고 / 또는 while (cantGoOn) {sleep (0)};
Jiminion 2016-07-28

@Jiminion을 넣으면 sleep(0)스레드를 선점하여 처음에 스핀 록을 사용하는 목적을 죽일 것입니다. 다른 스레드에 양보해야하는 경우 일반 잠금을 사용해야합니다. (나는 귀하의 의견이 매우 오래되었지만 다른 사람들이 이것을 제안으로 보지 못하게하고 싶었습니다).
Sedat Kapanoglu

"값이 0이면 스레드가 나머지 시간 조각을 실행할 준비가 된 다른 스레드에 양도합니다. 실행할 준비가 된 다른 스레드가 없으면 함수가 즉시 반환되고 스레드가 계속 실행됩니다."
Jiminion


5

바쁜 기다림 을하는 일종의 자물쇠

매우 낮은 수준의 드라이버 프로그래밍 ( "적절한"대기 함수를 호출하면 몇주기 동안 단순히 바쁜 잠금보다 더 많은 오버 헤드가 발생할 수 있음)를 제외하고는 안티 패턴으로 간주됩니다.

예를 들어 Linux 커널의 Spinlocks를 참조하십시오 .


3

SpinLock은 스레드가 잠금을 사용할 수있을 때까지 대기하는 것입니다. 이것은 일반적으로 약간의 짧은 시간 내에 커널 객체를 획득 할 수있는 범위가있을 때 커널 객체를 획득하는 오버 헤드를 피하기 위해 사용됩니다.

전의:

While(SpinCount-- && Kernel Object is not free)
{}

try acquiring Kernel object

3

리소스가 잠길 때 차단하는 대신 바쁜 대기 루프에 들어가 리소스를 풀링하는 것이 더 저렴하다고 생각할 때 스핀 락을 사용하는 것이 좋습니다.

회전은 잠금이 세밀하고 숫자가 많은 경우 (예 : 연결된 목록의 노드 당 잠금) 및 잠금 유지 시간이 항상 매우 짧은 경우에 유용 할 수 있습니다. 일반적으로 스핀 잠금을 유지하는 동안 차단을 피해야합니다. 스스로 차단할 수있는 모든 항목을 호출하고, 한 번에 둘 이상의 스핀 잠금을 유지하고, 동적으로 디스패치 된 호출 (인터페이스 및 가상)을 만들고, 그렇지 않은 코드에 정적으로 디스패치 된 호출을 만듭니다. t 소유 또는 할당 메모리.

성능상의 이유로 SpinLock이 값 유형이라는 점에 유의하는 것도 중요합니다. 따라서 두 인스턴스 (원본 및 복사본)가 서로 완전히 독립적이되어 응용 프로그램의 잘못된 동작을 유발할 수 있으므로 실수로 SpinLock 인스턴스를 복사하지 않도록 매우주의해야합니다. SpinLock 인스턴스를 전달해야하는 경우 값이 아닌 참조로 전달해야합니다.


1

간단히 말해, spinlock은 CAS (atomic compare and swap) 또는 테스트 및 설정 명령을 사용하여 잠금 및 대기없는 스레드 안전 관용구를 구현합니다. 이러한 구조는 멀티 코어 머신에서 잘 확장됩니다.


정의상 스핀 록은 잠금 해제 또는 대기 해제를 구현하는 데 사용되지 않습니다.
rdb

0

조건이 충족 될 때까지 회전하는 루프입니다.


0

예-스핀 잠금 (전통적인 중요 섹션 등)의 요점은 일부 상황 (멀티 코어 시스템 ..)에서 더 나은 성능을 제공한다는 것입니다. 왜냐하면 스레드의 나머지 양자를 즉시 ​​산출하지 않기 때문입니다.


0

Spinlock은 잠금 유형으로, 차단 및 수면이 불가능합니다. 공유 또는 중요 리소스에 대한 스핀 록을 획득하려는 스레드는 지정된 리소스에 대한 잠금을 획득 할 때까지 CPU 처리주기를 낭비하면서 지속적으로 회전합니다. 스핀 락이 획득되면 퀀텀에서 작업을 완료 한 다음 각각 리소스를 해제하려고합니다. Spinlock은 우선 순위가 가장 높은 유형의 잠금입니다. 간단히 말해 비 선점 잠금 유형입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.