spinlock 예제

이 간단한 예제 외에도 동기화 프리미티브는 Linux 커널에서 유비쿼터스입니다. 이전 장이나 다른 장을 다시 살펴보거나 일반적으로 Linux 커널 소스 코드를 살펴보면 다음과 같은 많은 장소를 만날 것입니다. Linux 커널에서 뮤텍스가 어떻게 구현되는지는 고려하지 않습니다. 실제로 Linux 커널은 다음과 같은 서로 다른 동기화 프리미티브 집합을 제공합니다. 따라서 변수에 액세스하기 전에 스핀 록을 잠글 수 있습니다. 그 후 스핀 록을 해제합니다. 이 예제는 접근 방식 1을 사용하고 있습니다. 설명: 시스템이 다른 스레드에서 pthread_spin_lock() 호출에서 사용되는 동안 잠금이 사용 중인 동안 스핀 잠금을 초기화하거나 파괴하려는 시도를 감지했습니다. x86 아키텍처의 이후 구현에서 spin_unlock은 느린 잠긴 XCHG 대신 잠금 해제된 MOV를 안전하게 사용할 수 있습니다. MOV가 전체 메모리 장벽이 아니더라도 이를 지원하는 미묘한 메모리 정렬 규칙 때문입니다. 그러나 일부 프로세서 (일부 Cyrix 프로세서, 인텔 펜티엄 Pro의 일부 개정 (버그로 인해), 이전 펜티엄 및 i486 SMP 시스템)은 잘못된 일을하고 잠금으로 보호 된 데이터가 손상 될 수 있습니다. 대부분의 x86 아키텍처에서 명시적 메모리 장벽 또는 원자성 명령(예에서와 같이)을 사용해야 합니다.

IA-64와 같은 일부 시스템에서는 필요한 메모리 순서를 제공하는 특별한 “잠금 해제” 지침이 있습니다. 예제 섹션에서는 Kthread를 사용하여 뮤텍스를 설명했습니다. Kthread와 그것을 사용하는 방법을 모르는 경우 아래 링크를 사용하여 탐색하는 것이 좋습니다. Mutex 개념에서 스레드가 사용할 수 없는 Mutex를 잠그거나 획득하려고 할 때 해당 스레드는 뮤텍스를 사용할 수 있을 때까지 절전 모드로 이동합니다. 스핀 록에서는 다른 반면. 스핀록은 매우 간단한 단일 홀더 잠금 장치입니다. 프로세스가 스핀록을 획득하려고 시도하고 사용할 수 없는 경우 프로세스가 잠금을 획득할 때까지 계속 시도(회전)합니다. 이 단순함은 작고 빠른 잠금을 만듭니다. 큰 커널 잠금 장치를 사용하는 것은 간단합니다.

lock_kernel()을 호출하여 잠금을 획득하고 unlock_kernel()을 해제합니다. 루틴 커널_locked()는 잠금이 유지되는 경우 0이 아닌 경우 0이 아닌 경우 비0을 반환합니다. 예: 이전 자습서에서는 뮤텍스와 구현의 사용을 이해했습니다. 뮤텍스를 이해했다면 스핀록도 비슷합니다. 둘 다 두 개 이상의 프로세스에 의해 동시에 수정 되지 않도록 공유 리소스를 보호 하는 데 사용 됩니다. 커널/시간/clocksource.c 소스 코드 파일에서 확인할 수 있습니다. 이 코드는 지정된 클럭 소스를 클럭 소스 목록에 추가하는 __clocksource_register_scale 함수에서 가져옵니다. 이 함수는 등록된 클럭 원본이 있는 목록에서 서로 다른 작업을 생성합니다. 예를 들어, clocksource_enqueue 함수는 등록된 클럭소스-클럭소스_list를 사용하여 지정된 클럭 소스를 목록에 추가합니다.

Posted in Uncategorized