작업 큐 디스패치 메커니즘
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의 작업 큐 구현은 각 스레드가 런다운 컨텍스트에서 스레드 개체에 대한 참조를 저장하는 프로토콜을 따릅니다. 런다운 발급 스레드(작업 큐에 속하지 않음)는 데이터 구조를 삭제하기 전에 모든 스레드가 종료될 때까지 기다립니다.
RxDispatchToWorkerThread 및 RxPostToWorkerThread 큐의 현재 구현은 호출이 시작된 동일한 프로세서에서 작동합니다.
작업 큐 디스패치에 대한 다음 RDBSS 루틴은 다음과 같습니다.
루틴에서 반환된 값 | 설명 |
---|---|
이 루틴은 작업자 스레드의 컨텍스트에서 루틴을 호출합니다. WORK_QUEUE_ITEM 대한 메모리는 이 루틴에 의해 할당됩니다. |
|
이 루틴은 작업자 스레드의 컨텍스트에서 루틴을 호출합니다. WORK_QUEUE_ITEM 대한 메모리는 호출자가 할당해야 합니다. |
|
이 루틴은 네트워크 미니 리다이렉터에 대한 디스패처 컨텍스트를 중단합니다. 이 루틴은 Windows Server 2003 및 Windows XP에서만 사용할 수 있습니다. |