¿Explicación de la terminología de programación?
Existen muchos términos en la industria del desarrollo de software, como subprocesos, grupos de subprocesos, etc. Hoy, echemos un vistazo a los términos de desarrollo que necesitamos conocer en los proyectos de desarrollo de software de programación Java.
¿Qué es un hilo?
El término "hilo" se puede utilizar para describir muchas cosas diferentes. En este artículo, lo usaré para referirme a un hilo lógico. Es decir: una serie de operaciones en orden lineal; Cada núcleo de la CPU sólo puede ejecutar realmente un hilo lógico al mismo tiempo. Esto trae un problema inherente: si el número de subprocesos es mayor que el número de núcleos, entonces algunos subprocesos deben pausarse para que otros subprocesos puedan ejecutar su trabajo, y cuando les toque ejecutar nuevamente, la tarea se reanudará. Para soportar la suspensión y reanudación, un hilo necesita al menos dos cosas:
Un puntero de instrucción de algún tipo. Es decir, cuando hago una pausa, ¿qué línea de código estoy ejecutando?
Una pila. Es decir, ¿cuál es mi estado actual? La pila contiene variables locales y punteros al montón donde se asignan las variables. Todos los hilos del mismo proceso comparten el mismo montón.
En vista de los dos puntos anteriores, el sistema tiene suficiente información al programar subprocesos en la CPU para pausar un subproceso, permitir que otros subprocesos se ejecuten y luego reanudar el subproceso original nuevamente. Esta operación suele ser completamente transparente para el hilo. Desde la perspectiva del hilo, se ejecuta continuamente. La forma en que un hilo se da cuenta de la reprogramación es midiendo el tiempo entre operaciones consecutivas.
JVM utiliza subprocesos del sistema operativo
Aunque la especificación no lo requiere, hasta donde yo sé, todas las JVM modernas de propósito general delegan el procesamiento de subprocesos a los subprocesos del sistema operativo de la plataforma. . En lo que sigue, usaré "hilo de espacio de usuario" para referirme a los subprocesos programados por el lenguaje, en lugar de los subprocesos programados por el kernel/SO. Los subprocesos implementados en el sistema operativo tienen dos propiedades que limitan en gran medida la cantidad de ellos que pueden existir; cualquier solución que asigne subprocesos de lenguaje y subprocesos del sistema operativo 1:1 no puede admitir la concurrencia a gran escala.
En la JVM, una pila de tamaño fijo
El uso de subprocesos del sistema operativo dará como resultado un costo de memoria grande y fijo para cada subproceso
Usado Otro problema importante con los subprocesos del sistema operativo es que cada subproceso del sistema operativo tiene una pila de tamaño fijo. Aunque este tamaño es configurable, en un entorno de 64 bits, la JVM asignará una pila de 1 M para cada subproceso. Puede configurar el espacio de pila predeterminado para que sea más pequeño, pero debe sopesar el uso de la memoria, ya que esto aumenta el riesgo de desbordamiento de la pila. Cuanta más recursividad haya en su código, más probabilidades tendrá de sufrir un desbordamiento de pila. Si mantiene los valores predeterminados, 1000 subprocesos utilizarán 1 GB de RAM. Aunque la RAM es mucho más barata ahora, casi nadie preparará terabytes de RAM para ejecutar millones de subprocesos.