다음을 통해 공유


하드웨어 큐를 사용하는 RSS

하드웨어 큐가 있는 RSS는 단일 하드웨어 수신 큐 솔루션을 사용하여 RSS에 비해 시스템 성능을 향상시킵니다. 하드웨어 큐를 지원하는 NIC는 수신된 데이터를 여러 수신 큐에 할당합니다. 수신 큐는 CPU와 연결됩니다. NIC는 해시 값 및 간접 테이블에 따라 받은 데이터를 CPU에 할당합니다.

다음 그림에서는 NIC 수신 큐가 있는 RSS를 보여 줍니다.

NIC 수신 큐가 있는 RSS를 보여 주는 다이어그램

그림에서 파선 화살표는 수신 처리에 대한 대체 경로를 나타냅니다. RSS는 초기 ISR 호출을 수신하는 CPU를 제어할 수 없습니다. 드라이버는 데이터를 큐에 대기할 필요가 없으므로 올바른 CPU에서 초기 DPC를 즉시 예약할 수 있습니다.

각 인터럽트마다 다음 프로세스가 반복됩니다.

  1. The NIC:

    1. DMA를 사용하여 수신된 데이터로 버퍼를 채웁니다.

      미니포트 드라이버는 초기화 중에 공유 메모리에 수신 버퍼를 할당했습니다.

    2. 해시 값을 계산합니다.

    3. CPU에 대한 버퍼를 큐에 대기시키고 미니포트 드라이버에 큐 할당을 제공합니다.

      예를 들어 NIC는 1-3단계를 반복하고 일부 수의 패킷이 수신된 후 CPU 할당 목록을 DMA로 반복할 수 있습니다. 특정 메커니즘은 NIC 디자인에 남아 있습니다.

    4. 시스템을 중단합니다.

      시스템이 한 인터럽트에서 처리하는 수신된 버퍼는 CPU 간에 분산됩니다.

  2. NDIS는 시스템 결정 CPU에서 미니포트 드라이버의 ISR( MiniportInterrupt 함수)을 호출합니다.

  3. 미니포트 드라이버는 비어 있지 않은 큐가 있는 각 CPU에 대해 지연 프로시저 호출(DPC)을 큐에 대기하도록 NDIS를 요청합니다.

    드라이버에서 인터럽트 사용을 설정하기 전에 모든 DPC를 완료해야 합니다. 또한 ISR은 처리할 버퍼가 없는 CPU에서 실행 중일 수 있습니다.

  4. NDIS는 대기하는 각 DPC에 대해 MiniportInterruptDPC 함수를 호출합니다. 지정된 CPU의 DPC:

    1. 빌드는 큐에서 받은 모든 버퍼에 대한 설명자를 수신하고 드라이버 스택의 데이터를 나타냅니다.

      자세한 내용은 RSS 수신 데이터 표시를 참조하세요.

    2. 마지막 DPC인 경우 인터럽트(완료할 마지막 DPC)를 사용하도록 설정합니다. 이 인터럽트는 완료되고 프로세스가 다시 시작됩니다. 드라이버는 원자성 연산을 사용하여 완료할 마지막 DPC를 식별해야 합니다. 예를 들어 드라이버는 NdisInterlockedDecrement 함수를 사용하여 원자성 카운터를 구현할 수 있습니다.