현재 제가 사용하고 있는 커널에는 세 가지 spin_lock 함수가 있습니다.
- 스핀 잠금
- 스핀 잠금 인터럽트
- 스핀 잠금 인터럽트 저장
나는 그 중 두 가지만을 다루는 기여(Linux 문서 포함)만 찾았습니다.
답변이나 설명은 모호하거나 모순될 수 있으며 심지어 설명이 잘못되었다는 의견을 포함할 수도 있습니다. 이로 인해 개요를 파악하기가 어렵습니다.
인터럽트 컨텍스트에서 간단한 spin_lock()이 교착 상태를 일으킬 수 있다는 것과 같은 몇 가지 기본 사항은 나에게 분명합니다. 하지만 이 주제에 대한 완전한 설명을 제공해 주시면 정말 감사하겠습니다.
이해해야 할 사항:
- 언제 어떤 버전을 사용해야 하며, 언제 사용해서는 안 됩니까?
- 더 안전한 버전을 사용할 필요는 없지만 성능이 저하되지는 않는 경우는 언제입니까?
- 특정 상황에서 특정 버전을 사용하는 이유는 무엇입니까?
답변1
5장에 간략한 설명이 나와 있습니다. 동시성과 경쟁 조건Linux 장치 드라이버, 제3판
void spin_lock(spinlock_t *lock);
void spin_lock_irqsave(spinlock_t *lock, unsigned long flags);
void spin_lock_irq(spinlock_t *lock);
spin_lock_irqsave
스핀 잠금을 획득하기 전에 인터럽트를 비활성화합니다(로컬 프로세서에서만). 이전 인터럽트 상태는 에 저장됩니다flags
. 프로세서에서 인터럽트를 비활성화한 다른 것이 없다고 절대적으로 확신하는 경우(즉, 스핀 잠금이 해제될 때 인터럽트가 활성화되어야 한다고 확신하는 경우)spin_lock_irq
추적 플래그 없이 사용할 수 있습니다.
spin_lock_irq*
인터럽트 컨텍스트에서 스핀 잠금을 유지하려는 경우 이러한 기능이 중요합니다. 그 이유는 스핀 잠금이 로컬 CPU에 의해 유지되고 로컬 CPU가 스핀 잠금을 잠그려고 시도하는 인터럽트를 서비스하면 교착 상태가 발생하기 때문입니다.