de estados de UML de la fi gura 23.1, el estado
terminado va seguido por el estado fi nal de UML (el símbolo de
viñeta) para indicar el fi nal de las transiciones de estado.
A nivel del sistema operativo, el estado
ejecutable de Java generalmente abarca dos estados separados (fi gura
23.2). El sistema operativo oculta estos estados de la Máquina Virtual de Java (JVM), la cual sólo ve el estado
ejecutable. 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
(es decir, empieza su ejecución)
cuando el sistema operativo lo asigna a un procesador; a esto también se le conoce como
despachar el subproce-
so
. En la mayoría de los sistemas operativos, a cada subproceso se le otorga una pequeña cantidad de tiempo del
procesador (lo cual se conoce como
quantum
o
intervalo de tiempo
) en la que debe realizar su tarea. (El proceso
de decidir qué tan grande debe ser el quantum de tiempo es un tema clave en los cursos de sistemas operativos).
Cuando expira su quantum, el subproceso regresa al estado
listo y el sistema operativo asigna otro subproceso al
procesador (vea la sección 23.3). Las transiciones entre los estados
listo y en ejecución las maneja únicamente el
sistema operativo. La JVM no “ve” las transiciones; simplemente ve el subproceso como
ejecutable y deja al sistema
operativo la decisión de cambiar el subproceso entre
listo y ejecutable. El proceso que utiliza un sistema operativo
para determinar qué subproceso debe despachar se conoce como
programación de subprocesos
, y depende de
las prioridades de los subprocesos (que veremos en la siguiente sección).
23.3 Prioridades y programación de subprocesos
Todo subproceso en Java tiene una
prioridad de subproceso
, la cual ayuda al sistema operativo a determinar el
orden en el que se programan los subprocesos. Las prioridades de Java varían entre
MIN_PRIORITY
(una constante
de 1) y
MAX_PRIORITY
(una constante de 10). 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ó.
De manera informal, los subprocesos de mayor prioridad son más importantes para un programa, y se les debe
asignar tiempo del procesador antes que a los subprocesos de menor prioridad. Sin embargo, las prioridades de
los subprocesos no garantizan el orden en el que se ejecutan los subprocesos.
[
Nota: las constantes (
MAX_PRIORITY
,
MIN_PRIORITY
y
NORM_PRIORITY
) se declaran en la clase
Thread
. Se
recomienda no crear y usar explícitamente objetos
Thread
para implementar la concurrencia, sino utilizar mejor
la interfaz
Executor
(que describiremos en la sección 23.4.2). La clase
Thread
contiene varios métodos
static
útiles, los cuales describiremos más adelante en este capítulo].
La mayoría de los sistemas operativos soportan los intervalos de tiempo (timeslicing), que permiten a los
subprocesos de igual prioridad compartir un procesador. Sin el intervalo de tiempo, cada subproceso en un con-
junto de subprocesos de igual prioridad se ejecuta hasta completarse (a menos que deje el estado
ejecutable y entre
al estado
en espera o en espera sincronizado, o lo interrumpa un subproceso de mayor prioridad) antes que otros
subprocesos de igual prioridad tengan oportunidad de ejecutarse. Con el intervalo de tiempo, aun si un subpro-
ceso no ha terminado de ejecutarse cuando expira su quantum, el procesador se quita del subproceso y pasa al
siguiente subproceso de igual prioridad, si hay uno disponible.
El
programador de subprocesos
de un sistema operativo determina cuál subproceso se debe ejecutar a
continuación. Una implementación simple del programador de subprocesos mantiene el subproceso de mayor
prioridad en
ejecución en todo momento y, si hay más de un subproceso de mayor prioridad, asegura que todos
esos subprocesos se ejecuten durante un quantum cada uno, en forma
cíclica (round-robin)
. En la fi gura 23.3
se muestra una
cola de prioridades multinivel
para los subprocesos. En la fi gura, suponiendo que hay una
computadora con un solo procesador, los subprocesos A y B se ejecutan cada uno durante un quantum, en forma
cíclica hasta que ambos subprocesos terminan su ejecución. Esto signifi ca que A obtiene un quantum de tiempo
Figura 23.2
| Vista interna del sistema operativo del estado ejecutable de Java.
ejecutable
ejecutable
expira quantum
el sistema operativo
despacha un subproceso
listo
23.3 Prioridades y programación de subprocesos
929
23_MAQ_CAP_23_DEITEL.indd929
4/19/081:33:36AM