Windows , IIS

비동기 프로시저 호출 인터럽트

SungWookKang 2015. 7. 16. 19:04
반응형

비동기 프로시저 호출 인터럽트

  • Windows Server 2008

 

비동기 프로시저 호출 (Asynchronous Procedure Calls, APC)은 유저 프로그램과 시스템 코드로 하여금 특정 유저 스레드 컨텍스트에서 실행할 수 있는 방법을 제공한다. APC는 특정 스레드의 컨텍스트에서 실행되게 큐잉되어 DPC/디스패치 레벨보다 낮은 레벨의 IRQL에서 실행 된다.

 

APC는 APC 객체로 불리는 커널 제어 객체에 의해 기술 된다. 실행되기를 기다리는 APC는 커널에 의해 관리되는 APC큐에 보관된다. 시스템 전역적인 DPC 큐와는 달리 APC 큐는 스레드 전용이다.

 

APC에는 커널모드와 유저모드의 두 종류가 있다. 커널모드 APC는 대상 스레드로부터의 승인을 필요로 하지 않는다. 반면에 유저모드 APC는 승인을 필요로 한다. 커널모드 APC를 스레드를 인터럽트하고 인터럽트된 스레드의 간섭이나 동의 없이 프로시저를 실행 한다.

 

익스큐티브는 특정 스레드의 주소 공간에서 완료되어야 하는 운영체제 시스템 작업을 수행하기 위해 커널모드 APC를 사용한다. 익스큐티브는 특수 커널모드 APC를 사용할 수 있다.

 

커널모드 APC의 또 다른 중요한 용도는 스레드 서스펜션이나 종료와 연관이 있다. 스레드 서스펜션과 종료 동작은 임의의 스레드로부터 유발될 수 있고 또 다른 임의의 스레드로 영향을 줄 수 있기 때문에 커널 스레드 컨텍스트를 질의하고 스레드를 종료하기 위해 APC를 사용한다.

 

디바이스 드라이버는 스레드가 락을 소유한 채로 서스펜드 되거나 종료되는 것을 방지하기 위해 흔히 APC를 블록하거나 임계영역에 집입한다. 이렇게 하지 않는다면 락은 절대로 해제되지 않아서 시스템은 행 상태가 될 것이다.

 

APC 유형

삽입 행위

전달 행위

스페셜(커널)

커널모드 APC 리스트의 맨 뒤에 삽입된다.

IRQL이 낮이지자마자 그리고 스레드가 보호 영역(guarded region)에 있지 않을 때 APC 레벨에서 전달 된다.

일반(커널)

마지막 스페셜 APC 바로 뒤에 삽입된다.(그 밖의 다른 모든 APC 앞에)

연관된 스페셜 APC가 실행된 후에 PASSIVE_LEVEL에서 전달된다. 연관된 스페셜 APC에 의해 반환된 인자(삽입 때 사용된 원래 인자이거나 새로운 인자 일 수 있다.)를 받는다.

일반(유저)

유저모드 APC 리스트의 맨 뒤에 삽입된다.

IRQL이 낮아지자마자 그리고 스레드가 임계영역에 있지 않을 때 스레드가 경계 상태가 아닐 때 PASSIVE_LEVEL에서 전달된다. 연관된 스페셜 APC에 의해 반환된 인자(삽입 때 사용된 원래 인자이거나 새로운 인자일 수 있다.)를 받는다.

일반(유저) 스레드 종료(PsExitSpecialAPC)

유저모드 APC 리스트의 맨 앞에 삽입된다.

스레드가 경계 유저모드 대기 상태라면 유저모드로 복귀할 때 PASSIVE_LELVEL에서 전달 된다. 스레드 종료 스페셜 APC에 의해 반환된 인자를 받는다.

 

디바이스 드라이버 역시 커널모드 APC를 사용한다. ReadFileEx와 WriteFileEx, QUEUEUSERAPC 같은 여러 윈도우 API는 유저모드 APC를 사용한다.

 

APC 전달로 인해 어떤 스레드가 무엇을 기다리고 이들 스레드가 어떤 순서로 대기하는지 보여주는 리스트인 대기 큐의 순서가 변경될 수 있다. APC가 전달 될 때 스레드가 대기 상태에 있다면 APC 루틴이 완료된 이후에 대기가 다시 이루어 진다. 대기가 여전히 해제되지 않은 상태라면 스레드는 대기 상태로 복귀하지만 대기할 객체의 대기 리스트의 맨 뒤에 위치하게 된다.

 

[참고자료]

Windows Internals

 

반응형

'Windows , IIS' 카테고리의 다른 글

처리되지 않은 예외  (0) 2015.07.16
예외 디스패칭  (0) 2015.07.16
소프트웨어 인터럽트  (0) 2015.07.16
소프트웨어 인터럽트 요청 레벨(IRQL)  (0) 2015.07.16
x86 x64 IA64 인터럽트 컨트롤러  (0) 2015.07.16