Compartir a través de


Mecanismos de distribución de colas de trabajo

RDBSS usa colas de trabajo de kernel de Windows para enviar operaciones en varios subprocesos para su ejecución posterior. Los controladores de minidirector de red pueden usar las colas de trabajo mantenidas por RDBSS para enviar operaciones para su ejecución posterior.

RDBSS proporciona varias rutinas que implementan el mecanismo de distribución usado en RDBSS. Estas rutinas también se pueden usar mediante controladores de minidirector de red.

RDBSS realiza un seguimiento de los elementos de trabajo por cada objeto. Esto permite a RDBSS controlar las condiciones de carrera asociadas a los mini-redireccionadores de carga y descarga. Esto también proporciona un mecanismo en RDBSS para evitar que un minidirector de red único use de forma desleal todos los recursos.

Hay ciertos escenarios en los que el envío de elementos de trabajo es inevitable. Para evitar la asignación frecuente de memoria y para liberar operaciones en estos escenarios, el WORK_QUEUE_ITEM se asigna como parte de otros datos. En otros escenarios en los que el envío es poco frecuente, paga para evitar la asignación de memoria hasta que sea necesario. La implementación de cola de trabajo de RDBSS proporciona ambos escenarios en forma de envío y publicación de solicitudes de cola de trabajo. En el caso de enviar mediante la rutina RxDispatchToWorkerThread , no es necesario asignar memoria para el WORK_QUEUE_ITEM el autor de la llamada. Para publicar con la rutina RxPostToWorkerThread , el autor de la llamada debe asignar la memoria de la WORK_QUEUE_ITEM.

Hay dos casos comunes de envío de operaciones a subprocesos de trabajo:

  • Para una operación muy poco frecuente, use la rutina RxDispatchToWorkerThread para conservar el uso de memoria asignando y liberando memoria dinámicamente para el elemento de cola de trabajo cuando sea necesario.

  • Cuando se va a enviar una operación repetidamente, use la rutina RxPostToWorkerThread para conservar el tiempo asignando de antemano la WORK_QUEUE_ITEM como parte de la estructura de datos que se va a enviar.

La compensación entre las dos operaciones de distribución es el tiempo frente al espacio (uso de memoria).

El mecanismo de distribución en RDBSS proporciona varios niveles de colas de trabajo por procesador. Actualmente se admiten los siguientes niveles de colas de trabajo:

  • Crítico

  • Delayed

  • Hipercrítico

La distinción entre Crítico y Retrasado es una de las prioridades. El nivel HyperCritical es diferente de los otros dos de que las rutinas no deben bloquearse (espere ningún recurso). Este requisito no se puede aplicar, por lo que la eficacia del mecanismo de distribución se basa en la cooperación implícita de los clientes.

La implementación de la cola de trabajo en RDBSS se basa en una implementación de KQUEUE. La compatibilidad adicional implica la regulación de una serie de subprocesos que están esperando activamente los elementos de trabajo. Cada estructura de datos de cola de trabajo se asigna desde la memoria del grupo no paginada y tiene su propio mecanismo de sincronización (un interbloqueo).

Además de la información de contabilidad (estado y tipo de cola, por ejemplo), RDBSS también mantiene estadísticas recopiladas durante la vigencia de la cola de trabajo. Esto puede proporcionar información valiosa para ajustar una cola de trabajo. El número de elementos que se han procesado, el número de elementos que se deben procesar y la longitud de la cola acumulativa está estructurada. La longitud de la cola acumulativa es una métrica importante y representa la suma del número de elementos que esperan a procesarse cada vez que se puso en cola un elemento de trabajo adicional. La longitud de cola acumulativa dividida por la suma del número total de elementos procesados y el número de elementos que se van a procesar proporciona una indicación de la longitud media de la cola. Un valor mucho mayor que uno significa que se puede aumentar el número mínimo de subprocesos de trabajo asociados a la cola de trabajo. Un valor mucho menor que uno significa que se puede reducir el número máximo de subprocesos de trabajo asociados a la cola.

La cola de trabajo se inicia normalmente en un estado activo y continúa hasta que se encuentra una situación no recuperable (falta de recursos del sistema, por ejemplo) o cuando pasa al estado inactivo. Cuando se inicia una ejecución, realiza la transición al estado de ejecución en curso.

La ejecución de las colas de trabajo no se completa cuando los subprocesos se han desanchado. Es necesario garantizar la terminación de los subprocesos antes de que se puedan descomponer las estructuras de datos. La implementación de la cola de trabajo en RDBSS sigue un protocolo en el que cada uno de los subprocesos que se va a girar guarda una referencia al objeto de subproceso en el contexto de ejecución. El subproceso emisor (que no pertenece a la cola de trabajo) espera a que se completen todos los subprocesos antes de anular las estructuras de datos.

La implementación actual de las colas RxDispatchToWorkerThread y RxPostToWorkerThread funcionan en el mismo procesador desde el que se originó la llamada.

Entre las siguientes rutinas de RDBSS para el envío de colas de trabajo se incluyen.

Routine Descripción

RxDispatchToWorkerThread

Esta rutina invoca una rutina en el contexto de un subproceso de trabajo. Esta rutina asigna la memoria de la WORK_QUEUE_ITEM.

RxPostToWorkerThread

Esta rutina invoca la rutina en el contexto de un subproceso de trabajo. El autor de la llamada debe asignar memoria para el WORK_QUEUE_ITEM.

RxSpinDownMRxDispatcher

Esta rutina reduce el contexto del distribuidor para un minidirector de red.

Tenga en cuenta que esta rutina solo está disponible en Windows Server 2003 y Windows XP.