다음을 통해 공유


작업 큐 디스패치 메커니즘

RDBSS는 Windows 커널 작업 큐를 사용하여 나중에 실행하기 위해 여러 스레드에서 작업을 디스패치합니다. 네트워크 미니 리다이렉터 드라이버는 나중에 실행하기 위해 작업을 디스패치하기 위해 RDBSS에서 기본 작업 큐를 사용할 수 있습니다.

RDBSS는 RDBSS에 사용되는 디스패치 메커니즘을 구현하는 몇 가지 루틴을 제공합니다. 이러한 루틴은 네트워크 미니 리렉터 드라이버에서도 사용할 수 있습니다.

RDBSS는 디바이스 개체별로 작업 항목을 추적합니다. 이를 통해 RDBSS는 네트워크 미니 리다이렉터 로드 및 언로드와 관련된 경합 상태를 처리할 수 있습니다. 또한 단일 네트워크 미니 리다이렉터에서 모든 리소스를 부당하게 사용하지 못하도록 방지하기 위한 RDBSS 메커니즘도 제공합니다.

작업 항목의 디스패치가 불가피한 특정 시나리오가 있습니다. 자주 메모리 할당을 방지하고 이러한 시나리오에서 작업을 해제하기 위해 WORK_QUEUE_ITEM 다른 데이터의 일부로 할당됩니다. 디스패치가 드문 다른 시나리오에서는 필요할 때까지 메모리 할당을 방지하기 위해 비용을 지불합니다. RDBSS 작업 큐 구현은 작업 큐 요청을 디스패치하고 게시하는 형태로 이러한 시나리오를 모두 제공합니다. RxDispatchToWorkerThread 루틴을 사용하여 디스패치하는 경우 호출자가 WORK_QUEUE_ITEM 대한 메모리를 할당할 필요가 없습니다. RxPostToWorkerThread 루틴을 사용하여 게시하려면 호출자가 WORK_QUEUE_ITEM 메모리를 할당해야 합니다.

작업자 스레드에 작업을 디스패치하는 두 가지 일반적인 경우가 있습니다.

  • 매우 드문 작업의 경우 RxDispatchToWorkerThread 루틴을 사용하여 필요할 때 작업 큐 항목에 대한 메모리를 동적으로 할당하고 해제하여 메모리 사용을 절약합니다.

  • 작업이 반복적으로 디스패치되는 경우 RxPostToWorkerThread 루틴을 사용하여 디스패치할 데이터 구조의 일부로 WORK_QUEUE_ITEM 미리 할당하여 시간을 절약합니다.

두 디스패치 작업 간의 장단점은 시간 대 공간(메모리 사용)입니다.

RDBSS의 디스패치 메커니즘은 프로세서별로 여러 수준의 작업 큐를 제공합니다. 현재 지원되는 작업 큐 수준은 다음과 같습니다.

  • 위험

  • 지연

  • 하이퍼크리티컬

위험과 지연을 구분하는 것이 우선 순위 중 하나입니다. HyperCritical 수준은 루틴이 차단되지 않아야 한다는 측면에서 다른 두 수준과 다릅니다(리소스를 기다립니다). 이 요구 사항을 적용할 수 없으므로 디스패치 메커니즘의 효과는 클라이언트의 암시적 협력에 의존합니다.

RDBSS의 작업 큐 구현은 KQUEUE 구현을 중심으로 빌드됩니다. 추가 지원에는 작업 항목을 적극적으로 기다리는 여러 스레드의 규정이 포함됩니다. 각 작업 큐 데이터 구조는 페이지가 없는 풀 메모리에서 할당되며 자체 동기화 메커니즘(스핀 잠금)이 있습니다.

부기 정보(예: 큐 상태 및 형식) 외에도 RDBSS는 작업 큐의 수명 동안 수집된 통계를 기본. 이렇게 하면 작업 큐를 튜닝하는 데 중요한 정보를 제공할 수 있습니다. 처리된 항목 수, 처리해야 하는 항목 수 및 누적 큐 길이가 구조화됩니다. 누적 큐 길이는 중요한 메트릭이며 추가 작업 항목이 큐에 대기할 때마다 처리되기를 기다리는 항목 수의 합계를 나타냅니다. 누적 큐 길이를 처리된 총 항목 수와 처리할 항목 수의 합계로 나눈 값은 평균 큐 길이를 나타냅니다. 둘보다 훨씬 큰 값은 작업 큐와 연결된 작업자 스레드의 최소 수를 늘릴 수 있음을 나타냅니다. 1보다 훨씬 작은 값은 큐와 연결된 최대 작업 스레드 수를 줄일 수 있음을 나타냅니다.

작업 큐는 일반적으로 활성 상태에서 시작하여 복구할 수 없는 상황(예: 시스템 리소스 부족)이 발생하거나 비활성 상태로 전환될 때까지 계속됩니다. 런다운이 시작되면 런다운 진행 중 상태로 전환됩니다.

스레드가 중지된 경우 작업 큐의 런다운이 완료되지 않습니다. 데이터 구조를 삭제하려면 스레드 종료를 확인해야 합니다. RDBSS의 작업 큐 구현은 각 스레드가 런다운 컨텍스트에서 스레드 개체에 대한 참조를 저장하는 프로토콜을 따릅니다. 런다운 발급 스레드(작업 큐에 속하지 않음)는 데이터 구조를 삭제하기 전에 모든 스레드가 종료될 때까지 기다립니다.

RxDispatchToWorkerThreadRxPostToWorkerThread 큐의 현재 구현은 호출이 시작된 동일한 프로세서에서 작동합니다.

작업 큐 디스패치에 대한 다음 RDBSS 루틴은 다음과 같습니다.

루틴에서 반환된 값 설명

RxDispatchToWorkerThread

이 루틴은 작업자 스레드의 컨텍스트에서 루틴을 호출합니다. WORK_QUEUE_ITEM 대한 메모리는 이 루틴에 의해 할당됩니다.

RxPostToWorkerThread

이 루틴은 작업자 스레드의 컨텍스트에서 루틴을 호출합니다. WORK_QUEUE_ITEM 대한 메모리는 호출자가 할당해야 합니다.

RxSpinDownMRxDispatcher

이 루틴은 네트워크 미니 리다이렉터에 대한 디스패처 컨텍스트를 중단합니다.

이 루틴은 Windows Server 2003 및 Windows XP에서만 사용할 수 있습니다.