스핀락 예제

큰 커널 잠금 장치를 사용하는 것은 간단합니다. lock_kernel()을 호출하여 잠금을 획득하고 unlock_kernel()을 해제합니다. 루틴 커널_locked()는 잠금이 유지되는 경우 0이 아닌 경우 0이 아닌 경우 비0을 반환합니다. 예를 들어 Spinlocks는 잠금이 오랫동안 유지되지 않는 상황에서 데이터를 잠그는 데 사용해야 합니다. (긴 시간으로 간주되는 것에 대한 지침은 “규칙” 사이드바를 참조하십시오.) 고맙게도, 스핀 록은 어디서나 사용할 수 있습니다. 그러나 스핀록을 들고 있는 동안 잠을 자는 것은 아무 것도 할 수 없습니다. 예를 들어, GFP_KERNEL 플래그가 있는 사용자 메모리, kmalloc(), 세마포 함수 또는 스핀록을 들고 있는 동안 일정 함수에 닿는 함수를 호출하지 마십시오. 경고를 받았습니다. 아래에 지정된 매크로를 사용하여 스핀록을 정적으로 초기화할 수 있습니다. 설명: 시스템이 다른 스레드에서 pthread_spin_lock() 호출에서 사용되는 동안 잠금이 사용 중인 동안 스핀 잠금을 초기화하거나 파괴하려는 시도를 감지했습니다.

원자성 메서드의 다음 그룹은 개별 비트에서 작동하는 메서드입니다. 표준 C 데이터 형식에서 작동하기 때문에 정수 메서드보다 간단합니다. 예를 들어 void set_bit(int nr, void *addr)를 고려합니다. 이 함수는 애더가 가리키는 데이터의 “nr-th” 비트1로 원자적으로 설정됩니다. 원자비트 연산자는 “함수 참조” 사이드바에도 나열됩니다. 예제 섹션에서는 Kthread를 사용하여 뮤텍스를 설명했습니다. Kthread와 그것을 사용하는 방법을 모르는 경우 아래 링크를 사용하여 탐색하는 것이 좋습니다. x86 아키텍처의 이후 구현에서 spin_unlock은 느린 잠긴 XCHG 대신 잠금 해제된 MOV를 안전하게 사용할 수 있습니다. MOV가 전체 메모리 장벽이 아니더라도 이를 지원하는 미묘한 메모리 정렬 규칙 때문입니다. 그러나 일부 프로세서 (일부 Cyrix 프로세서, 인텔 펜티엄 Pro의 일부 개정 (버그로 인해), 이전 펜티엄 및 i486 SMP 시스템)은 잘못된 일을하고 잠금으로 보호 된 데이터가 손상 될 수 있습니다. 대부분의 x86 아키텍처에서 명시적 메모리 장벽 또는 원자성 명령(예에서와 같이)을 사용해야 합니다. IA-64와 같은 일부 시스템에서는 필요한 메모리 순서를 제공하는 특별한 “잠금 해제” 지침이 있습니다.

위와 같은 사소한 예제보다 더 복잡한 경우 보다 완벽한 잠금 솔루션이 필요합니다. 커널에서 가장 일반적인 잠금 기본은 포함 /asm / spinlock.h에 정의 된 스핀 록이며 포함 / linux / spinlock.h를 포함합니다.

This entry was posted in Uncategorized. Bookmark the permalink.

Comments are closed.