리눅스 스핀락 예제

코드 조각이 스핀 록을 두 번 잡으려고 시도하는 코딩 버그가 있습니다 : 잠금이 해제 될 때까지 영원히 회전합니다 (스핀 록, rwlocks 및 뮤텍스는 Linux에서 재귀적이지 않습니다). 이것은 진단하는 사소한 일입니다 : 5 박 – 투 – 투 – 솜털 코드 토끼 종류의 문제가 아닙니다. 에 오신 것을 환영합니다, 커널 잠금 문제에 Rusty의 현저하게 신뢰할 수없는 가이드. 이 문서에서는 2.6의 Linux 커널의 잠금 시스템에 대해 설명합니다. 리눅스에서 세마포어는 잠자는 자물쇠입니다. 스핀 대신 경합에서 절전 모드로 작업할 수 있기 때문에 잠금 유지 시간이 길어질 수 있는 경우에 사용됩니다. 반대로, 그들은 잠을 작업을 넣어 다음 그것을 깨우기의 오버 헤드를 가지고 있기 때문에, 그들은 잠금 개최 시간이 짧은 곳에 사용되어서는 안된다. 그러나 절전 모드이므로 사용자 컨텍스트를 동기화하는 데 사용할 수 있지만 스핀록은 사용할 수 없습니다. 즉, 세마포를 들고 있는 동안 차단하는 것이 안전하다. 우리는 당분간이 구조에 멈추지 않을 것입니다.

스핀록의 작업을 살펴보겠습니다. 리눅스 커널은 스핀록에 대한 주요 작업을 제공합니다: Linux 커널은 또한 다운() 기능을 제공하며, 이는 호출 작업을 중단없는 수면에 넣는다는 점에서 다릅니다. 무정전 수면에서 차단된 프로세스에 의해 수신된 신호는 무시됩니다. 일반적으로 개발자는 down_interruptible()을 사용하려고 합니다. 마지막으로 Linux는 지정된 세마포를 획득하려고 시도하는 down_trylock() 함수를 제공합니다. 호출이 실패하면 down_trylock()은 차단 대신 비영점을 반환합니다. SMP 컴퓨터가 있는지 여부에 관계없이 코드를 사용하는 사람은 있을 수 있습니다. 또한 잠금 문제를 제대로 처리하지 않는 코드는 일반적으로 Linux 커널에 허용되지 않습니다. 마지막으로, 선점 가능한 커널도 UP(유니프로세서) 시스템으로 적절한 잠금이 필요합니다.

따라서, 잊지 마세요 : 당신은 잠금을 구현해야합니다. Linux 커널의 SMP 안정성과 확장성은 모두 빠르게 개선되고 있습니다. SMP가 2.0 커널에 도입된 이후, 각각의 연속적인 커널 개정은 새로운 잠금 프리미티브를 구현하고 잠금 규칙을 수정하고 높은 영역에서 전역 잠금을 제거하여 더 스마트한 잠금 의미 체계를 제공함으로써 이전 버전에서 개선되었습니다. 경합. 이러한 경향은 2.5 커널에서 계속됩니다. 미래는 확실히 더 나은 성능을 보유할 것입니다. 뮤텍스와 마찬가지로 Spinlock에는 잠금 또는 잠금 해제의 두 가지 상태가 있습니다.

Este post foi publicado em Sem categoria em por .