저는 스핀록이 Linux 커널 설계에서 정말 낭비라는 것을 알고 있습니다.
세마포어나 뮤텍스와 같은 사용자 영역 코드에서 더 일반적인 것보다 스핀록이 Linux 커널 설계에서 좋은 선택인 이유가 궁금합니다.
답변1
질문에서 알 수 있듯이 스핀락은 "낭비"이므로 잠시만 보유해야 합니다.
스핀 잠금은 여러 스레드를 동기화하는 유일한 방법은 아닙니다. 뮤텍스/세마포어는 Linux 커널뿐만 아니라 기타 동기화 기본 요소(예: 대기 대기열, 이벤트)에서도 사용됩니다.
그러나 커널은 사용자 공간이 이전에 본 적이 없는 상황을 처리해야 합니다. 일반적인 상황 중 하나는 인터럽트 핸들러입니다. Linux의 인터럽트 핸들러는 다시 예약할 수 없지만 일반적으로 일부 동기화 기본 요소(예: 다른 스레드에서 추가로 처리할 연결 목록에 작업 항목 추가)를 사용해야 합니다. 인터럽트 핸들러는 잠들 수 없기 때문에 뮤텍스, 대기 큐 등을 사용할 수 없습니다. 그러면 스핀락이 거의 남습니다. 스레드가 인터럽트 핸들러와의 동기화된 액세스를 요구하는 경우 동일한 스핀 잠금도 사용해야 합니다.
Spinlock이 반드시 낭비적인 것은 아닙니다. 이는 비경합/비대기 상황에 최적화되어 있으며 매우 빠르게 획득하고 출시할 수 있습니다. 이 경우 다른 동기화 프리미티브보다 더 빠르고 오버헤드가 적습니다.
답변2
호출자가 CPU 제어를 차단하고 포기하게 만드는 스핀록과 다른 구성 사이의 선택은 다른 스레드에서 컨텍스트 전환(레지스터/상태 저장 및 잠긴 스레드의 레지스터/상태 복원)을 수행하는 데 필요한 시간에 따라 크게 달라집니다. ). 이를 수행하는 데 필요한 시간과 캐싱 비용이 높을 수 있습니다.
하드웨어 레지스터 등에 대한 액세스를 보호하기 위해 스핀 잠금을 사용하는 경우 다른 액세스 스레드는 잠금이 해제되기까지 몇 밀리초 이하만 필요하므로 CPU 시간을 더 잘 사용하는 것은 컨텍스트 전환 대신 스핀 대기를 하고 계속하는 것입니다. .
답변3
다른 사람들은 이미 답변했습니다. 스핀락이 사용되는 상황과 스핀락 사용 규칙을 정리하겠습니다.
1. 스핀락은 언제 사용하나요?
답변: 다음과 같은 상황이 있습니다.
- 잠금을 보유하는 스레드는 휴면 상태가 허용되지 않습니다.
- 잠금을 기다리는 스레드는 휴면 상태가 아니지만 긴밀한 루프에서 회전합니다.
적절하게 사용하면 스핀록은 세마포어보다 더 높은 성능을 제공할 수 있습니다. 예: 인터럽트 핸들러.
2. 스핀락 사용 규칙은 무엇입니까?
답변:
규칙 - 1: 스핀 잠금을 보유하는 모든 코드는 인터럽트 서비스를 제외하고(때로는 그렇지 않은 경우도 있음) 어떤 이유로든 프로세서를 포기할 수 없습니다. 따라서 스핀 잠금을 보유하는 코드는 잠자기 상태가 될 수 없습니다.
원인: 스핀 잠금 장치를 보유하고 있는 드라이버가 절전 모드로 전환된다고 가정합니다. 예를 들어 함수를 호출 copy_from_user()
하거나 copy_to_user()
커널이 선제적으로 실행되어 우선 순위가 높은 프로세스가 코드를 옆으로 밀어냅니다. 프로세스는 실제로 스핀 잠금을 보유하는 CPU를 포기합니다.
이제 우리는 코드가 언제 잠금을 해제할지 알 수 없습니다. 다른 스레드가 동일한 잠금을 획득하려고 하면 오랜 시간 동안 회전하게 됩니다. 최악의 경우 교착 상태가 발생할 수 있습니다.
커널 선점 상황은 spinlock 코드 자체에 의해 처리됩니다. 커널 코드가 스핀 잠금을 유지하는 한 관련 프로세서에서 선점은 비활성화됩니다. 단일 프로세서 시스템이라도 이런 방식으로 선점을 비활성화해야 합니다.
규칙 - 2: 스핀 잠금을 유지하면서 로컬 CPU에서 인터럽트를 비활성화합니다.
원인: 스핀록을 사용하여 장치에 대한 액세스를 제어한 다음 인터럽트를 발행하도록 드라이버를 지원하십시오. 이로 인해 인터럽트 핸들러가 실행됩니다. 이제 인터럽트 핸들러도 장치에 액세스하려면 잠금이 필요합니다. 인터럽트 핸들러가 동일한 프로세서에서 실행 중이면 회전이 시작됩니다. 또한 드라이버 코드를 실행하여 잠금을 해제할 수 없습니다. 따라서 프로세서는 영원히 회전합니다.
규칙 - 3: 스핀 잠금은 가능한 한 짧은 시간 동안 유지되어야 합니다.
이유: 잠금을 너무 오랫동안 유지하면 현재 프로세서를 예약할 수 없게 될 수도 있습니다. 즉, 우선 순위가 높은 프로세스가 CPU를 가져오기 위해 기다려야 할 수도 있습니다.
따라서 이는 커널 대기 시간(프로세스가 예약을 기다려야 하는 시간)에 영향을 미칩니다. 일반적으로 스핀 잠금은 CPU가 스레드 간 컨텍스트 전환에 걸리는 시간보다 짧은 시간 동안 유지되어야 합니다.
규칙-4: 세마포어와 스핀록이 있으면 둘 다 사용하세요. 그런 다음 세마포어를 먼저 가져온 다음 스핀 잠금을 가져옵니다.
답변4
스핀 잠금 및 뮤텍스 잠금을 사용하는 이유는 CPU 리소스가 부족하기 때문입니다. 이는 오늘날 최악의 아키텍처이자 완전히 비논리적인 8비트 레지스터 기반 폰 노이만 설계의 중복된 유산이 되고 있습니다.
불행하게도 C/C++ 컴파일러의 기능은 하드웨어에 비해 불균형해졌으며 이러한 기능은 하드웨어에 갇힐 수 없으며 고대 온칩 리소스는 오늘날에도 여전히 존재합니다. 단일 프로세서에서는 캐시가 두 번째 수준 이상으로 재진입될 수 없으므로 시간이 많이 소요되는 환경 절약과 재진입 SMP의 로드가 계속됩니다. 미래는 최적화된 빌드 도구를 갖춘 FPGA 장치에 달려 있습니다. Xilinix는 새로운 14nm 공정을 보유하고 있으며, A9 쿼드 코어와 프로그래밍 가능한 게이트 어레이 사이의 3000개 상호 연결, 테이블에 최대 수백 메가비트의 SRAM, 고급 상태 기계 설계를 활용하여 복잡한 부동 소수점 산술/다차원 벡터/기능 테이블 감소 가능..훨씬 더 많은 것 오래된 휠체어 테더링 컴파일러.
25년 전의 하드웨어 설계에는 향상된 하드웨어가 DSP AD 21020/CPU i960 인터페이스에 통합되었습니다. 향상된 디자인이 흐름 집약적인 1미터 너비 160 노즐 프린터의 많은 소프트웨어 문제를 해결한다는 것은 분명합니다.
커널 개발에 익숙한 소규모 팀을 초대하여 스핀 잠금/캐시 누락/재진입 SMP 조건을 대체할 수 있는 새로운 아키텍처를 평가/수정하십시오.