Linux에서 SCHED_SOFTIRQ의 기능은 무엇입니까?

Linux에서 SCHED_SOFTIRQ의 기능은 무엇입니까?

누가 이 Softirq를 트리거합니까? 매 틱마다 실행됩니까(타이머 인터럽트를 기반으로 합니까?)

이로 인해 커널이 실행 가능한 프로세스를 예약하게 됩니까? 그렇다면 현재 실행이 프로세스 컨텍스트(dispatch() 이후)에 있으므로 우선순위가 낮은 Softirq(HR_TIMER, RCU_SOFTIRQ)에 대한 핸들러는 어떻게 실행됩니까?

답변1

커널 문서에 따르면:

소프트웨어 인터럽트 컨텍스트: Softirq 및 Tasklet
보류 중인 것으로 표시된 모든 "소프트웨어 인터럽트"(보통 하드웨어 인터럽트에 의해)는 시스템 호출이 사용자 공간으로 돌아가거나 하드웨어 인터럽트 핸들러가 종료될 때마다 실행됩니다(kernel/softirq.c).

실제 인터럽트 처리 작업의 대부분이 여기에서 수행됩니다. SMP로 전환 초기에는 멀티 CPU를 활용하지 못한 '하반부'(BH)만 존재했다. 성냥개비와 콧물로 만든 시계태엽 컴퓨터에서 벗어나 얼마 지나지 않아 우리는 이 제한을 버리고 "소프트 인터럽트"로 전환했습니다.

include/linux/interrupt.h에는 다양한 Softirq가 나열되어 있습니다. 매우 중요한 Softirq는 타이머 Softirq(include/linux/timer.h)입니다. 이를 등록하면 주어진 시간 내에 함수를 호출할 수 있습니다.

동일한 Softirq가 여러 CPU에서 동시에 실행되기 때문에 Softirq를 처리하는 것은 종종 고통스럽습니다. 따라서 태스크릿(include/linux/interrupt.h)이 더 일반적으로 사용됩니다. 이는 동적으로 등록 가능하며(원하는 만큼 많이 가질 수 있음을 의미), 또한 다른 태스크릿이 가능하더라도 모든 태스크릿은 하나의 CPU에서만 실행될 수 있음을 보장합니다. 동시에 실행하되 언제든지 실행할 수 있습니다.
경고하다

"tasklets"라는 이름은 오해의 소지가 있습니다. "tasklets"과는 아무런 관련이 없으며 아마도 Alexey Kuznetsov가 당시 마시고 있던 나쁜 보드카와 더 관련이 있을 것입니다.

in_softirq() 매크로(include/linux/interrupt.h)를 사용하여 현재 Softirq(또는 미니 스레드)에 있는지 확인할 수 있습니다.
경고하다

bh 잠금이 유지되면 거짓 긍정이 반환됩니다(아래 참조).

관련 정보