로컬 CPU가 인터럽트를 활성화해야 하는 이유는 무엇입니까? 그렇지 않으면 커널 선점이 실행되지 않습니까?

로컬 CPU가 인터럽트를 활성화해야 하는 이유는 무엇입니까? 그렇지 않으면 커널 선점이 실행되지 않습니까?

나는 "리눅스 커널의 이해"라는 책을 읽었습니다. 로컬 CPU에서 로컬 인터럽트를 활성화해야 한다는 문장을 이해할 수 없습니다. 그렇지 않으면 커널 선점이 수행되지 않습니다. 이 문장은 무엇을 의미하나요?

답변1

책에 나오는 이 문장은 틀렸습니다. IRQ가 비활성화되어도 선점은 계속 발생할 수 있습니다. 일종의.

선점은 다양한 방법으로 트리거될 수 있기 때문에 까다롭습니다. 그 중 하나만 인터럽트를 통해서입니다. 예를 들어, Schedule()을 호출하여 항상 코드를 직접 선점할 수 있으며 선점 활성화/비활성화 또는 인터럽트는 신경 쓰지 않습니다. cond_resched()는 인터럽트가 비활성화되는지 상관하지 않는 또 다른 함수입니다.

그래서 질문에 대한 답은

로컬 CPU가 인터럽트를 활성화해야 하는 이유는 무엇입니까? 그렇지 않으면 커널 선점이 실행되지 않습니까?

그러나 실제로는 그렇지 않습니다. 인터럽트가 비활성화된 경우에도 선점은 계속 발생할 수 있습니다. 언제든지 발생할 수 있는 비동기 선점은 인터럽트가 비활성화되면 발생하지 않습니다. 그러나 실행 중인 코드의 연속으로 인한 선점은 여전히 ​​발생할 수 있습니다. 이에 대한 경고가 있습니다.문서에서.

그러나 이러한 동기화 코드 경로 중 일부(예: preempt_enable()를 통해)는 인터럽트가 비활성화된 경우 선점을 거부하므로 혼란에 도움이 되지 않습니다. 다른 경로(예: cond_resched())는 여전히 허용됩니다. 그 이유는 함수의 명시성 때문일 가능성이 높습니다. cond_resched()는 Schedule()과 유사한 명시적 선점 요청입니다. preempt_enable()과 같은 것은 덜 명시적이며 실수로 선점을 트리거할 수 있으므로 인터럽트가 비활성화된 경우 선점을 방지합니다.

답변2

로컬(컨텍스트는 "이 CPU에서"를 의미함) 인터럽트가 비활성화된 경우, (로컬) CPU는 가능한 커널 선점을 트리거하는 인터럽트를 결코 볼 수 없습니다.

관련 정보