나는 "리눅스 커널의 이해"라는 책을 읽었습니다. 로컬 CPU에서 로컬 인터럽트를 활성화해야 한다는 문장을 이해할 수 없습니다. 그렇지 않으면 커널 선점이 수행되지 않습니다. 이 문장은 무엇을 의미하나요?
답변1
책에 나오는 이 문장은 틀렸습니다. IRQ가 비활성화되어도 선점은 계속 발생할 수 있습니다. 일종의.
선점은 다양한 방법으로 트리거될 수 있기 때문에 까다롭습니다. 그 중 하나만 인터럽트를 통해서입니다. 예를 들어, Schedule()을 호출하여 항상 코드를 직접 선점할 수 있으며 선점 활성화/비활성화 또는 인터럽트는 신경 쓰지 않습니다. cond_resched()는 인터럽트가 비활성화되는지 상관하지 않는 또 다른 함수입니다.
그래서 질문에 대한 답은
로컬 CPU가 인터럽트를 활성화해야 하는 이유는 무엇입니까? 그렇지 않으면 커널 선점이 실행되지 않습니까?
그러나 실제로는 그렇지 않습니다. 인터럽트가 비활성화된 경우에도 선점은 계속 발생할 수 있습니다. 언제든지 발생할 수 있는 비동기 선점은 인터럽트가 비활성화되면 발생하지 않습니다. 그러나 실행 중인 코드의 연속으로 인한 선점은 여전히 발생할 수 있습니다. 이에 대한 경고가 있습니다.문서에서.
그러나 이러한 동기화 코드 경로 중 일부(예: preempt_enable()를 통해)는 인터럽트가 비활성화된 경우 선점을 거부하므로 혼란에 도움이 되지 않습니다. 다른 경로(예: cond_resched())는 여전히 허용됩니다. 그 이유는 함수의 명시성 때문일 가능성이 높습니다. cond_resched()는 Schedule()과 유사한 명시적 선점 요청입니다. preempt_enable()과 같은 것은 덜 명시적이며 실수로 선점을 트리거할 수 있으므로 인터럽트가 비활성화된 경우 선점을 방지합니다.
답변2
로컬(컨텍스트는 "이 CPU에서"를 의미함) 인터럽트가 비활성화된 경우, (로컬) CPU는 가능한 커널 선점을 트리거하는 인터럽트를 결코 볼 수 없습니다.