DPC(Deferred Procedure call) 및 디스패치(Dispatch)
앞에서 알아본 APC와 마찬가지로 DPC도 또한 소프트웨어 인터럽트이다.
DPC를 이해하기 위해선 Dispatch에 대해 알아야한다.
Dispatch란~?
Dispatch는 한 스레드의 실행이 길어져서 스케줄링을 다시 해야하는데,
자발적인 대기상태 전환이나 종료가 안되는 경우 스케쥴링을 다시 하여 스레드 실행을
조절하는 것을 의미한다.
DPC란~?
현재 Thrad가 수행중에 IRQL상에 더 높은 인터럽트가 발생하면 현재 수행중인 Thread를 저장하고
해당 인터럽트를 실행한다.
이와같이 하드웨어 인터럽트 서비스를 적절하게 제공하기 위해 함께 동작하는 장치 인터럽트를
제어할때 사용한다.
그런데 이런 인터럽트도 여러 Thread로 나뉠 수 있다. 그리고 개중에는 중요하거나 우선 처리 않되도 되는 경우가 있을 수 있다. 이럴 경우 DPC를 이요하게 된다.
Internal에는 다음과 같이 설명 되어 있다.
1. 인터럽트가 발생한다.
2. 발생한 인터럽트가 IRQL이 높은 경우 현 상태 저장하고 IDT(향후 설며예정)을 참조하여 ISR을 실행한다.
3. ISR이 동작하면서 CPU의 IRQL을 올린다.
4. 실행되는 Thread가 덜 중요할 경우 해당 Thread를 DPC 큐에 넣는다.
5. ISR이 종료되면 IRQL이 DPC 레벨로 낮아진다.( 즉 DPC가 default라는걸 알 수 있다.)
6. DPC의 인터럽트들을 실행하고 큐의 모든 객체를 실행한 다음 원래 Thread로 복귀한다.
그렇다면 IRQL에서의 우선순위 조정은 어떻게 되는 것인가.
앞에서 그것에 대해 헷갈렸지만 DPC항목에서 우린 쉽게 알 수 있다.
즉 하드웨어 인터럽트가 발생하면 모든 스레드는 DPC 큐에 저장되어진다.
즉 하드웨어 인터럽트가 소프트웨어 인터럽트에 항상 우선순위가 높다는 것을 알 수 있다.
소프트웨어 인터럽트 안에서는 DPC가 APC보다 우선순위가 앞서는데 그 이유는
APC가 커널 인터럽트이지만 DPC에 저장되어 있는 인터럽트들도 어차피 기존에 수행되던
커널 인터럽트라는 것이다. 같은 커널 인터럽트면 어떤걸 먼저 수행하겠는가?~
이 질문에 당연히 먼저 수행하던 인터럽트라는 답이 나온다.
즉 DPC가 APC보다 앞서는 이유는 위와 같이 결정된다.
그렇다면 지연 인터럽트에 대해 굳이 설명할 필요가 없다.
DPC안에서 Dispatch되는 것에 따라 수행 순서가 결정되어지기 때문이다.
앞에서 알아본 APC와 마찬가지로 DPC도 또한 소프트웨어 인터럽트이다.
DPC를 이해하기 위해선 Dispatch에 대해 알아야한다.
Dispatch란~?
Dispatch는 한 스레드의 실행이 길어져서 스케줄링을 다시 해야하는데,
자발적인 대기상태 전환이나 종료가 안되는 경우 스케쥴링을 다시 하여 스레드 실행을
조절하는 것을 의미한다.
DPC란~?
현재 Thrad가 수행중에 IRQL상에 더 높은 인터럽트가 발생하면 현재 수행중인 Thread를 저장하고
해당 인터럽트를 실행한다.
이와같이 하드웨어 인터럽트 서비스를 적절하게 제공하기 위해 함께 동작하는 장치 인터럽트를
제어할때 사용한다.
그런데 이런 인터럽트도 여러 Thread로 나뉠 수 있다. 그리고 개중에는 중요하거나 우선 처리 않되도 되는 경우가 있을 수 있다. 이럴 경우 DPC를 이요하게 된다.
Internal에는 다음과 같이 설명 되어 있다.
1. 인터럽트가 발생한다.
2. 발생한 인터럽트가 IRQL이 높은 경우 현 상태 저장하고 IDT(향후 설며예정)을 참조하여 ISR을 실행한다.
3. ISR이 동작하면서 CPU의 IRQL을 올린다.
4. 실행되는 Thread가 덜 중요할 경우 해당 Thread를 DPC 큐에 넣는다.
5. ISR이 종료되면 IRQL이 DPC 레벨로 낮아진다.( 즉 DPC가 default라는걸 알 수 있다.)
6. DPC의 인터럽트들을 실행하고 큐의 모든 객체를 실행한 다음 원래 Thread로 복귀한다.
그렇다면 IRQL에서의 우선순위 조정은 어떻게 되는 것인가.
앞에서 그것에 대해 헷갈렸지만 DPC항목에서 우린 쉽게 알 수 있다.
즉 하드웨어 인터럽트가 발생하면 모든 스레드는 DPC 큐에 저장되어진다.
즉 하드웨어 인터럽트가 소프트웨어 인터럽트에 항상 우선순위가 높다는 것을 알 수 있다.
소프트웨어 인터럽트 안에서는 DPC가 APC보다 우선순위가 앞서는데 그 이유는
APC가 커널 인터럽트이지만 DPC에 저장되어 있는 인터럽트들도 어차피 기존에 수행되던
커널 인터럽트라는 것이다. 같은 커널 인터럽트면 어떤걸 먼저 수행하겠는가?~
이 질문에 당연히 먼저 수행하던 인터럽트라는 답이 나온다.
즉 DPC가 APC보다 앞서는 이유는 위와 같이 결정된다.
그렇다면 지연 인터럽트에 대해 굳이 설명할 필요가 없다.
DPC안에서 Dispatch되는 것에 따라 수행 순서가 결정되어지기 때문이다.