utilizados - tipos primitivos java
Entendiendo los hilos nativos de java y el jvm (4)
Entiendo que el jvm es en sí mismo una aplicación que convierte el código de bytes del ejecutable java en un código de máquina nativo, pero cuando uso subprocesos nativos tengo algunas preguntas que parece que no puedo responder.
- ¿Cada hilo crea su propia instancia de jvm para manejar su ejecución particular?
- Si no es así, ¿el jvm debe tener alguna forma de programar qué subprocesos manejará a continuación? Si no, ¿no haría esto inutilizable la naturaleza de javas múltiples ya que solo se puede ejecutar un subproceso a la vez?
¿Cada hilo crea su propia instancia de jvm para manejar su ejecución particular?
No, su aplicación que se ejecuta en la JVM puede tener muchos subprocesos que existen dentro de esa instancia de la JVM.
Si no, entonces el jvm debe tener alguna forma de programar qué hilo manejará a continuación ...
Sí, la JVM tiene un programador de hilos. Hay muchos algoritmos diferentes para la programación de subprocesos, y el que se utiliza es dependiente del proveedor de JVM. (La Scheduling en general es un tema interesante).
... si es así, ¿no haría esto inútil la naturaleza de subprocesos múltiples de Java ya que solo se puede ejecutar un hilo a la vez?
No estoy seguro de entender esta parte de su pregunta. Este es el tipo de punto de roscado. Por lo general, tiene más subprocesos que CPU y desea ejecutar más de una cosa a la vez. El subprocesamiento le permite aprovechar al máximo su CPU asegurándose de que esté ocupado procesando un subproceso mientras que otro está esperando en I / O, o por algún otro motivo no está ocupado.
¿Cada hilo crea su propia instancia de jvm para manejar su ejecución particular?
No. Se ejecutan en la misma JVM para que (por ejemplo) puedan compartir objetos y atributos de clase.
Si no es así, ¿el jvm debe tener alguna forma de programar qué subprocesos manejará a continuación? Si no, ¿no haría esto inutilizable la naturaleza de javas múltiples ya que solo se puede ejecutar un subproceso a la vez?
Hay dos tipos de implementación de hilos en Java. Los subprocesos nativos se asignan a una abstracción de subprocesos que implementa el sistema operativo host. El sistema operativo se encarga de la programación de subprocesos nativos y la división del tiempo.
El segundo tipo de hilo es "hilos verdes". Estos son implementados y administrados por la propia JVM, con la JVM implementando la programación de subprocesos. Las implementaciones de subprocesos verdes de Java no han sido admitidas por las JVM de Sun / Oracle desde Java 1.2. (Ver Hilos verdes vs Hilos no verdes )
Los hilos de Java se asignan a los hilos del sistema operativo nativo. Tienen poco que ver con la propia JVM.
Un hilo de Java puede asignarse de uno a uno a un hilo del núcleo. Pero esto no debe ser así. Podría haber n hilos en el núcleo ejecutando m subprocesos java, donde m puede ser mucho más grande que n, y n debería ser más grande que el número de procesadores. La propia JVM inicia los subprocesos n del núcleo, y cada uno de ellos elige un subproceso java y lo ejecuta durante un tiempo, luego cambia a otro subproceso java. El sistema operativo selecciona hilos del kernel y los asigna a una CPU. Así que puede haber programación de subprocesos en varios niveles. Es posible que le interese consultar el lenguaje de programación GO, donde miles de "Goroutines" se ejecutan mediante docenas de subprocesos.