
Linux 커널에는 다음과 같은 대규모 세트가 있습니다.매개변수사용자가 커널을 다시 컴파일하지 않고도 커널 동작을 조정할 수 있게 해줍니다. 선점 모델을 조정하는 매개변수가 없는 것 같습니다.
-*- Preemption Model
No Forced Preemption (Server) (PREEMPT_NONE)
--> Voluntary Kernel Preemption (Desktop) (PREEMPT_VOLUNTARY)
Preemptible Kernel (Low-Latency Desktop) (PREEMPT)
커널 개발자는 왜 둘 중 하나를 선택할 수 있는 스위치를 추가하지 않았습니까?
답변1
might_sleep
선점은 ( 커널에서 찾아보는) 다수의 명시적 선점 지점을 사용하여 구현되며 , 그 중 다수는 다소 핫한 경로에 있습니다. 완전 선점( CONFIG_PREEMPT
)은 훨씬 더 큰 영향을 미칩니다. 예를 들어 spinlock은 IRQ와 마찬가지로 선점 횟수를 확인합니다(적어도 SMP가 아닌 커널에서는).
현재 선택한 선점 모델은 컴파일 타임에 적용됩니다. 결과적으로 강제 선점 없이는 선점 코드가 커널에 남지 않으며 최대 처리량을 얻을 수 있습니다. 마찬가지로 자발적 선점 커널에는 IRQ 및 커널 진입점에 대한 선점 검사가 없습니다. 런타임에 선점이 변경될 수 있도록 이를 변경하면 모든 구성이 적어도 부팅 시 선점 설정을 확인해야 하며 최상의 경우에도 약간의 비용이 발생한다는 의미입니다(예를 들어, 선점이 부팅 시간 설정이고 "선점 없음" 설정이 관련 호출 사이트를 패치할 수 있더라도 여전히 코드 캐시에서 귀중한 공간을 차지하는 아무것도 하지 않는 코드로 끝날 것입니다.