2011-05-05 3 views
6

Linux에서는 특정 CPU 코어의 인터럽트를 비활성화하는 것이 좋지 않습니까? 아니면 다중 칩이있는 시스템의 모든 칩을 동시에 비활성화 할 수 있습니까? 대기 시간에 매우 민감한 C 프로그램을 작성할 때 당연히 고유 한 코어에서 스레드를 분리하고 다른 모든 작업을 코어 분리로 옮기는 것이고, 나는 그 절충점이 무엇인지 궁금합니다.cpu 커널 인터럽트를 차폐 및 비활성화

+0

당신의 프로그램에서 당신은 주변에서 어떤 입력을 기대하지 않거나 예외가 발생했다고 가정합니까? – Pyjong

답변

3

메인 라인 Linux 커널은 CPU에서 모든 IRQ를 오랫동안 사용하지 않도록 설계되지 않았습니다. IRQ를 필요로하는 내부 커널 함수가 많이 있습니다. RCU 중 하나입니다. RCU 실속은 시스템의 나머지 부분을 중단시킬 수 있으며, 그러한 정지는 모든 CPU에 브로드 캐스팅되는 IPI (프로세서 간 인터럽트)를 포함 할 수 있습니다 (사용중인 RCU 구현에 따라 다름).

즉, 이러한 CPU 격리를 적절하게 구현하기위한 실험적인 패치가 있습니다. 예 : http://lwn.net/Articles/268711/ - 인터럽트 라우팅을 사용하지 않도록 설정하기 전에 CPU를 오프라인 상태로 만드는 데 필요한 모든 내부 작업을 수행합니다 (나머지 커널의 관점에서). 이것은 상당히 오래된 패치 시리즈입니다. 패치 시리즈의 개발자에게 연락하여 어딘가에서 새로운 버전이 있는지 확인하거나 현재 버전의 커널에 적용 할 수 있습니다. PREEMPT_RT 사람들도이 도구를 구현하려고합니다. https://rt.wiki.kernel.org/index.php/Main_Page에서 위키를 확인하십시오 (아직 구현되지 않았습니다). 행운을 빕니다!

+0

참고에 감사드립니다! –

2

몇 가지 고려해야 할

  1. 모든 IRQ를 사용하면 대기 인터럽트를 가능성이 더 높습니다 의미에 실행 한 적은 프로세서를해야합니다. 분명히 이것은 프로세서의 수가 증가함에 따라 문제의 심각성이 줄어 듭니다.
  2. 인터럽트없이 프로세스가 강제로 실행을 포기하게하는 것이 훨씬 더 어려울 것입니다. 무한 루프를 입력하기로 결정하면 프로세서를 중단하여 프로세서를 중지 할 수 없습니다. 이 과정은 적절한 시간에 통제를 포기하고 인터럽트 대기에 대해 걱정하지 않습니다 완전한 신뢰가있는 경우

, 다음은 인터럽트를 비활성화 도움이 될 수 있습니다.

+0

나는 프로세서가 프로세서를 제어하고 버그로 인해 그것을 포기하지 않을 가능성에 대해 생각하지 않았습니다. 이것을 지적 해 주신 많은 감사드립니다! –

+1

이것이 사실이라면 활성 스레드가 잘못된 주소에 액세스하려고 시도하고 페이지 오류가 발생하면 어떻게됩니까? 어떻게 멈출 수 있겠습니까? – Syncopated

+1

@Syncopated이를 보장 할 방법이 없습니다. while (1) {}'을 실행하면 어떻게 될까요? 이는 단일 명령으로 인코딩 될 수 있으며 데이터 액세스를하지 않으므로 시작되면 페이지 폴트가 발생하지 않습니다. – ughoavgfhw