인터럽트 처리기가 실행 중일 때 컨텍스트 전환을 수행 할 수없는 이유는 무엇입니까? 보다 구체적으로, 리눅스 커널에서 인터럽트 핸들러는 인터럽트 된 프로세스의 컨텍스트에서 실행됩니다. 다른 프로세스를 예약하기 위해 인터럽트 처리기에서 컨텍스트 전환을 수행 할 수없는 이유는 무엇입니까?인터럽트 처리기의 컨텍스트 스위치
답변
멀티 프로세서에서 인터럽트 처리기가 실행되는 동안 컨텍스트 스위치가 확실히 발생할 수 있습니다. 사실, 예방하는 것은 어려울 것입니다.
단일 CPU 컴퓨터에서는 정의에 따라 한 번에 하나의 제어 스레드 만 실행할 수 있습니다. 하나의 레지스터 세트와 하나의 ALU 만 있습니다. 따라서 인터럽트 핸들러가 실행중인 경우 컨텍스트 스위치를 실행할 리소스가 없습니다.
이제 인터럽트 처리기가 컨텍스트 스위치 코드를 실제로 호출 할 수 있고 을으로 설정하면 작업 할 수있는 시스템이 있다고 생각합니다. 그러나 대부분의 경우, 이것은 많은 가치가 없으며 정리하기 어려울 것입니다. CPU가 높은 우선 순위로 실행 중이고이 우선 순위를 낮출 수 없거나 인터럽트 수준 간의 동기화가 손실됩니다. OS의 중요 섹션은 이미 인터럽트 실행과 동기화되어 있으며 복잡성을 초래합니다. 또한 스레드 전환 된 사용자 모드 프로그램과 마찬가지로 스택을 변경하면 컨텍스트 전환이 발생하므로 인터럽트 스택이 인터럽트에서 돌아 오기 위해 필요할 때 어떻게 될지 상상하기 어렵습니다.
몇 가지 이유는, 나는 당신의 질문의 의미에 따라 같아요
인터럽트는 하드웨어와 상호 작용에 대한 일반적입니다. 하드웨어는 일반적으로 시간에 민감하기 때문에 OS는 어떤 일이있을 때 OS가이를 처리하는 것을 멈추게 할 수 없으며 느낄 때 되돌아옵니다.
인터럽트는 일반적인 프로세스 컨텍스트가 아닌 특수 인터럽트 컨텍스트에서 발생합니다. 그것은 프로세스가 아니기 때문에 정상적인 프로세스가 될 수 있으므로 컨텍스트 스위칭의 대상이 아닙니다.
아마도 더 나은 설명이 될 것입니다.하지만 그건 내 자신의 이해의 정도입니다.
- 1. 스레드 컨텍스트 스위치 대 프로세스 컨텍스트 스위치
- 2. 컨텍스트 스위치 시간을 측정
- 3. Linux에서 컨텍스트 스위치 모니터링
- 4. 불필요한 Java 컨텍스트 스위치
- 5. 퍼가기 모노 - 네이티브 컨텍스트 컨텍스트 스위치 오버 헤드
- 6. 장치 드라이버 IRQL 및 스레드/컨텍스트 스위치
- 7. C++ 컨텍스트 스위치 및 뮤텍스 문제
- 8. 인터럽트/인터럽트 처리기 이해, PIC
- 9. 윈도우 인터럽트 문맥
- 10. 스위치
- 11. 디버거에서 C# winforms .... 컨텍스트 스위치 교착 상태가 감지되었습니다.
- 12. Windows의 컨텍스트 스위치 사이의 시간은 얼마나됩니까? 를 통해
- 13. 비 선점 커널의 제어 경로에서 컨텍스트 스위치 (Linux)
- 14. 처리기의 사용 안드로이드
- 15. 사용자 정의 처리기의 registerClientScriptBlock?
- 16. gcc 전 처리기의 버그입니까?
- 17. 인터럽트 및 인터럽트 처리에 관한 질문
- 18. 스위치 컨트롤러가있는 스위치 2 개
- 19. 키보드 인터럽트
- 20. 소프트웨어 인터럽트
- 21. 인터럽트 창
- 22. 차단 또는 수면 인터럽트 핸들러
- 23. Linux에서 컨텍스트 스위치의 원인을 확인하는 방법이 있습니까?
- 24. ashx 처리기의 코드에 SSL 적용
- 25. 신호 처리기의 비 재진입 기능?
- 26. HTTP 처리기의 기존 HttpModule 무시
- 27. 가변 컨텍스트 스위칭 시간
- 28. 다른 스위치 케이스 (기능이있는 스위치 케이스)
- 29. 인터럽트 처리기가 다른 스레드에서 실행 되었습니까?
- 30. "만약" "스위치"
답장을 보내 주셔서 감사합니다. 나는 schedule()을 호출하는 인터럽트 핸들러를 의미했다. 인터럽트 스택이 인터럽트로부터 돌아 오기 위해 필요할 때 이것이 어떻게 일어날 지 상상하기 어렵습니다. – Bandicoot
컨텍스트 스위치에서 주어진 커널 스레드는 스위치 스택을 변경하는 스위치 코드를 호출합니다. 이제는 ALSO로 전환하는 프로세스가 유사한 코드를 호출하여 컨텍스트 전환 코드에 도달하므로 CPU가 전환 후 새 스택으로 돌아 오면 호출 된 sleep 함수에서 돌아옵니다. 인터럽트 코드는 CPU 우선 순위를 반환하고 낮추어야하기 때문에 발생하지 않습니다. 우리는 반 실행 인터럽트 루틴의 스택을 저장하지 않고 의도하지 않게 CPU를 인터럽트 우선 순위로두기를 원하지 않습니다. (그러면 인터럽트가 더 이상 잠기지 않습니다.) – DigitalRoss