2010-01-05 18 views
6

Cuando ejecuto un programa de un único subproceso que he escrito en mi núcleo cuádruple Intel, puedo ver en el Administrador de tareas de Windows que en realidad los cuatro núcleos de mi CPU están más o menos activos. Un núcleo es más activo que los otros tres, pero también hay actividad en esos. No hay otro programa (incluido el núcleo del sistema operativo, por supuesto) en ejecución que sea plausible para esa actividad. Y cuando cierro mi programa, toda la actividad y todos los núcleos descienden a casi cero. Todo lo que queda es un pequeño "ruido" en los núcleos, por lo que estoy bastante seguro de que toda la actividad visible proviene directa o indirectamente (como la invocación de rutinas del sistema) de mi programa.¿Es posible que un programa de subproceso único se ejecute simultáneamente en más de un núcleo de CPU?

¿Es posible que el sistema operativo o los núcleos mismos intenten equilibrar algún código o ejecución en los cuatro núcleos, incluso si no es un programa multiproceso? ¿Tiene algún enlace que documente esta técnica?

Algunas informaciones sobre el programa: es una aplicación de consola escrita en Qt, el Administrador de tareas indica que solo se está ejecutando un subproceso. Quizás Qt usa hilos, pero yo no uso señales ni ranuras, ni ninguna GUI.

Enlace al Administrador de tareas de captura de pantalla: http://img97.imageshack.us/img97/6403/taskmanager.png

Esta pregunta es el lenguaje agnóstico y no atado a Qt/C++, sólo quiero saber si Windows o Intel hacen para equilibrar también el código de un solo subproceso en todos los núcleos. Si lo hacen, ¿cómo funciona esta técnica?

Todo lo que puedo pensar es que las rutinas del kernel, como la lectura desde el disco, están programadas en todos los núcleos, pero esto no mejorará significativamente el rendimiento ya que el código debe ejecutarse sincrónicamente con las llamadas a la API kernel.

EDITAR

¿Conoce alguna herramientas para hacer un mejor análisis de/o programas individuales y multi-hilo que el Administrador de Tareas pobres?

Respuesta

10

Un único proceso de subprocesos solo se ejecutará en un único núcleo en cualquier momento dado.

Pero es posible que el sistema operativo migre un hilo de un núcleo a otro. Mientras que el SO intentará mantener un hilo en el mismo núcleo, si el último núcleo en el que se ejecutó el hilo está ocupado y otro núcleo es libre, el sistema operativo puede migrar el hilo.

+1

sí, por supuesto, a menos que esté trabajando con procesadores cuánticos, solo puede tener 1 procesador que ejecute un determinado hilo en un momento dado. Sin embargo, durante un intervalo de tiempo, ese único hilo se puede migrar a otra CPU. – ennuikiller

+0

versión anterior de Windows (XP y versiones anteriores) NO intente mantener un proceso en el mismo núcleo, hacen exactamente lo contrario de esto de manera predeterminada. –

+0

Es * posible * que el planificador del sistema operativo migre un proceso (más exactamente, un hilo) de un núcleo a otro, pero es muy poco probable. No sé Qt, pero me parece que una explicación más probable es que hay otros hilos detrás de la escena en Qt, que están programados en otros núcleos. Esa actividad, más la actividad del kernel y otros procesos, aparece en los otros núcleos. – Cheeso

0

Sí, a menos que utilice subprocesos de "afinidad del procesador" (uno o muchos) se programarán en cualquier procesador que el código de gestión de subprocesos del kernel le asigne. No hay garantía de que será el mismo procesador de una instrucción a la siguiente

1

¿Qué versión de Windows, XP y antes tienen un planificador de hilos terrible que en realidad saltará una única tarea con hilos desde el núcleo hasta el núcleo. Y en Windows (como en cualquier otro sistema operativo) hay docenas, sino cientos de programas no usuarios que se ejecutan al mismo tiempo, independientemente de lo que creas que estás ejecutando, que pueden representar toda esa actividad.

+0

Cuando mi programa no está en ejecución, no hay actividad significativa en todos los núcleos. Estoy seguro de que toda la actividad visible proviene directa o indirectamente de mi programa. – WolfgangA

+0

@ Wolfgang - su proceso puede estar causando actividad en otros hilos. Por ejemplo, si está dibujando en la pantalla, está causando trabajo en el proceso DWM. – Michael

+0

Esto es lo que quise decir con "indirectamente", al igual que las llamadas API o la invocación de todo tipo de rutinas del sistema. – WolfgangA

0

A pesar de lo que pueda percibir, hay mucho más en la CPU que solo su aplicación. El sistema operativo y todos sus procesos e hilos también se están ejecutando. lo que está viendo es que su proceso está programado en diferentes núcleos en diferentes momentos. Su aplicación no está paralelizada, es solo una de las muchas tareas que se están ejecutando actualmente. Tenga la seguridad de que su aplicación se ejecuta secuencialmente.

+0

con respecto a * lo que está viendo es que su proceso está programado en diferentes núcleos en diferentes momentos. * Poco probable. Es posible migrar un hilo de un núcleo a otro, pero no debería suceder normalmente. Estoy de acuerdo con "hay mucho más en juego que solo con tu aplicación". – Cheeso

+0

Me gustaría diferir. Te garantizo que en algún momento la aplicación tendrá un contexto desactivado, ya sea debido a IO wait o 4+ procesos que desean tiempo de CPU al mismo tiempo, o cualquier otra gran cantidad de razones por las que un programador hace un cambio de contexto, y cuando se vuelve a conectar en, irá al núcleo que el SO considere más apropiado. – cyberconte

2

La herramienta que desea hacer un análisis más profundo que el Administrador de tareas puede llamarse perfmon (perfmon.exe) - es una interfaz de usuario para capturar y representar gráficamente los contadores de rendimiento que instrumentan Windows.Puede usarlo para monitorear todo tipo de información tanto en un sistema como por nivel de proceso; aprende a amarlo, es uno de los mejores amigos de un desarrollador.

http://technet.microsoft.com/en-us/library/bb490957.aspx

0

Una mejor Administrador de tareas de Windows es sysinternals process explorer.

En Administrador de tareas de Windows (o en proceso de sysinternals Explorer), haga clic en el nombre del proceso, y establecer (elección) el núcleo de afinidad, debería ver ahora sólo un núcleo activo ...

Qué versión de Windows lo usas ? XP? Siete ?

Si usa XP, intente Siete, los núcleos se administran mejor.

0

Uso Windows 7 x64 Home Premium y una CPU Intel i7 920 y los programas de subproceso único saltan de núcleo a núcleo, por lo que no veo cómo mejora con respecto a XP.

7 reconoce HT (Hyper Threading) y no programa múltiples tareas para la CPU Core, que es probablemente la única ventaja 7 que tiene sobre XP. No tenía un procesador multinúcleo con XP por mucho tiempo, así que no estoy seguro de si XP tuvo en cuenta HT.

1

Este es un tema de investigación en este momento. Los compiladores paralelos deben encontrar oportunidades de concurrencia en su programa y ejecutarlos en paralelo. Pero es una tarea muy difícil.

Hay lenguajes como OpenMP que están diseñados para dar esta pista al compilador. Actualmente, la mayoría de las implementaciones de OpenMP utilizan una biblioteca de subprocesos en segundo plano. Pero en el futuro no lo harán.

Es posible que necesite hardware muy diferente para eso.

La respuesta breve es, no hoy, pero muy probablemente a través de OpenMP en el futuro. Pero también debe definir lo que quiere decir con un "hilo",

Cuestiones relacionadas