/ / ¿Puedo confiar en que los sistemas operativos programan subprocesos "óptimo" (paralelización) - java, multiproceso, sistema operativo

¿Puedo confiar en que los sistemas operativos programan subprocesos "óptimos" (paralelización) - java, multiproceso, sistema operativo?

Afaik: el número óptimo de subprocesos para los datos que son adecuados para el procesamiento paralelo es el número de núcleos, ya que cada subproceso tiene (teóricamente) un núcleo propio para funcionar. Para las CPU que son capaces de realizar subprocesos, es el doble de núcleos. Por favor, corríjame si estoy equivocado.

Mi pregunta es si el sistema operativo subyacente (Linux,Winodws OSX) realizará automáticamente mi "intención" y, por ejemplo, asigna cada subproceso a un solo núcleo asumiendo que tengo, p. 8 núcleos y en consecuencia 8 hilos donde cada uno de ellos trabaja en un "pérdida de tiempo"tarea?

O al revés: ¿Es posible asignar hilos a los núcleos (especialmente en Java)?

Respuestas

2 para la respuesta № 1

Hasta donde se: El número óptimo de subprocesos para los datos que son adecuados para el procesamiento en paralelo es el número de núcleos, ya que cada subproceso tiene (en teoría) un núcleo propio para ejecutarse. Para las CPU que son capaces de realizar subprocesos, es el doble de núcleos. Por favor, corríjame si estoy equivocado.

Es mucho, mucho más complicado que eso.

Depende de lo que estés optimizando. Si está optimizando el uso eficiente (es decir, rentable) del hardware disponible, entonces rara vez es óptimo. Si alguno de los hilos necesita esperar un período significativo. por alguna razon, luego una asignación de hilos uno a unoLos núcleos físicos dan como resultado la subutilización de los núcleos. Si esos núcleos podrían usarse para otra cosa (por ejemplo, ¡ejecute programas de alguien más!), Entonces su uso es subóptimo.

Incluso si está optimizando únicamente para la velocidad de la aplicación, una asignación de uno a uno no es necesariamente la mejor estrategia.

  • Cada aplicación + carga de trabajo tiene un "punto dulce" enTérminos del número de hilos. Esto depende de la cantidad y la naturaleza de cualquier conflicto interno, y la cantidad y naturaleza de la comunicación con sistemas externos (sistemas de archivos, redes, etc.).

  • Si tiene una regla rígida de un subproceso por núcleo, entonces puede tener como máximo N hilos en un sistema de N núcleos.

  • Si esa N es significativamente menor que la cantidad de hilos de "punto dulce", es posible que los núcleos estén inactivos la mayor parte del tiempo.

Ahora para hyper-threading.

Hyperthreads potencialmente te dan CPU extraCiclos por ciclo de reloj. Sin embargo, no le brindan ciclos adicionales en el sistema de memoria. Las características de rendimiento de un "núcleo virtual" muy diferente a un núcleo físico ... y para las aplicaciones de la vida real, la diferencia será significativa. La suposición x no tiene base.

Mi pregunta es si el sistema operativo subyacente (Linux,Winodws OSX) realizará automáticamente mi "intención" y, por ejemplo, asigna cada subproceso a un solo núcleo asumiendo que tengo, p. ¿8 núcleos y, en consecuencia, 8 hilos donde cada uno de ellos trabaja en una tarea "que consume tiempo"?

No necesariamente.

  • El SO tiene que tener en cuenta otras cosas queEstán sucediendo en el sistema. Otras aplicaciones, los demonios, etc. que manejan su escritorio, las cosas que tratan con los sistemas de archivos y los protocolos de red.

  • El sistema operativo (y JVM) generalmente solo reaccionará a laLo que ya ha pasado en la toma de decisiones de programación. Predecir el comportamiento futuro basado en el comportamiento pasado (en este nivel) no es rentable ... y los sistemas operativos modernos no intentan hacerlo, excepto en un nivel muy crudo / heurístico. La predicción perfecta (óptima) es imposible, e incluso si tener conocimiento perfecto el problema de la programación es NP-duro.

En teoría, un programador de aplicaciones podría diseñarUn horario óptimo. En la práctica, la mayoría de las aplicaciones son demasiado complicadas para esto Y es difícil tener en cuenta las otras cosas "aleatorias" que están sucediendo en el sistema.

O al revés: ¿es posible asignar hilos a los núcleos (especialmente en Java)?

No hay una forma práctica de hacer esto. (Vea la respuesta de @ksmonkey123 "s) Ciertamente, no de manera portátil.

Y es probable que no funcione en Javade todas formas. Java tiene el problema adicional de que hay subprocesos ocultos que hacen cosas detrás de la parte posterior de la aplicación (por ejemplo, el recolector de basura y los subprocesos finalizadores), y la administración de memoria Java es más difícil de predecir y más difícil de ajustar.


2 para la respuesta № 2

No, no puedes asignar un hilo a un núcleo específico en Java (Java Multithreading - Asigna hilos a los núcleos del procesador)

En general, puede esperar que el sistema operativo administre de manera más o menos óptima el tiempo de ejecución de los subprocesos. Esto incluye, por ejemplo, Prevención de la inanición.