소프트웨어 인터럽트

By 01/11/2018Windows Internal

소프트웨어 인터럽트

  • Windows Server 2008

 

하드웨어에서 대부분의 인터럽트가 발생하지만 윈도우 커널 또한 다양한 작업들로 인해서 소프트웨어 인터럽트를 발생 시킨다.

  • 스레드 디스패칭 시작
  • 시간에 민감하지 않은 인터럽트 처리
  • 타이머 만료 처리
  • 특정 스레드 컨텍스트에서 프로시저의 비동기 실행
  • 비동기 I/O 수행의 지원

 

 

[디스패치나 지연된 프로시저 호출 인터럽트]

스레드가 종료되었거나 자발적으로 대기 상태로 진입해 스레드가 더 이상 실행 할 수 없을 때 커널은 즉각적인 컨텍스트 스위치를 단행하기 위해 디스패처를 호출 한다. 하지만 커널이 이런 재스케줄링 작업을 수행하기에는 현재 실행 코드의 여건이 맞지 않는 경우가 종종 있다. 이런 상황의 경우 커널은 디스패칭을 요구하지만 실제 작업은 현재 동작이 완료 될 때까지 연기된다.

 

커널은 공유 커널 구조체 접근을 동기화 할 필요가 있을 때 프로세서의 IRQL을 DPC/디스패치 레벨이나 그 이상으로 상승시킨다. 커널은 디스패칭이 이루어져야 함을 탐지한다면 DPC/디스패치 레벨의 인터럽트를 요청한다. 하지만 IRQL이 DPC/디스패치 레벨과 같거나 더 높다면 프로세서는 이 인터럽트를 검사 상태로 유지한다.

 

커널은 IRQL에서 스레드 디스패칭 외에도 지연된 프로시저 호출(Deferred Procedure Calls)을 처리한다. DPC는 현재 작업보다 시간에 덜 민감한 시스템 작업을 수행하는 일종의 함수다. 지연된 함수라 불리는 이유는 즉시 실행되지 않을 수도 있기 때문이다.

 

DPC는 운영체제에 인터럽트를 발생하고 커널모드에서 시스템 함수를 실행할 수 있는 기능을 제공한다. 커널은 타이머 만료를 처리하고 스레드의 퀀텀이 만료된 후에 프로세서를 재스케줄하는데 DPC를 사용한다. 디바이스 드라이버는 I/O요청을 완료하기 위해 DPC를 사용한다. 윈도우는 디바이스 드라이버와 공조해 하드웨어 인터럽트에 시기 적절한 서비스를 제공하기 위해 IRQL을 디바이스 IRQL 레벨 이하로 유지하려 한다.

 

이 목적을 달성하기 위한 방법은 디바이스 드라이버의 ISR이 인터럽트를 발생한 장치에 응답을 주고 휘발성 인터럽트 상태를 저장하며 데이터 전송을 연기하거나 좀 더 시간에 덜 민감한 그 밖의 인터럽트 처리 작업은 DPC/디스패치 IRQL인 DPC에서 실행하는 것과 같이 필요한 최소한의 작업만을 하는 것이다.

 

DCP는 유저모드 프로그램에는 보이지 않지만 디바이스 드라이버나 그 밖의 시스템 코드에서는 볼 수 있는 DPC 객체의 의해 표현된다. DPC객체에 포함된 가장 중요한 정보는 커널이 DPC인터럽트를 처리할 때 호출하는 시스템 함수의 주소다. 실행되기를 기다리는 DPC 루틴은 프로세서마다 하나씩 존재하며 커널에 의해 관리되는 DPC큐에 저장된다. DPC를 요청하기 위해 시스템 코드는 커널을 호출해 DPC 객체를 초기화해 DPC 큐에 넣어야 한다.

 

프로세서의 IRQL이 DPC/디스패치 레벨이나 그 이상의 레벨에서 좀 더 낮은 IRQL(APC나 패시브 레벨)로 막 낮아지려는 시점에서 커널은 DPC를 처리한다. 윈도우는 IRQL이 DPC/디스패치 레벨로 유지되는 것을 보장하고 현재 프로세서의 큐가 비워질 때까지 DPC 객체를 꺼내 각 DPC함수를 차례대로 호출한다. 큐가 완전히 비워질 때 커널은 IRQL을 DPC/디스패치 레벨 아래로 내리며 일반 스레드 실행을 속개한다.

 

DPC 우선순위는 시스템 동작에 어떤 식으로든 영향을 줄 수 있다. 커널은 통상적으로 DPC/디스패치 레벨의 인터럽트 시에 DPC 큐를 비우기 시작한다. ISR이 DPC를 요청했었던 프로세서로 DPC가 향하고 DPC가 high나 medium 우선수위를 가질 때에만 커널은 DPC/디스패치 레벨의 인터럽트를 발생 한다.

 

  • DPC 인터럽트 생성 규칙
DPC 우선순위 DPC가 ISR 프로세서를 대상으로 할 경우 DPC가 다른 프로세서를 대상으로 할 경우
Low DPC 큐 길이가 최대치를 초과하거나 DPC 요청 빈도가 최소 DPC 요청 빈도 값보다 작다 DPC 큐 길이가 최대치를 초과하거나 시스템이 유휴 상태다.
Medium 항상 DPC 큐 길이가 최대치를 초과하거나 시스템이 유휴 상태다
High 항상 항상

 

 

유저모드 스레드는 낮은 IRQL에서 실행 하므로 DPC가 통상적인 유저 스레드의 실행을 인터럽트할 가능성이 높다. DPC 루틴은 실행 중인 스레드에 관계없이 실행 된다.

 

DPC는 주로 디바이스 드라이버를 위해 제공되지만 커널 또한 DPC를 사용한다. 커널은 퀀텀 만료 처리에 DPC를 가장 빈번하게 사용한다.

 

 

[참고자료]

Windows Internals

 

OS, Windows, 윈도우아키텍처, Windowsinternals, OS아키텍처, 윈도우서버, WindowsServer, IRQL, 소프트웨어인터럽트, DeferredProcedureCalls, sqlmvp, SQL Angeles

 

Leave a Reply

%d bloggers like this: