맨위로가기

스핀락

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

스핀락은 공유 자원에 대한 접근을 제어하기 위한 동기화 기법으로, 한 번에 하나의 스레드 또는 프로세스만 자원을 사용할 수 있도록 한다. 스핀락은 락을 획득하려는 스레드가 락이 해제될 때까지 반복적으로 확인하는 방식으로 구현되며, x86 어셈블리어 예시를 통해 구현 방식을 확인할 수 있다. 성능 최적화를 위해 다양한 기법이 사용되며, 하드웨어 락 제거 및 메모리 순서와 같은 기술도 활용된다. 스핀락은 대기하는 동안 CPU 자원을 소모하는 단점이 있어, 논블로킹 동기화, 슬립 락, 적응형 뮤텍스와 같은 대안이 사용되기도 한다.

더 읽어볼만한 페이지

  • 동시성 제어 알고리즘 - 데커의 알고리즘
    데커 알고리즘은 두 프로세스 간 상호 배제를 해결하기 위해 만들어진 최초의 소프트웨어 기반 알고리즘 중 하나로, 공유 자원에 대한 동시 접근을 막고 임계 영역 진입 우선순위를 조정하지만, 현대 운영체제에서는 효율성 문제로 잘 사용되지 않으나 상호 배제 개념 이해에 기여한다.
  • 동시성 제어 알고리즘 - 다중 버전 동시성 제어
    다중 버전 동시성 제어(MVCC)는 데이터베이스 시스템에서 데이터의 여러 버전을 관리하여 읽기 작업이 쓰기 작업 중에도 중단 없이 수행되도록 동시성을 관리하는 기술이다.
스핀락
일반 정보
이름스핀락
유형
특징busy-waiting
용도멀티프로세싱 환경에서 짧은 시간 동안 공유 자원에 대한 접근을 동기화하는 데 사용됨
동작 방식
설명스핀락은 락을 획득하기 위해 반복적으로 확인하는 방식으로 작동하며, 락을 획득할 수 있을 때까지 루프를 계속 실행함
장점문맥 전환 오버헤드가 없기 때문에 짧은 임계 영역에 적합함
단점락을 획득하지 못하면 CPU 시간을 낭비할 수 있으며, 우선 순위 역전 문제 및 교착 상태를 유발할 수 있음
기타
구현원자적 연산을 사용하여 구현됨 (예: compare-and-swap)
고려 사항스핀락을 사용하는 동안 스레드가 너무 오래 기다리지 않도록 해야 함

2. 예제 구현

x86 어셈블리어를 사용하여 스핀락을 구현한 예시이며, 인텔 80386 호환 프로세서에서 동작한다. 스핀락의 기본적인 구현과 최적화된 구현은 하위 섹션에서 더 자세히 설명한다.

2. 1. 기본 스핀락 구현

기본적인 스핀락 구현은 원자적(atomic) 연산을 사용하여 락의 획득과 해제를 처리한다. 다음은 x86 어셈블리어를 사용한 스핀락의 구현 예시이다. 인텔 80386 호환 프로세서에서 동작한다.

```assembly

lock: ; 락 변수. 1 = 락 획득, 0 = 락 미획득

dd 0

spin_lock:

mov eax, 1 ; EAX 레지스터에 1을 설정

loop:

xchg eax, [lock] ; 원자적으로 EAX 레지스터와 락 변수의 값을 교환

; 락에는 항상 1이 저장되고, 이전 값이 EAX 레지스터에 저장된다.

test eax, eax ; EAX 자체를 체크. EAX가 0이면 프로세서의 제로 플래그가 설정된다.

; EAX가 0이면, 락은 해제 상태에서 새로 확보된 것으로 간주할 수 있다.

; 그렇지 않으면, EAX는 1이며, 락을 획득하지 못한 것이다.

jnz loop ; 제로 플래그가 설정되지 않은 경우 XCHG 명령으로 돌아간다.

; 이것은 락이 이미 다른 곳에서 획득된 경우이며, 스핀해야 한다.

ret ; 락을 획득했으므로, 호출한 함수로 돌아간다.

spin_unlock:

mov eax, 0 ; EAX 레지스터에 0을 설정

xchg eax, [lock] ; 원자적으로 EAX 레지스터와 락 변수를 교환

ret ; 락을 해제

```[1]

2. 2. 최적화된 스핀락 구현

스핀락은 기본적인 구현 외에도 다양한 성능 최적화 기법이 적용될 수 있다. x86 아키텍처의 후기 구현에서는 더 느린 잠긴 XCHG 대신 잠기지 않은 MOV를 `spin_unlock`에 안전하게 사용할 수 있다. 이는 MOV가 완전한 메모리 장벽이 아님에도 불구하고, 이를 지원하는 미묘한 메모리 순서 규칙 때문이다.[2] 그러나 일부 프로세서에서는 잘못된 동작을 하여 락으로 보호된 데이터가 손상될 수 있으므로 주의해야 한다.

CPU 간의 버스 트래픽을 줄이기 위해 락을 획득하려는 코드는 변경된 값을 읽을 때까지 아무것도 쓰려고 시도하지 않고 루프를 돌면서 값을 읽어야 한다. MESI 캐싱 프로토콜 때문에 락에 대한 캐시 라인이 "공유" 상태가 되어 CPU가 락을 기다리는 동안 버스 트래픽이 거의 발생하지 않는다.[2] 하이퍼스레딩 CPU에서는 `rep nop`를 사용하여 일시 중지하면 락이 대기하는 동안 코어가 다른 스레드에서 작업할 수 있도록 힌트를 제공하여 추가적인 성능을 얻을 수 있다.[2]

트랜잭션 동기화 확장 및 기타 하드웨어 트랜잭션 메모리 명령 집합은 대부분의 경우 락을 대체하는 데 사용된다. 락은 여전히 폴백으로 필요하지만, 프로세서가 전체 블록의 원자적 연산을 처리함으로써 성능을 크게 향상시킬 수 있다. x86의 하드웨어 락 제거(HLE)는 TSE의 약화된 버전이지만 이전 버전과의 호환성을 유지하며, 호환성을 잃지 않고 락킹을 위해 여기서 사용할 수 있다.[3]

테스트-앤드-테스트-앤드-세트(TTAS) 락은 MESI 경합 프로토콜을 사용하는 다중 프로세서 시스템에서 간단한 테스트-앤드-세트(TAS) 방식보다 훨씬 더 나은 성능을 보인다.[4] 프로세서 수가 많은 경우, 락을 다시 확인하기 전에 임의의 지수 백오프 지연을 추가하면 TTAS보다 훨씬 더 나은 성능을 보인다.[4][5]

일부 멀티 코어 프로세서에는 락이 해제된 후 다음 사이클에 프로세서를 절전 상태로 만들고 깨우는 "전력 절약 스핀 락" 명령어가 있다. 이러한 명령어를 사용하는 스핀 락은 백오프 루프가 있거나 없는 스핀 락보다 더 효율적이며 적은 에너지를 사용한다.[6]

2. 2. 1. x86 어셈블리어 예제 (기본)

인텔 80386 호환 프로세서에서 동작하는 x86 어셈블리어를 사용한 스핀락 구현의 기본적인 예제이다.

```assembly

locked: ; 락 변수. 1 = 잠김, 0 = 잠금 해제.

dd 0

spin_lock:

mov eax, 1 ; EAX 레지스터를 1로 설정.

xchg eax, [locked] ; EAX 레지스터와 락 변수를 원자적으로 교환.

; 항상 락에 1을 저장하고, 이전 값은 EAX 레지스터에 남음.

test eax, eax ; EAX를 자기 자신과 테스트. EAX가 0이면 프로세서의 제로 플래그를 설정.

; EAX가 0이면, 락이 잠금 해제된 상태였고 방금 잠근 것임.

; 그렇지 않으면 EAX는 1이고 락을 획득하지 못한 것임.

jnz spin_lock ; 제로 플래그가 설정되지 않은 경우 MOV 명령으로 다시 점프.

; 락이 이전에 잠겨 있었으므로, 잠금 해제될 때까지 스핀해야 함.

ret ; 락이 획득되었으므로, 호출한 함수로 돌아감.

spin_unlock:

mov eax, 0 ; EAX 레지스터를 0으로 설정.

xchg eax, [locked] ; EAX 레지스터와 락 변수를 원자적으로 교환.

ret ; 락이 해제됨.

2. 2. 2. x86 어셈블리어 예제 (최적화)

assembly

; C에서: while (!__sync_bool_compare_and_swap(&locked, 0, 1)) while (locked) __builtin_ia32_pause();

spin_lock:

mov ecx, 1 ; ECX 레지스터를 1로 설정한다.

retry:

xor eax, eax ; EAX를 0으로 설정한다. cmpxchg는 EAX와 비교하기 때문이다.

XACQUIRE lock cmpxchg [locked], ecx

; 원자적으로 결정한다: locked가 0이면, ECX를 쓴다.

; XACQUIRE는 프로세서에 락을 획득하고 있음을 힌트한다.

je out ; 락을 걸었으면 (이전 값은 EAX: 0과 같음), 반환한다.

pause:

mov eax, [locked] ; locked를 EAX로 읽는다.

test eax, eax ; 이전과 같이 0-테스트를 수행한다.

jz retry ; 0이면, 재시도할 수 있다.

rep nop ; CPU에 스핀 루프에서 대기하고 있으므로,

; 이제 다른 스레드에서 작업할 수 있다. "pause"로도 작성된다.

jmp pause ; 계속 확인-일시 중지한다.

out:

ret ; 완료되었다.

spin_unlock:

XRELEASE mov [locked], 0 ; 메모리 순서 규칙이 적용된다고 가정하고,

; "락 해제" 힌트를 사용하여 락 변수를 해제한다.

ret ; 락이 해제되었다.

```

위 코드는 x86 아키텍처에서 스핀락을 구현하는 최적화된 어셈블리어 예제이다. `spin_lock` 함수와 `spin_unlock` 함수로 구성된다.
`spin_lock` 함수 분석:1. `mov ecx, 1`: 락을 획득하기 위해 `locked` 변수에 쓸 값(1)을 ECX 레지스터에 설정한다.

2. `retry:`: 락 획득을 시도하는 레이블이다.

3. `xor eax, eax`: EAX 레지스터를 0으로 초기화한다. `cmpxchg` 명령어는 EAX 레지스터의 값과 `locked` 변수의 값을 비교하기 때문에, 0으로 설정하여 락이 해제된 상태(0)를 나타낸다.

4. `XACQUIRE lock cmpxchg [locked], ecx`: 원자적으로 `locked` 변수의 값을 확인하고 락을 획득하는 핵심 부분이다.

  • `XACQUIRE` 접두사는 프로세서에게 락을 획득하고 있음을 알려준다.
  • `lock` 접두사는 이 명령어가 원자적으로 실행되도록 보장한다. 즉, 다른 프로세서나 코어가 동시에 이 메모리 위치에 접근하는 것을 막는다.
  • `cmpxchg [locked], ecx` 명령어는 `[locked]` (locked 변수가 가리키는 메모리 주소의 값)와 EAX 레지스터의 값을 비교한다.
  • 두 값이 같으면(즉, `locked`가 0이면), `[locked]`에 ECX 레지스터의 값(1)을 쓰고, ZF(Zero Flag)를 설정한다.
  • 두 값이 다르면(즉, `locked`가 이미 1이면), `[locked]`의 값을 EAX 레지스터에 로드하고, ZF를 해제(0)한다.

5. `je out`: ZF가 설정되어 있으면 (즉, `cmpxchg`에서 `locked` 값이 0이었고, 1을 써서 락을 획득했으면), `out` 레이블로 점프하여 함수를 종료한다.

6. `pause:`: 락을 획득하지 못한 경우, 락이 해제될 때까지 대기하는 루프이다.

7. `mov eax, [locked]`: `locked` 변수의 값을 EAX 레지스터로 읽어온다.

8. `test eax, eax`: EAX 레지스터의 값이 0인지 확인한다. (즉, `locked`가 0인지 확인).

9. `jz retry`: ZF가 설정되어 있으면 (즉, `locked`가 0이면), `retry` 레이블로 점프하여 락 획득을 다시 시도한다.

10. `rep nop`: CPU에게 현재 스핀 루프에서 대기 중임을 알려주는 `pause` 명령어이다. `rep nop`는 `pause`와 동일한 기능을 하는 다른 표현이다. 이 명령어는 CPU의 전력 소비를 줄이고, 다른 스레드가 실행될 수 있도록 힌트를 제공한다.

11. `jmp pause`: `pause` 레이블로 돌아가서 락 상태를 다시 확인한다.

12. `out:`: 락을 획득한 후 실행되는 부분이다.

13. `ret`: 함수를 종료하고 호출한 곳으로 돌아간다.
`spin_unlock` 함수 분석:1. `XRELEASE mov [locked], 0`: 락을 해제하는 부분이다.

  • `XRELEASE` 접두사는 프로세서에게 락을 해제하고 있음을 알려준다.
  • `mov [locked], 0`는 `locked` 변수가 가리키는 메모리 주소에 0을 써서 락을 해제한다.

2. `ret`: 함수를 종료하고 호출한 곳으로 돌아간다.

이 코드는 테스트-앤드-테스트-앤드-세트 (TTAS) 방식을 사용하여 락 경쟁을 줄이고, `pause` 명령어를 사용하여 하이퍼스레딩 환경에서 성능을 향상시키는 등 여러 최적화 기법을 적용하고 있다. MESI 경합 프로토콜을 사용하는 다중 프로세서 시스템에서, 이러한 TTAS는 간단한 테스트-앤드-세트 락 (TAS) 방식보다 훨씬 더 나은 성능을 보인다.[4] 프로세서 수가 많은 경우, 락을 다시 확인하기 전에 임의의 지수 백오프 지연을 추가하면 TTAS보다 훨씬 더 나은 성능을 보인다.[4][5]

3. 성능 최적화

스핀락의 성능은 시스템 전체 성능에 큰 영향을 줄 수 있기 때문에, 다양한 최적화 기법이 연구 및 적용되고 있다.

x86 아키텍처에서는 ''spin_unlock'' 구현 시 더 빠른 잠기지 않은 MOV 명령을 사용할 수 있다. 이는 MOV 명령이 완전한 메모리 장벽은 아니지만, 미묘한 메모리 순서 규칙 덕분에 가능하다. 그러나 일부 프로세서에서는 이 방법을 사용할 수 없어 락으로 보호된 데이터가 손상될 수 있다.

CPU 간 버스 트래픽을 줄이기 위해, 락을 획득하려는 코드는 변경된 값을 읽을 때까지 아무것도 쓰려고 시도하지 않고 루프를 돌면서 읽어야 한다. MESI 캐싱 프로토콜 때문에, 락에 대한 캐시 라인이 "공유" 상태가 된다. 그러면 CPU가 락을 기다리는 동안 버스 트래픽이 거의 발생하지 않는다.

하이퍼스레딩 CPU에서는 `rep nop`을 사용하여 일시 중지하면 락이 대기하는 동안 코어가 다른 스레드에서 작업할 수 있도록 힌트를 제공하여 추가적인 성능을 얻을 수 있다.[2]

트랜잭션 동기화 확장 및 기타 하드웨어 트랜잭션 메모리 명령 집합은 대부분의 경우 락을 대체하는 데 사용된다. 락은 여전히 폴백으로 필요하지만, 프로세서가 전체 블록의 원자적 연산을 처리함으로써 성능을 크게 향상시킬 수 있다.

테스트-앤드-테스트-앤드-세트 락 (TTAS)은 MESI 경합 프로토콜을 사용하는 모든 다중 프로세서 시스템에서, 간단한 테스트-앤드-세트 락 (TAS) 방식보다 훨씬 더 나은 성능을 보인다.[4] 프로세서 수가 많은 경우, 락을 다시 확인하기 전에 임의의 지수 백오프 지연을 추가하면 TTAS보다 훨씬 더 나은 성능을 보인다.[4][5]

일부 멀티 코어 프로세서에는 락이 해제된 후 다음 사이클에 프로세서를 절전 상태로 만들고 깨우는 "전력 절약 스핀 락" 명령어가 있다. 이러한 명령어를 사용하는 스핀 락은 백오프 루프가 있거나 없는 스핀 락보다 더 효율적이며 적은 에너지를 사용한다.[6]

싱글 프로세서 시스템에서는 스핀락을 이용한 소프트웨어를 싱글 프로세서용으로 빌드하는 경우, 스핀락의 획득 및 해제 자체를 생략하는 최적화가 가능하다. 단, 스핀락이 보호하고 있는 처리가 프리엠션되지 않는다는 전제로 구현되어 있는 경우가 많으므로, 인터럽트 금지는 여전히 필요하다.

3. 1. 메모리 순서 (Memory Ordering)

Memory ordering영어은 락과 락으로 보호되는 데이터의 갱신 순서를 고려하여 불필요한 지연을 줄이는 최적화 기법이다.

x86 아키텍처에서는 ''spin_unlock'' 구현 시 더 빠른 락되지 않은 MOV 명령을 사용할 수 있다. MOV 명령은 완전한 메모리 장벽은 아니지만, 미묘한 메모리 순서 규칙 덕분에 가능하다. 그러나 일부 프로세서(일부 Cyrix 프로세서, 버그가 있는 일부 Pentium Pro, 초기 Pentium 및 i486 SMP 시스템)에서는 이 방법을 사용할 수 없어 락으로 보호된 데이터가 손상될 수 있다.[2] 다른 프로세서 아키텍처에서는 명시적 메모리 장벽, 원자적 명령어, 또는 특수 "unlock" 명령어(IA-64)를 사용해야 한다.[2]

메모리 순서성은 락과 락 대상 데이터의 갱신 타이밍 문제를 의미한다. 프로그램 상 락 대상 데이터를 먼저 갱신하고 락을 해제하지만, 다른 프로세서에서 이 순서대로 관측된다는 보장은 없다. 즉, 다음 스레드가 락을 획득한 후 락 대상 데이터를 참조할 때 이전 스레드의 갱신 내용을 얻지 못할 수 있다. 따라서 메모리 배리어 명령 등을 사용하여 모든 프로세서의 메모리 쓰기가 다른 프로세서에서 관측 가능하도록 보장해야 한다.

CPU 간 버스 트래픽을 줄이기 위해 락 획득을 시도하는 코드는 값을 읽고 변경될 때까지 쓰기 시도를 하지 않고 루프를 돌아야 한다. MESI 캐싱 프로토콜 덕분에 락에 대한 캐시 라인이 "공유" 상태가 되어 CPU가 락을 기다리는 동안 버스 트래픽이 거의 발생하지 않는다.[2] 이 최적화는 CPU당 캐시가 있는 모든 CPU 아키텍처에서 효과적이다.

3. 2. 버스 트래픽 감소

MESI 프로토콜 덕분에, 락에 대한 캐시 라인이 "공유" 상태가 된다. 그러면 CPU가 락을 기다리는 동안 버스 트래픽이 거의 발생하지 않는다. 이 최적화는 CPU당 캐시가 있는 모든 CPU 아키텍처에서 효과적인데, MESI가 매우 널리 사용되기 때문이다.[2] CPU 간 버스 트래픽을 줄이기 위해, 락을 획득하려는 코드는 락의 값이 변경될 때까지 아무것도 쓰려고 시도하지 않고 루프를 돌면서 읽어야 한다.[2]

3. 3. PAUSE 명령어 (x86)

x86 아키텍처의 PAUSE 명령어는 스핀 루프에서 대기하는 동안 성능을 향상시키는 데 사용된다. 이 명령어는 전력 소비를 줄이고, 하이퍼스레딩 환경에서 다른 스레드의 실행 기회를 늘려준다.[2]

PAUSE 명령어는 `rep nop` 형태로 사용되며, CPU에 스핀 루프에서 대기 중임을 알려준다.[2] 이를 통해 CPU는 다른 스레드에 실행 우선권을 주거나, 전력 소비를 줄이는 등의 최적화를 수행할 수 있다.

SSE2를 지원하는 x86 CPU에서는 PAUSE 명령어를 통해 전력 소비를 줄일 수 있다.[14][15][16][17] 지원하지 않는 CPU에서는 `rep nop`와 동일하게 작동하며 무시된다.

3. 4. 지수 백오프 (Exponential Backoff)

락 획득에 실패했을 때, 다시 시도하기 전까지 대기하는 시간을 점진적으로 늘리는 방식을 지수 백오프라고 한다. 프로세서 수가 많은 경우, 락을 다시 확인하기 전에 임의의 지수 백오프 지연 시간을 추가하면 성능을 크게 향상시킬 수 있다.[4][5]

이는 여러 프로세서가 동시에 락을 획득하려고 할 때 발생할 수 있는 경쟁을 줄여주는 효과가 있다. 각 프로세서는 락 획득에 실패할 때마다 대기 시간을 늘려가며, 이로 인해 다른 프로세서가 락을 획득할 기회를 더 많이 얻게 된다.

3. 5. 하드웨어 락 제거 (Hardware Lock Elision, HLE)

인텔의 트랜잭션 동기화 확장(TSX)과 같은 하드웨어 기능을 활용하면 락을 사용하지 않고도 원자적 연산을 수행할 수 있다. 이를 하드웨어 락 제거 (Hardware Lock Elision, HLE)라고 한다.[3]

HLE는 TSX의 약화된 버전이지만 이전 버전과의 호환성을 유지하면서 락킹에 사용될 수 있다. 프로세서는 두 스레드가 실제로 충돌할 때까지 락을 걸지 않도록 선택할 수 있어 성능을 향상시킨다.[3] 이 기능은 glibc와 같은 일부 뮤텍스 구현에 내장되어 있다.

4. 대안

스핀락의 주요 단점은 대기하면서 락을 획득하는 동안 다른 곳에서 생산적으로 사용될 수 있는 시간을 낭비한다는 것이다. 이러한 문제점을 해결하기 위한 대안으로는 크게 두 가지가 있다.


  • 락을 획득하지 않는 방법 (논블로킹 동기화)
  • 대기하는 동안 다른 스레드로 컨텍스트 스위칭하는 방법 (슬립 락)


OpenBSD는 스핀락을 티켓 락으로 대체하여 선입선출 동작을 적용했지만, 커널에서 더 많은 CPU 사용량과 파이어폭스와 같은 대형 애플리케이션의 속도 저하를 초래했다.[9][10]

4. 1. 논블로킹 동기화 (Non-blocking Synchronization)

락을 획득하지 않는 방법은, 많은 상황에서 논블로킹 동기화가 필요한 데이터 구조를 설계하여 적용할 수 있다. 예를 들어 스레드별 또는 CPU별 데이터를 사용하고 인터럽트를 비활성화하는 방식이 있다.[7] 데이터 구조를 잘 설계하면 락을 사용하지 않고도 문제를 해결할 수 있는데, 스레드마다 데이터를 준비하거나 CPU마다 데이터를 준비하여 인터럽트를 불가능하게 만드는 등의 기법이 존재한다.[18]

4. 2. 슬립 락 (Sleep Lock)

락을 획득하지 못한 스레드를 대기 상태(sleep)로 전환하여 CPU 자원을 다른 스레드에 양보하는 방식이다. 일반적으로 현재 스레드를 락을 기다리는 스레드 큐에 연결한 다음, 유용한 작업을 수행할 준비가 된 다른 스레드로 컨텍스트 스위칭한다. 이 방식은 모든 스레드가 결국 획득한 락을 해제하고, 어떤 스레드가 먼저 진행해야 하는지에 대한 스케줄링 결정을 내릴 수 있는 한 자원 기아가 발생하지 않도록 보장하는 장점이 있다.[7]

솔라리스, macOS, FreeBSD와 같은 대부분의 운영 체제는 "적응형 뮤텍스"라고 하는 하이브리드 방식을 사용한다. 이 방식은 현재 실행 중인 스레드에 의해 잠긴 자원에 접근하려고 할 때는 스핀락을 사용하고, 스레드가 현재 실행 중이지 않은 경우에는 슬립하는 것이다. (후자는 단일 프로세서 시스템에서는 ''항상'' 해당한다.)[8]

4. 3. 적응형 뮤텍스 (Adaptive Mutex)

솔라리스, macOS, FreeBSD를 포함한 대부분의 운영 체제는 "적응형 뮤텍스"라고 하는 혼합 방식을 사용한다.[8] 이 방식은 현재 실행 중인 스레드가 잠근 자원에 접근하려고 할 때는 스핀락을 사용하고, 스레드가 현재 실행 중이지 않은 경우에는 슬립하는 방식이다.[8] (후자는 단일 프로세서 시스템에서는 ''항상'' 해당한다.)[8] 특히, 락을 소유하고 있는 스레드가 선점되어 CPU를 잃었을 경우에는, 해당 락을 스핀하면서 기다리는 스레드를 슬립 상태로 만들어 데드락을 방지한다. 반면에, 스핀하는 동안 락의 상태뿐만 아니라 그것을 소유하고 있는 스레드의 상태도 확인해야 하므로, 실행 비용은 순수한 스핀락보다 더 많이 든다.

5. 한국 관련 사례 및 동향

한국의 IT 산업, 특히 게임, 금융, 통신 분야에서는 멀티스레드 환경이 보편화되어 있어 스핀락을 포함한 동기화 메커니즘의 최적화가 매우 중요하다.

참조

[1] 서적 Operating System Concepts Addison-Wesley
[2] 웹사이트 gcc - x86 spinlock using cmpxchg https://stackoverflo[...]
[3] 웹사이트 New Technologies in the Arm Architecture https://static.sched[...] 2019-09-26
[4] 문서 The Art of Multiprocessor Programming http://cs.brown.edu/[...]
[5] 문서 Boost.Fiber Tuning: Exponential back-off https://www.boost.or[...]
[6] 문서 Parallelism and the ARM Instruction Set Architecture https://www.ics.uci.[...]
[7] 웹사이트 Spinlock naming resolved https://lwn.net/Arti[...] LWN.net 2009-12-09
[8] 서적 Operating System Concepts Addison-Wesley
[9] 웹사이트 src/lib/librthread/rthread.c - Revision 1.71 http://cvsweb.openbs[...] 2022-01-25
[10] 웹사이트 tedu comment on Locking in WebKit - Lobsters https://lobste.rs/c/[...] 2016-05-06
[11] 문서 Introduction to Spin Locks - Windows drivers | Microsoft Learn https://learn.micros[...]
[12] 문서 マルチスレッドのプログラミング > 第 4 章 同期オブジェクトを使ったプログラミング > スピンロックの使用 | Oracle https://docs.oracle.[...]
[13] 서적 Operating System Concepts Addison-Wesley
[14] 웹사이트 Benefitting Power and Performance Sleep Loops http://software.inte[...] Intel 2022-12-03
[15] 웹사이트 スリープループによる消費電力とパフォーマンスの改善 https://www.isus.jp/[...] 2019-05-05
[16] 문서 Pause Intrinsic | Intel® C++ Compiler Classic Developer Guide and Reference https://www.intel.co[...]
[17] 문서 ストリーミング SIMD 拡張命令 2 の PAUSE 組み込み関数 http://www2.kobe-u.a[...]
[18] 서적 Operating System Concepts Addison-Wesley



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com