984
Capítulo 23 Subprocesamiento múltiple
• El lenguaje de programación Ada, desarrollado por el Departamento de defensa de los Estados Unidos, hizo que
las primitivas de concurrencia estuvieran disponibles ampliamente para los contratistas de defensa dedicados a la
construcción de sistemas militares de comando y control.
• Java pone las primitivas de concurrencia a disposición del programador de aplicaciones, a través del lenguaje y de
las APIs. El programador especifi ca que una aplicación contiene subprocesos de ejecución separados, en donde cada
subproceso tiene su propia pila de llamadas a métodos y su propio contador, lo cual le permite ejecutarse concurren-
temente con otros subprocesos, al mismo tiempo que comparte los recursos a nivel de aplicación (como la memoria)
con estos otros subprocesos.
• Además de crear subprocesos para ejecutar un programa, la JVM también puede crear subprocesos para realizar
tareas de mantenimiento, como la recolección de basura.
Sección 23.2 Estados de los subprocesos: ciclo de vida de un subproceso
• En cualquier momento dado, se dice que un subproceso se encuentra en uno de varios estados de subproceso.
• Un nuevo subproceso empieza su ciclo cuando en el estado
nuevo. Permanece en este estado hasta que el programa
inicia el subproceso, con lo cual se coloca en el estado
ejecutable. Se considera que un subproceso en el estado ejecu-
table está ejecutando su tarea.
• Algunas veces, un subproceso
ejecutable cambia al estado en espera mientras espera a que otro subproceso realice una
tarea. Un subproceso
en espera regresa al estado ejecutable sólo cuando otro subproceso notifi ca al subproceso en
espera que puede continuar ejecutándose.
•
Un
subproceso
ejecutable puede entrar al estado en espera sincronizado durante un intervalo específi co de tiempo.
Regresa al estado
ejecutable cuando ese intervalo de tiempo expira, o cuando ocurre el evento que está esperando.
•
Un
subproceso
ejecutable puede cambiar el estado en espera sincronizado si proporciona un intervalo de espera opcio-
nal cuando está esperando a que otro subproceso realice una tarea. Dicho subproceso regresará al estado
ejecutable
cuando otro subproceso se lo notifi que o cuando expire el intervalo sincronizado.
• Un subproceso inactivo permanece en el estado
en espera sincronizado durante un periodo designado de tiempo,
después del cual regresa al estado
ejecutable.
•
Un
subproceso
ejecutable cambia al estado bloqueado cuando trata de realizar una tarea que no puede completarse
inmediatamente, y debe esperar temporalmente hasta que se complete esa tarea. Al estado
bloqueado cuando trata de
realizar una tarea que no puede completarse inmediatamente, y debe esperar temporalmente hasta que se complete
esa tarea. En ese punto, el subproceso bloqueado cambia al estado
ejecutable, para poder continuar su ejecución. Un
subproceso
bloqueado no puede usar un procesador, aun si hay uno disponible.
•
Un
subproceso
ejecutable entra al estado terminado cuando completa exitosamente su tarea, o termina de alguna otra
forma (tal vez debido a un error).
• A nivel del sistema operativo, el estado
ejecutable de Java generalmente abarca dos estados separados. Cuando un
subproceso cambia por primera vez al estado
ejecutable desde el estado nuevo, el subproceso se encuentra en el estado
listo. Un subproceso
listo entra al estado en ejecución cuando el sistema operativo lo asigna a un procesador; a esto
también se le conoce como despachar el subproceso.
• En la mayoría de los sistemas operativos, a cada subproceso se le otorga una pequeña cantidad de tiempo del pro-
cesador (lo cual se conoce como quantum o intervalo de tiempo) en la que debe realizar su tarea. Cuando expira su
quantum, el subproceso regresa al estado listo y el sistema operativo asigna otro subproceso al procesador.
• El proceso que utiliza un sistema operativo para determinar qué subproceso debe despachar se conoce como progra-
mación de subprocesos, y depende de las prioridades de los subprocesos.
Sección 23.3 Prioridades y programación de subprocesos
• Todo subproceso en Java tiene una prioridad de subproceso (de
MIN_PRIORITY
a
MAX_PRIORITY
), la cual ayuda al
sistema operativo a determinar el orden en el que se programan los subprocesos.
• De manera predeterminada, cada subproceso recibe la prioridad
NORM_PRIORITY
(una constante de 5). Cada nuevo
subproceso hereda la prioridad del subproceso que lo creó.
• La mayoría de los sistemas operativos permiten que los subprocesos con igual prioridad compartan un procesador
con intervalo de tiempo.
• El trabajo del programador de subprocesos de un sistema operativo es determinar cuál subproceso se debe ejecutar
a continuación.
• Cuando un subproceso de mayor prioridad entra al estado
listo, el sistema operativo generalmente sustituye el
subproceso actual en
ejecución para dar preferencia al subproceso de mayor prioridad (una operación conocida como
programación preferente).
23_MAQ_CAP_23_DEITEL.indd984
4/19/081:34:02AM