2011-01-19 5 views
4

인터럽트 처리기가 실행 중일 때 컨텍스트 전환을 수행 할 수없는 이유는 무엇입니까? 보다 구체적으로, 리눅스 커널에서 인터럽트 핸들러는 인터럽트 된 프로세스의 컨텍스트에서 실행됩니다. 다른 프로세스를 예약하기 위해 인터럽트 처리기에서 컨텍스트 전환을 수행 할 수없는 이유는 무엇입니까?인터럽트 처리기의 컨텍스트 스위치

답변

7

멀티 프로세서에서 인터럽트 처리기가 실행되는 동안 컨텍스트 스위치가 확실히 발생할 수 있습니다. 사실, 예방하는 것은 어려울 것입니다.

단일 CPU 컴퓨터에서는 정의에 따라 한 번에 하나의 제어 스레드 만 실행할 수 있습니다. 하나의 레지스터 세트와 하나의 ALU 만 있습니다. 따라서 인터럽트 핸들러가 실행중인 경우 컨텍스트 스위치를 실행할 리소스가 없습니다.

이제 인터럽트 처리기가 컨텍스트 스위치 코드를 실제로 호출 할 수 있고 으로 설정하면 작업 할 수있는 시스템이 있다고 생각합니다. 그러나 대부분의 경우, 이것은 많은 가치가 없으며 정리하기 어려울 것입니다. CPU가 높은 우선 순위로 실행 중이고이 우선 순위를 낮출 수 없거나 인터럽트 수준 간의 동기화가 손실됩니다. OS의 중요 섹션은 이미 인터럽트 실행과 동기화되어 있으며 복잡성을 초래합니다. 또한 스레드 전환 된 사용자 모드 프로그램과 마찬가지로 스택을 변경하면 컨텍스트 전환이 발생하므로 인터럽트 스택이 인터럽트에서 돌아 오기 위해 필요할 때 어떻게 될지 상상하기 어렵습니다.

+0

답장을 보내 주셔서 감사합니다. 나는 schedule()을 호출하는 인터럽트 핸들러를 의미했다. 인터럽트 스택이 인터럽트로부터 돌아 오기 위해 필요할 때 이것이 어떻게 일어날 지 상상하기 어렵습니다. – Bandicoot

+0

컨텍스트 스위치에서 주어진 커널 스레드는 스위치 스택을 변경하는 스위치 코드를 호출합니다. 이제는 ALSO로 전환하는 프로세스가 유사한 코드를 호출하여 컨텍스트 전환 코드에 도달하므로 CPU가 전환 후 새 스택으로 돌아 오면 호출 된 sleep 함수에서 돌아옵니다. 인터럽트 코드는 CPU 우선 순위를 반환하고 낮추어야하기 때문에 발생하지 않습니다. 우리는 반 실행 인터럽트 루틴의 스택을 저장하지 않고 의도하지 않게 CPU를 인터럽트 우선 순위로두기를 원하지 않습니다. (그러면 인터럽트가 더 이상 잠기지 않습니다.) – DigitalRoss

3

몇 가지 이유는, 나는 당신의 질문의 의미에 따라 같아요

  1. 인터럽트는 하드웨어와 상호 작용에 대한 일반적입니다. 하드웨어는 일반적으로 시간에 민감하기 때문에 OS는 어떤 일이있을 때 OS가이를 처리하는 것을 멈추게 할 수 없으며 느낄 때 되돌아옵니다.

  2. 인터럽트는 일반적인 프로세스 컨텍스트가 아닌 특수 인터럽트 컨텍스트에서 발생합니다. 그것은 프로세스가 아니기 때문에 정상적인 프로세스가 될 수 있으므로 컨텍스트 스위칭의 대상이 아닙니다.

아마도 더 나은 설명이 될 것입니다.하지만 그건 내 자신의 이해의 정도입니다.

관련 문제