다음을 통해 공유


항상 선점 가능 및 항상 인터럽트 가능

운영 체제의 선점 가능하고 중단 가능한 디자인의 목표는 시스템 성능을 최대화하는 것입니다. 우선 순위가 높은 스레드에서 모든 스레드를 선점할 수 있으며, 더 높은 IRQL(인터럽트 요청 수준)에서 실행되는 루틴에 의해 모든 드라이버의 ISR(인터럽트 서비스 루틴)이 중단될 수 있습니다.

커널 구성 요소는 다음 우선 순위 지정 조건 중 하나에 따라 코드 시퀀스가 실행되는 시기를 결정합니다.

  • 스레드에 대한 커널 정의 런타임 우선 순위 체계입니다.

    시스템의 모든 스레드에는 연결된 우선 순위 특성이 있습니다. 일반적으로 대부분의 스레드에는 가변 우선 순위 특성이 있습니다. 항상 선점 가능하며 현재 동일한 우선 순위 수준에 있는 다른 모든 스레드와 함께 라운드 로빈을 실행하도록 예약됩니다. 일부 스레드에는 실시간 우선 순위 특성이 있습니다. 이러한 시간에 중요한 스레드는 실시간 우선 순위 특성이 더 높은 스레드에 의해 선점되지 않는 한 완료될 때까지 실행됩니다. Microsoft Windows 아키텍처는 기본적으로 실시간 시스템을 제공하지 않습니다.

    우선 순위 특성이 무엇이든 하드웨어 인터럽트 및 특정 유형의 소프트웨어 인터럽트 발생 시 시스템의 모든 스레드를 선점할 수 있습니다.

  • 특정 인터럽트 벡터가 지정된 플랫폼에 할당되는 커널 정의 IRQL(인터럽트 요청 수준)입니다.

    커널은 하드웨어 및 소프트웨어 인터럽트 우선 순위를 지정하여 대부분의 드라이버를 포함한 일부 커널 모드 코드가 더 높은 IRQL에서 실행되므로 시스템의 다른 스레드보다 일정 우선 순위가 높습니다. 커널 모드 드라이버 코드가 실행되는 특정 IRQL은 기본 디바이스의 하드웨어 우선 순위 에 따라 결정됩니다.

    커널 모드 코드는 항상 인터럽트할 수 있습니다. IRQL 값이 더 높은 인터럽트는 언제든지 발생할 수 있으므로 시스템 할당 IRQL이 더 높은 다른 커널 모드 코드가 해당 프로세서에서 즉시 실행되도록 할 수 있습니다. 그러나 지정된 IRQL에서 코드 조각이 실행되면 커널은 프로세서에서 IRQL 값이 작거나 같은 모든 인터럽트 벡터를 마스킹합니다.

가장 낮은 IRQL 수준을 PASSIVE_LEVEL 호출합니다. 이 수준에서는 인터럽트 벡터가 마스킹되지 않습니다. 스레드는 일반적으로 IRQL=PASSIVE_LEVEL 실행됩니다. 다음으로 높은 IRQL 수준은 소프트웨어 인터럽트용입니다. 이러한 수준에는 APC_LEVEL, DISPATCH_LEVEL 또는 커널 디버깅의 경우 WAKE_LEVEL 포함합니다. 디바이스 인터럽트는 여전히 IRQL 값이 높습니다. 커널은 시스템 클록 또는 버스 오류와 같은 시스템 중요 인터럽트에서 가장 높은 IRQL 값을 예약합니다.

일부 시스템 지원 루틴은 IRQL=PASSIVE_LEVEL 실행됩니다. 이 루틴은 페이지 가능 코드로 구현되거나 페이지가 지정 가능한 데이터에 액세스하기 때문에 또는 일부 커널 모드 구성 요소가 자체 스레드를 설정하기 때문입니다.

마찬가지로 일부 표준 드라이버 루틴은 일반적으로 IRQL=PASSIVE_LEVEL 실행됩니다. 그러나 몇 가지 표준 드라이버 루틴은 IRQL=DISPATCH_LEVEL 또는 디바이스 IRQL( DIRQL이라고도 함)에서 가장 낮은 수준의 드라이버에서 실행됩니다. IRQL에 대한 자세한 내용은 하드웨어 우선 순위 관리를 참조하세요.

드라이버의 모든 루틴은 중단됩니다. 여기에는 PASSIVE_LEVEL 보다 높은 IRQL에서 실행되는 루틴이 포함됩니다. 특정 IRQL에서 실행되는 모든 루틴은 해당 루틴이 실행되는 동안 더 높은 IRQL에 대한 인터럽트 없이 발생하는 경우에만 프로세서 제어를 유지합니다.

일부 오래된 개인용 컴퓨터 운영 체제의 드라이버와 달리 Microsoft Windows 드라이버의 ISR은 드라이버의 I/O 처리 대부분을 수행하는 크고 복잡한 루틴이 결코 없습니다. 이는 더 높은 IRQL에서 실행되는 다른 루틴(예: 다른 드라이버의 ISR)에 의해 모든 드라이버의 ISR( 인터럽트 서비스 루틴 )이 중단될 수 있기 때문입니다. 따라서 드라이버의 ISR이 실행 경로의 시작부터 끝까지 중단 없이 CPU의 제어를 반드시 유지하지는 않습니다.

Windows 드라이버에서 ISR은 일반적으로 하드웨어 상태 정보를 저장하고 DPC( 지연 프로시저 호출 )를 큐에 대기한 다음 빠르게 종료합니다. 나중에 시스템은 드라이버가 낮은 IRQL(DISPATCH_LEVEL)에서 I/O 작업을 완료할 수 있도록 드라이버의 DPC를 큐에서 제거합니다. 전반적인 시스템 성능을 높이려면 높은 IRQL에서 실행되는 모든 루틴은 CPU 제어를 신속하게 포기해야 합니다.

Windows에서 모든 스레드에는 스레드 컨텍스트가 있습니다. 이 컨텍스트는 스레드를 소유하는 프로세스와 스레드의 액세스 권한과 같은 다른 특성을 식별하는 정보로 구성됩니다.

일반적으로 드라이버의 현재 I/O 작업을 요청하는 스레드의 컨텍스트에서 최상위 드라이버만 호출됩니다. 중간 수준 또는 최저 수준 드라이버는 현재 I/O 작업을 요청한 스레드의 컨텍스트에서 실행 중이라고 가정할 수 없습니다.

따라서 드라이버 루틴은 일반적으로 표준 드라이버 루틴이 호출되는 경우 현재 스레드의 컨텍스트인 임의의 스레드 컨텍스트에서 실행됩니다. 성능상의 이유로(컨텍스트 전환을 방지하기 위해) 거의 드라이버가 자체 스레드를 설정하지 않습니다.