10 votos

¿Cómo puedo tener 1805 hilos cuando sólo tengo 4 CPUs virtuales?

Me preguntaba si alguien podría explicarme cómo en mi Monitor de Actividad dice que actualmente tengo 1805 hilos Screen shot of OS X Activity Monitor

Pero sólo tengo 4 núcleos virtuales en mi ordenador (lo que significa que sólo debería poder tener 4 hilos). ¿El recuento de hilos significa todos los hilos que están siendo manejados por las CPUs cuando están decidiendo qué hilo ejecutar?

EDITAR: La razón por la que creo que sólo puede haber 4 hilos en mi máquina viene de esto respuesta . Creo que mi malentendido se debe a que la palabra "hilo" se utiliza en un contexto diferente.

0 votos

Los comentarios no son para ampliar la discusión; esta conversación ha sido trasladado al chat .

26voto

Joe Puntos 26

Programación

Su 1.805 los hilos no se ejecutan simultáneamente . Se intercambian. Un núcleo ejecuta un trozo del hilo, y luego lo deja a un lado para ejecutar un trozo de otro hilo. Los otros núcleos hacen lo mismo. De un lado a otro, los hilos ejecutan un poco a la vez, no todos a la vez.

Una de las principales responsabilidades del sistema operativo (Darwin y MacOS) es la programación de qué hilo debe ejecutarse en qué núcleo y durante cuánto tiempo.

Muchos hilos no tienen trabajo que hacer, por lo que quedan inactivos y sin programar. Del mismo modo, muchos hilos pueden estar esperando algún recurso, como que se recuperen datos del almacenamiento, o que se complete una conexión de red, o que se carguen datos de una base de datos. Sin casi nada que hacer más que comprobar el estado del recurso esperado, estos hilos se programan muy brevemente, si es que lo hacen.

El programador de la aplicación puede ayudar a esta operación de programación durmiendo su hilo durante una cierta cantidad de tiempo cuando sabe que la espera del recurso externo llevará algún tiempo. Y si se está ejecutando un bucle "apretado" que consume mucha CPU sin motivo para esperar a los recursos externos, el programador puede insertar una llamada para ofrecerse como voluntario para ser apartado brevemente para no acaparar el núcleo y permitir así que otros hilos se ejecuten.

Para más detalles, consulte el Página de Wikipedia sobre multithreading .

Multihilo simultáneo

En cuanto a su Pregunta vinculada Los hilos allí son efectivamente los mismos que aquí.

Uno de los problemas es el coste de la sobrecarga que supone cambiar de hilo cuando el sistema operativo lo programa. Hay un coste significativo en tiempo para descargar las instrucciones y datos del hilo actual del núcleo y luego cargar las instrucciones y datos del siguiente hilo programado. Parte del trabajo del sistema operativo es tratar de ser inteligente en la programación de los hilos para optimizar este coste de sobrecarga.

Algunos fabricantes de CPU han desarrollado una tecnología para reducir este tiempo y hacer que el cambio entre un par de hilos sea mucho más rápido. Intel llama a su tecnología Hyper-Threading . Conocido genéricamente como multihilo simultáneo (SMT) .

Aunque el par de hilos no se ejecuta realmente de forma simultánea, la conmutación es tan suave y rápida que ambos hilos parecen ser prácticamente simultáneos. Esto funciona tan bien que cada núcleo se presenta como un par de núcleos virtuales al sistema operativo. Así, una CPU habilitada para SMT con cuatro núcleos físicos, por ejemplo, se presentará al sistema operativo como una CPU de ocho núcleos.

A pesar de esta optimización, sigue habiendo algunos de la conmutación entre dichos núcleos virtuales. Demasiados hilos de la CPU, todos ellos clamando por tiempo de ejecución para ser programados en un núcleo, pueden hacer que el sistema sea ineficiente, sin que ningún hilo consiga hacer mucho trabajo. Es como si se repartieran tres pelotas en un patio de recreo entre nueve niños, en lugar de repartirlas entre nueve cien niños en los que ningún niño consigue jugar en serio con una pelota.

Por lo tanto, hay una opción en el firmware de la CPU en la que un administrador de sistemas puede activar un interruptor en la máquina para desactivar SMT si decide que beneficiaría a sus usuarios que ejecutan una aplicación que es inusualmente CPU-bound con muy pocas oportunidades para hacer una pausa.

En tal caso, volvemos a su pregunta original: En esta situación especial, usted querría restringir las operaciones para no tener más de estos hilos hiperactivos que los núcleos físicos. Pero permíteme repetir: esta es una situación extremadamente inusual que podría ocurrir en algo como un proyecto especializado de procesamiento de datos científicos, pero casi nunca se aplicaría a los escenarios comunes de negocios/corporativos/empresas.

0 votos

Los comentarios no son para ampliar la discusión; esta conversación ha sido trasladado al chat .

0 votos

Además, nadie pone yield() las llamadas al sistema en sus hilos intensivos de la CPU (a menos que se trate de código heredado de la multitarea cooperativa en el MacOS clásico). La multitarea preventiva se reprograma después de que un hilo utilice su fracción de tiempo.

0 votos

Su descripción de hyperthreading es errónea. Los hilos de hardware = hilos de software, son contextos de ejecución / núcleos lógicos. Ambos núcleos lógicos en un núcleo físico realmente ejecutan sus instrucciones al mismo tiempo. El front-end alterna entre hilos (cada ciclo), pero el núcleo de ejecución fuera de orden puede ejecutar instrucciones/uops de ambos hilos en el mismo ciclo. Esto expone el paralelismo a nivel de instrucción de dos hilos a la ejecución OoO para mantener mejor las unidades de ejecución alimentadas con trabajo (este es básicamente el punto de SMT). No es sólo "cambio de contexto optimizado".

7voto

Oskar Puntos 1242

En los viejos tiempos, la memoria no estaba virtualizada ni protegida y cualquier código podía escribir en cualquier lugar. En aquellos días, un diseño de un hilo para una CPU tenía sentido. En las décadas posteriores, la memoria primero se protegió y luego se virtualizó. Piensa en los hilos como núcleos virtuales - una especie de promesa de que en algún momento, cuando tus datos y tu código estén listos, ese hilo será empujado ( o programado, como lo llaman los ingenieros y matemáticos que investigan los algoritmos de programación ) en una CPU real para hacer un trabajo real.

enter image description here

Ahora - debido a las magnitudes de la diferencia en el tiempo - la CPU y la caché operan tan rápido en comparación con la obtención de datos desde el almacenamiento o la red - que miles de hilos podrían ir y venir mientras un hilo está esperando a que www.google.com entregue un paquete o dos de datos, así que esa es la razón por la que ves tantos hilos más que la CPU real.

Si conviertes las operaciones de los hilos que ocurren en la escala de tiempo negro / azul y las conviertes a un segundo = 1 ns, las cosas que nos importan son más como la IO del disco toman 100 microsegundos son como 4 días y un viaje de ida y vuelta de Internet de 200 ms es un retraso de 20 años si estás contando segundos en la escala de tiempo de la CPU. Como muchos ejercicios de potencias de diez En casi todos los casos, la CPU permanece inactiva durante "meses" a la espera de un trabajo significativo de un mundo externo muy, muy lento.

No parece que haya nada raro en la imagen que has colgado, así que tal vez estemos malinterpretando lo que quieres decir al preguntarte por los hilos.

Si haces clic con el botón derecho (clic de control) en la palabra hilos en la fila de la cabecera en la parte superior, añade el estado de la aplicación y verás que la mayoría de los hilos están probablemente inactivos, durmiendo, no se están ejecutando en un momento dado.

0 votos

Los comentarios no son para ampliar la discusión; esta conversación ha sido trasladado al chat .

1voto

David Richerby Puntos 2258

No se hace la pregunta, posiblemente más fundamental, de "¿Cómo puedo tener 290 procesos si mi CPU sólo tiene cuatro núcleos?". Esta respuesta es un poco de historia, que puede ayudarte a entender el panorama general, aunque la pregunta específica ya ha sido respondida. Por lo tanto, no voy a dar una versión TL;DR.

Hace tiempo (pensemos en los años 50-60), los ordenadores sólo podían hacer una cosa a la vez. Eran muy caros, llenaban habitaciones enteras y necesitábamos una forma de hacer un uso eficiente de ellos compartiéndolos entre varias personas. La primera forma de hacerlo fue procesamiento por lotes El sistema de gestión de la información, en el que los usuarios enviaban tareas al ordenador y éstas se ponían en cola, se ejecutaban una tras otra y los resultados se enviaban al usuario. Eso estaba bien, pero significaba que, si querías hacer un cálculo que iba a llevar un par de días, nadie más podía usar el ordenador durante ese tiempo.

La siguiente innovación (pensemos en los años 60-70) fue tiempo compartido . Ahora, en lugar de ejecutar la totalidad de una tarea, y luego la totalidad de la siguiente, el ordenador ejecutaría un trozo de una tarea, luego la pausaría y ejecutaría un trozo de la siguiente, y así sucesivamente. De este modo, el ordenador daría la impresión de estar ejecutando varios procesos simultáneamente. La gran ventaja de esto es que ahora puedes ejecutar un cálculo que te llevará un par de días y, aunque ahora tardará aún más, porque se sigue interrumpiendo, otras personas pueden seguir utilizando la máquina durante ese tiempo.

Todo esto era para enormes ordenadores de tipo mainframe. Cuando los ordenadores personales empezaron a popularizarse, al principio no eran muy potentes y, además, como eran personal parecía correcto que sólo pudieran hacer una cosa -ejecutar una aplicación- a la vez (pensemos en los años 80). Pero, a medida que se hicieron más potentes (desde los años 90 hasta la actualidad), la gente quiso que sus ordenadores personales también compartieran el tiempo.

Así que acabamos con ordenadores personales que daban la ilusión de ejecutar múltiples procesos de forma concurrente, pero que en realidad los ejecutaban de uno en uno durante breves periodos de tiempo y luego los ponían en pausa. Los hilos son esencialmente lo mismo: con el tiempo, la gente quería que incluso los procesos individuales dieran la ilusión de hacer varias cosas simultáneamente. Al principio, el escritor de la aplicación tenía que encargarse de ello: pasar un rato actualizando los gráficos, pausar eso, pasar un rato calculando, pausar eso, pasar un rato haciendo otra cosa, ...

Sin embargo, el sistema operativo ya era bueno en la gestión de múltiples procesos, tenía sentido ampliarlo para gestionar estos subprocesos, que se llaman hilos. Así, ahora tenemos un modelo en el que cada proceso (o aplicación) contiene al menos un hilo, pero algunos contienen varios o muchos. Cada uno de estos hilos corresponde a una subtarea algo independiente.

Pero, en el nivel superior, la CPU sigue dando la ilusión de que todos estos hilos están funcionando al mismo tiempo. En realidad, está ejecutando uno durante un rato, pausándolo, eligiendo otro para ejecutarlo durante un rato, y así sucesivamente. Excepto que las CPUs modernas pueden ejecutar más de un hilo a la vez. Así que, en el real En realidad, el sistema operativo está jugando a este juego de "ejecutar durante un rato, pausar, ejecutar otra cosa durante un rato, pausar" en todos los núcleos simultáneamente. Así que puedes tener tantos hilos como quieras (y los diseñadores de tu aplicación) pero, en cualquier momento, todos menos unos pocos estarán realmente en pausa.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X