Número máximo de subprocesos que pueden ejecutarse simultáneamente en java en una CPU

Por favor me confundí sobre algo. Lo que sé es que el número máximo de subprocesos que pueden ejecutarse simultáneamente en una CPU normal de una computadora moderna varía de 8 a 16 subprocesos. Por otro lado, utilizando GPU, miles de subprocesos pueden ejecutarse simultáneamente sin que el progtwigdor interrumpa ningún subproceso para progtwigr otro. En varias publicaciones como: Máquina virtual de Java : número máximo de subprocesos https://community.oracle.com/message/10312772 personas declaran que ejecutan miles de subprocesos java simultáneamente en CPU normales. Cómo podría ser esto ?? ¿Y cómo puedo saber el número máximo de subprocesos que pueden ejecutarse simultáneamente para que mi código se ajuste de forma dinámica de acuerdo con la architecture subyacente?

Los subprocesos no están vinculados o limitados por el número de procesadores / núcleos disponibles. El progtwigdor del sistema operativo puede alternar entre cualquier número de subprocesos en una sola CPU. Este es el significado de “multitarea preventiva”.

Por supuesto, si tiene más subprocesos que núcleos, no todos los subprocesos se ejecutarán simultáneamente . Algunos estarán en espera, esperando un intervalo de tiempo.

En la práctica, el número de subprocesos que puede tener está limitado por el progtwigdor, pero ese número suele ser muy alto (miles o más). Variará de SO a SO y con versiones individuales.

En cuanto a la cantidad de subprocesos que son útiles desde el punto de vista del rendimiento, usted dijo que depende del número de procesadores disponibles y de si la tarea está vinculada a IO o CPU. Experimente para encontrar el número óptimo y hacerlo configurable si es posible.

Existe concurrencia de hardware y software. Los 8 a 16 subprocesos se refieren al hardware que tiene, es decir, una o más CPU con hardware para ejecutar de 8 a 16 subprocesos paralelos entre sí. Los miles de subprocesos se refieren a la cantidad de subprocesos de software, el progtwigdor tendrá que intercambiarlos para que cada subproceso de software obtenga su intervalo de tiempo para ejecutarse en el hardware.

Para obtener la cantidad de subprocesos de hardware, puede probar Runtime.availableProcessors() .

En cualquier momento, un procesador ejecutará el número de subprocesos igual al número de núcleos contenidos. Esto significa que en un sistema uniprocesador, solo se ejecuta un subproceso (o ningún subproceso) en un momento dado.

Sin embargo, los procesadores no ejecutan cada subproceso uno tras otro, sino que cambian entre varios subprocesos rápidamente para simular la ejecución simultánea. Si este no fuera el caso, y mucho menos crear múltiples subprocesos, ni siquiera podrá iniciar múltiples aplicaciones.

Una hebra java (en comparación con las instrucciones del procesador) es una abstracción de muy alto nivel de un conjunto de instrucciones para que la CPU las procese. Cuando llega al nivel del procesador, no hay garantía de que los subprocesos se ejecutarán en qué núcleo en un momento dado. Pero dado que los procesadores cambian rápidamente entre estos subprocesos, es teóricamente posible crear una cantidad infinita de subprocesos aunque a costa del rendimiento.

Si lo piensas bien, una computadora moderna tiene miles de subprocesos ejecutándose al mismo tiempo (combinando todas las aplicaciones), mientras que solo tiene 1 ~ 16 (caso típico) de núcleos. Sin este cambio de tarea, nunca se haría nada.

Si está optimizando su aplicación, debe considerar la cantidad de subprocesos que necesita por el trabajo en cuestión, y no por la architecture subyacente. Las ganancias de rendimiento del paralelismo deben ponderarse frente al aumento de los gastos generales de ejecución de subprocesos. Dado que cada máquina es diferente, cada entorno de tiempo de ejecución es diferente, no es práctico elaborar un recuento de hilos dorados (sin embargo, se puede realizar una estimación aproximada mediante la evaluación comparativa y la cantidad de núcleos).