2009-03-18 14 views
13

Según entiendo, el programador de subprocesos de Windows no discrimina entre subprocesos pertenecientes a dos procesos diferentes, siempre que todos tengan la misma prioridad de base. Mi pregunta es si tengo dos aplicaciones, una con solo un hilo y la otra con 50 hilos con la misma prioridad base, ¿significa que el segundo proceso tiene más tiempo de CPU que el primero?Win32 Programación de subprocesos

+0

¿Y qué pasa si una aplicación tiene 50 procesos y la otra solo tiene una? ¿Debería la primera aplicación obtener más tiempo de CPU? –

Respuesta

2

Eso depende del comportamiento de los hilos. En general, con una diferencia de 50: 1 en el recuento de hilos, sí, la aplicación con más hilos va a tener mucho más tiempo. Sin embargo, Windows también utiliza la priorización dinámica de subprocesos, que puede cambiar esto de alguna manera. priorización hilo dinámico se describe aquí:

http://support.microsoft.com/kb/109228

extracto relevante:

La prioridad de base de un subproceso es el nivel de base de la que se realizan estos ajustes al alza. La prioridad actual de un hilo se llama su prioridad dinámica. Los subprocesos interactivos que ceden antes de que su intervalo de tiempo esté activo tenderán a ajustarse hacia arriba en prioridad desde su prioridad base. Los subprocesos vinculados a la computación que no rinden, consumiendo todo su segmento de tiempo, tenderán a disminuir su prioridad, pero no por debajo del nivel base. Esta disposición a menudo se llama programación heurística. Proporciona un mejor rendimiento interactivo y tiende a disminuir el impacto del sistema de los hilos "CPU hog".

3

La unidad de programación es un hilo, no un proceso, por lo que un proceso con 50 hilos, todo en un bucle estrecho, recibirá mucho más de la CPU de un proceso con un solo hilo, proporcionan todos son corriendo en la misma prioridad. Esto normalmente no es una preocupación ya que la mayoría de los hilos en el sistema no están en un estado ejecutable y no estarán listos para la programación; están esperando E/S, esperando la entrada del usuario, y así sucesivamente.

Windows Internals es un excelente libro para aprender más sobre el programador de subprocesos de Windows.

9

La programación en Windows se encuentra en el granularidad de subprocesos. La idea básica detrás de este enfoque es que los procesos no se ejecutan sino que solo proporcionan recursos y un contexto en el que se ejecutan sus subprocesos. Volviendo a su pregunta, porque las decisiones de programación se hacen estrictamente en base a un hilo, no se tiene en cuenta a qué proceso pertenece el hilo. En su ejemplo, si el proceso A tiene 1 subproceso ejecutable y el proceso B tiene 50 subprocesos ejecutables, y los 51 subprocesos tienen la misma prioridad, cada subproceso recibirá 1/51 del tiempo de CPU: Windows no daría el 50 por ciento de la CPU para procesar A y 50 por ciento para procesar B. Para comprender los algoritmos de programación de hilos, primero debe comprender los niveles de prioridad que usa Windows. Puede refer aquí para una referencia rápida.

Intente leer Windows Internals para una comprensión profunda.

+0

La información también está aquí: http://msdn.microsoft.com/en-us/library/ms810029.aspx#irql_sched_topic5 – Mehrdad

+0

Por lo tanto, es justo decir que el programador de subprocesos de Windows utiliza un algoritmo 'justo', p. todos los hilos con el mismo nivel de prioridad tienen la misma probabilidad de ser programados? Si es así, para los mismos subprocesos de nivel de prioridad, ¿cuál está programado primero? ¿Es el orden aleatorio o es determinista de alguna manera? – stt106

5

Todo lo anterior es preciso, pero si le preocupa que el proceso de 50 hilos acapare toda la CPU, existen técnicas que puede realizar para garantizar que ningún proceso abrume a la CPU.

En mi humilde opinión la mejor manera de hacerlo es utilizar job objects para administrar el uso de un proceso. Primero, llame al CreateJobObject, luego SetInformationJobObject para limitar el uso máximo de CPU de los procesos en el objeto de trabajo y AssignProcessToJobObject para asignar el proceso con 50 hilos al objeto de trabajo. Luego puede dejar que el sistema operativo se asegure de que el proceso de 50 hilos no consuma demasiado tiempo de CPU.

+0

Si hubiera herramientas para que los usuarios finales pudieran utilizarlas, sería una gran victoria para Windows. –

+0

Hay, tipo de. Inicie el administrador de tareas, haga clic derecho en un proceso y seleccione "Establecer afinidad". Esto le permite asignar subprocesos individuales a CPU específicas. No es exactamente lo mismo, pero está cerca. –

0

Hay una configuración local 'avanzada' que supuestamente se puede utilizar para sombrear la programación ligeramente a favor de la aplicación con enfoque. Con la configuración de 'servicios', no hay preferencia. En versiones anteriores de Windows, esta configuración solía ser algo más granular que solo 'aplicaciones con foco' (ligera preferencia a la aplicación con foco) y 'servicios' (todo igual a la carga)

Como esto puede ser establecido por el usuario en la máquina de segmentación, parece que está pidiendo que la aflicción dependa de esta configuración ...

Cuestiones relacionadas