2009-12-24 2 views
65

나는 항상 그들에 대해 궁금해했다 : 나는 그들에 관해들을 때마다, 미래의 플라이휠과 같은 장치의 이미지가 내 마음을 통해 춤추 기 (롤링?)된다.정확히 "스핀 록"이란 무엇입니까?

그들은 무엇인가?

답변

82

일반 잠금 장치 (뮤텍스, 중요 섹션 등)를 사용하면 운영 체제가 스레드를 대기 상태로두고 preempts 동일한 스레드의 다른 스레드를 예약하여 스레드를 대기 상태로 만듭니다. 스레드가 CPU 시간을 다시 받기 위해 preemption을 기다려야하기 때문에 대기 시간이 매우 짧으면 성능이 저하됩니다. 게다가

는 커널 오브젝트는 인터럽트 핸들러로, 커널의 모든 국가에서 사용할 수없는 또는 페이징 등을 사용할 수없는 경우

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

단일 핵심 컴퓨터에서 스핀 록은 단순히 "인터럽트 비활성화"또는 "IRQL 발생"으로 스레드 스케줄링을 완전히 방지합니다.

스핀 록은 궁극적으로 커널이 "Big Kernel Lock"(코어가 커널에 들어가고 종료 될 때 획득되는 잠금)을 피하도록하고 커널 프리미티브보다 세분화 된 잠금을 사용하여 멀티 코어 시스템에서 더 나은 다중 처리 공연.

편집 : 질문 : "가능하면 어디에서나 스핀 록을 사용해야합니까?

내가 언급했듯이 예상되는 대기 시간이 퀀텀 (읽기 : 밀리 초)보다 짧아서 선매가별로 의미가없는 장소에서만 유용합니다 (예 : 커널 개체가 없습니다.) 사용 가능합니다.

대기 모드 시간을 알 수 없거나 사용자 모드 인 경우 스핀 록 사용 가능 여부를 확인하면서 대기 코어에서 100 % CPU 시간을 소비합니다. 당신의 퀀텀이 만료 될 때까지 그 코어에서 쓰레드가 실행되는 것을 막을 수 있습니다.이 시나리오는 커널 레벨에서의 짧은 버스트와 사용자 모드 응용 프로그램에 대한 옵션에서는 가능하지 않습니다.

여기에 질문이 있습니다. Spinlocks, How Useful Are They?

+0

가능하다면 어디서나 스핀 록 (뮤텍스, 크리티컬 섹션 등이 아닌)을해야한다는 의미입니까? –

+0

질문에 너무 답변했습니다. –

+0

누군가 틀렸을 때 누군가를 교정 해주세요. 그러나 스핀 락으로 선매 (즉, 재 스케줄링)가 불가능하지 않습니다. 단순한 이유 때문에, 스핀 록이 다른 프로세스에 의해 잠긴 리소스를 기다리고 있다면, 두 번째 프로세스는 리소스를 실행하고 해제 할 수있는 기회를 가져야합니다. 또는 두 번째 프로세스를 실행하려면 첫 번째 (회전) 프로세스를 선점해야합니다. – user1284631

0

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

while(cantGoOn) {}; 
6
while(something != TRUE){}; 
// it happend 
move_on(); 
15

그것은 pertty 많이 충족 특정 조건까지가는 계속 루프입니다 먼저 자물쇠. 잠금을 사용할 수없는 경우 스레드는 잠금이 해제되었는지 반복적으로 확인할 수 있습니다. 이 시간 동안 스레드는 CPU를 사용하여 잠금을 확인하지만 어떤 유용한 작업도하지 않습니다. 이러한 자물쇠는 스핀 자물쇠라고합니다.

+0

그리고/또는 while (cantGoOn) {sleep (0)}; – Jiminion

10

는 자원이 잠금 리소스에 대한 액세스를 획득 할 필요가 원하는 스레드에 의해 보호됩니다 말 :

+0

좋은 답변입니다! +1 –

3

SpinLocks는 스레드가 잠금을 사용할 수있을 때까지 대기하는 스레드입니다. 이것은 보통 작은 시간 내에 커널 객체를 획득 할 수있는 범위가있을 때 커널 객체를 얻는 오버 헤드를 피하기 위해 사용됩니다.

예 : 간단히 말해서

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

try acquiring Kernel object 
1

는 스핀 락은 원자 비교 및 ​​스왑 (CAS) 또는 잠금 무료 구현 무료 스레드 안전 관용구를 기다리는 지침과 같은 테스트 및 세트 사용합니다. 이러한 구조는 멀티 코어 시스템에서 잘 확장됩니다.

+0

매우 정의하자면, 스핀 락은 아무것도 잠그지 않거나 자유롭게 기다리는 것을 구현하는 데 사용되지 않습니다. – rdb

0

글쎄요, 스핀 록 (전통적인 크리티컬 섹션 등)의 요점은 일부 상황 (멀티 코어 시스템 ..)에서 나머지 스레드가 즉시 나오지 않기 때문에 더 나은 성능을 제공한다는 것입니다 양자.

+0

좋은 지적이지만 일반적인 설명은 아닙니다. – RCIX

4

그것은 "적절한"대기 함수를 호출하는 것은 더 가지고 일어날 수있는 (매우 낮은 수준의 드라이버 프로그램을 제외하고, busy waiting

그것은 안티 패턴 간주하지 잠금의 유형이다 : 그 노래 오버 헤드는 단순히 몇 사이클 동안 바쁜 잠금보다).

예를 들어 Spinlocks in Linux kernel을 참조하십시오.

3

바쁜 대기 루프에 들어가서 리소스가 잠길 때 차단하는 대신 리소스를 저장하는 것이 더 경제적이라고 생각할 때 스핀 록을 사용하고자 할 것입니다.

스핀은 잠금 대기 시간이 항상 매우 짧은 경우뿐만 아니라 잠금이 세분화되어 있고 개수가 많은 경우 (예 : 링크 된 목록의 노드 당 잠금)에 유용 할 수 있습니다. 일반적으로 스핀 잠금을 사용하는 동안 블로킹, 즉 차단할 수있는 모든 것을 호출하고 한 번에 둘 이상의 스핀 잠금을 유지하며 동적으로 전달 된 호출 (인터페이스 및 가상)을 만들어 정적으로 디스패치 된 호출을 모든 코드로 생성하면 안됩니다. 소유하거나, 메모리를 할당하십시오.

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

0

스핀 록 (spinlock)은 잠글 수없는 논 블럭 타입의 잠금 장치입니다. & 잠자기 불가 능합니다. 공유 또는 중요한 리소스에 대해 스핀 록을 획득하려는 모든 스레드는 계속 회전하여 지정된 리소스에 대한 잠금을 얻을 때까지 CPU 처리주기를 낭비합니다. 일단 스핀 락 (spinlock)이 획득되면 양자에서 작업을 완료 한 다음 리소스를 각각 해제하려고 시도합니다. Spinlock은 잠금 장치의 가장 우선 순위가 높은 유형이며 간단히 말하면 비 선점적인 종류의 잠금 장치입니다.