procesos manejo hilos c++ multithreading multicore

procesos - manejo hilos c++



Diferencias multihilo y multinĂșcleo. (4)

Tengo un par de pequeñas preguntas.

En primer lugar, ¿hay una diferencia entre multiproceso y multinúcleo? ¿Son dos cosas completamente diferentes o el multihilo usa más de un núcleo si lo necesita?

En segundo lugar, la mayoría de los núcleos tienen dos subprocesos, pero al perfilar mi aplicación noté muchos subprocesos diferentes que van desde el subproceso 128 al subproceso 3460. ¿Qué determina la cantidad de subprocesos que tiene su computadora?

Gracias


En primer lugar, ¿hay una diferencia entre multiproceso y multinúcleo?

Sí.

Multiprocesamiento y multinúcleo son diferentes piezas de terminología que se aplican a diferentes áreas de la informática.

  • El multinúcleo se refiere a una computadora o procesador que tiene más de un núcleo lógico de CPU y que puede ejecutar físicamente varias instrucciones al mismo tiempo. El "conteo central" de una computadora es el número total de núcleos que tiene la computadora: las computadoras pueden tener múltiples procesadores, cada uno de los cuales puede tener múltiples núcleos; el recuento de núcleos es el número total de núcleos en todos los procesadores.

  • El multihilo se refiere a un programa que puede aprovechar una computadora multinúcleo ejecutándose en más de un núcleo al mismo tiempo. En general, el doble de núcleos equivale al doble de potencia de computación (para programas que admiten subprocesos múltiples), aunque algunos problemas están limitados por factores distintos al uso de la CPU; estos problemas no experimentarán ganancias tan dramáticas como el multihilo.

    Es importante tener en cuenta que el rendimiento no es la única razón por la que los programas utilizan muchos subprocesos. Más sobre eso más adelante.

¿Son dos cosas completamente diferentes o el multihilo usa más de un núcleo si lo necesita?

Están relacionados pero separados.

Los programas que admiten subprocesos múltiples pueden usar más de un núcleo si hay más de uno disponible.

La mayoría de los núcleos tienen dos subprocesos, pero al perfilar mi aplicación noté muchos subprocesos diferentes que van desde el subproceso 128 al subproceso 3460.

El sistema operativo asigna números de hilos para que pueda realizar un seguimiento de ellos.

La mayoría de los programas que jamás ejecutará no necesitarán 3400 subprocesos ejecutándose a la vez. Además, un hilo en ejecución consumirá todo un núcleo. La única razón por la que su CPU no se está ejecutando al 100% todo el tiempo es que el sistema operativo sabe cómo suspender el procesador, lo que básicamente hace que pare todo y espere hasta que ocurra algo (como un evento IO o una marca de reloj). Solo un hilo puede ejecutarse en un núcleo a la vez. Los diferentes subprocesos que se ejecutan son en realidad solo subprocesos que saltan a la CPU y se ejecutan durante cortos períodos de tiempo, y luego se cambian con otros subprocesos que también deben ejecutarse.

¿Qué dicta cuántos hilos tiene tu computadora?

El número total de subprocesos en todos sus procesos. Además, la mayoría de los sistemas operativos imponen un límite rígido, un número máximo de subprocesos existentes que no se pueden superar.

Un proceso es un programa (probablemente lo sepas). El subprocesamiento múltiple es el proceso de tener más de un subproceso por proceso (muchos procesos no crearán más de un subproceso porque no tienen que hacerlo). Windows no tiene un límite estricto en el número de subprocesos que puede crear (al menos, no desde XP. No voy a decir nada sobre w98 y anterior), pero, por supuesto, el número de subprocesos que puede crear está limitado por la cantidad de memoria. tienes.

Usted dijo que algunos programas usan múltiples hilos por razones distintas al rendimiento.

A veces es bueno poder realizar múltiples tareas, incluso si no es concurrente.

A veces los programas necesitan hacer cosas específicas en momentos específicos. Un ejemplo comúnmente citado es un programa con una ventana visible. Ese programa podría estar haciendo un intenso proceso de procesamiento de números de fondo, pero sería beneficioso si aún pudiera responder a eventos de usuarios, como hacer clic en los botones y cambiar su tamaño. Esto se puede lograr con el procesamiento asíncrono, lo que requerirá que su único hilo verifique repetidamente el trabajo de la GUI a intervalos, pause lo que está haciendo y maneje la GUI por un tiempo. Muchas cosas lo hacen de esta manera.

Otra, posiblemente mejor manera de manejarlo es con un hilo. Su programa no tiene que preocuparse por alternar entre el procesamiento de números y la administración de GUI, el sistema operativo lo administrará por usted. Incluso si tiene un solo núcleo, aún puede ejecutar varios subprocesos, y su sistema operativo hará todo lo posible para asegurarse de que todos los subprocesos en ejecución en todos los procesos en ejecución reciban su parte justa de tiempo de CPU.


La mayoría de los núcleos tienen dos hilos

Aquí, creo que estás confundiendo el término sobrecargado "hilo". Como lo señalan correctamente otras respuestas, un hilo generalmente se refiere a un concepto de "software". Pero a veces también se utiliza como un concepto de "hardware". Cuando un "núcleo" tiene dos "hilos" (como en muchos nuevos chips de Intel), significa que el núcleo puede ejecutar dos hilos paralelos, como si hubiera dos núcleos. Esto es, sin embargo, generalmente llamado hyperthreading. Ver:

http://en.wikipedia.org/wiki/Hyper-threading

Entonces, si tiene N subprocesos (me refiero a subprocesos de software, aquellos creados dentro de su aplicación, o simplemente ejecutando diferentes aplicaciones al mismo tiempo) y procesadores M (que son núcleos o los subprocesos de hardware explicados anteriormente), sucede lo siguiente:

  • N <= M: entonces el sistema operativo debe asignar a cada subproceso un procesador diferente. Entonces los hilos de la aplicación se ejecutan verdaderamente en paralelo.
  • N> M: entonces algunos hilos tienen que compartir un procesador.

El subprocesamiento en un solo núcleo generalmente significa que puede crear x número de subprocesos y cada uno tendrá una cantidad determinada de tiempo para ejecutarse (cantidad de subprocesos). Cuando los subprocesos se cambian, esto se conoce como cambio de contexto, todo esto lleva algo de tiempo, por lo que se necesita hacer una evaluación comparativa para encontrar un número ideal de subprocesos para tener por núcleo.

Si la mayoría del trabajo está relacionado con la CPU, hay poco sentido para generar cientos de subprocesos, ya que es poco probable que mejore el rendimiento (de hecho, quizás sea peor, recuerde que el cambio de contexto no es gratis). Sin embargo, hacer esto para el trabajo enlazado de E / S puede ayudar, ya que mientras el sistema está ocupado haciendo este trabajo, se le puede dar a otro subproceso la hora de la CPU.

Tener núcleos físicos adicionales significa que dos cosas realmente pueden ejecutarse en paralelo en el nivel de hardware.


La cantidad de núcleos y la cantidad de hilos están desacoplados. Puede tener muchos subprocesos ejecutándose en un solo núcleo, y puede tener situaciones en las que solo un subproceso se ejecuta a pesar de la presencia de más núcleos (aunque no puedo pensar en un escenario de la vida real en el que suceda esto). Digamos que el multinúcleo es una característica del hardware, mientras que el número de subprocesos es algo en el dominio del sistema operativo y los procesos que se ejecutan en él.

Por supuesto, con un solo núcleo no puede tener más de un subproceso ejecutándose simultáneamente . El sistema operativo tiene que cambiar constantemente entre hilos.