Documentos de Académico
Documentos de Profesional
Documentos de Cultura
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
,QWURGXFFLyQ
Sabemos que la CPU realiza ciertas actividades. En un sistema de tratamiento por
lotes (EDWFK), se ejecutan trabajos; en un entorno de tiempo compartido hay
programas de usuarios, o tareas; incluso en un ordenador personal, hoy da un
usuario puede ejecutar varios programas simultneamente, uno interactivo, y otros
en segundo plano (EDFNJURXQG. La cuestin es cmo llamar a todas estas
actividades que realiza la CPU. Pues bien, a estas actividades las denominaremos
SURFHVRV.
&RQFHSWRGH3URFHVR
Se han odo muchas definiciones de proceso, pero, sin duda, la ms popular y
acertada es la que dice que XQSURFHVRHVXQSURJUDPDHQHMHFXFLyQ.
Ya que no es nada fcil dar una definicin autoexplicativa de lo que es un proceso,
vamos a tratar de explicarlo mediante ideas y ejemplos. Ante todo, se debe tener
muy presente que un proceso asocia programa+actividad.
Cuando decimos que un proceso es un programa en ejecucin, nos referimos al
hecho de llevar a cabo o realizar las instrucciones que contiene el programa en el
orden establecido. Un programa es una lista de instrucciones escritas en un papel,
un fichero en disquete, disco duro, memoria RAM o cualquier otro soporte, pero el
simple hecho de que estas instrucciones estn escritas no implica que se estn
llevando a cabo. Pues bien, cuando se leen estas instrucciones y se hacen ejecutar,
entonces ya tenemos programa+actividad, es decir, un proceso.
Hacemos hincapi en DFWLYLGDG para diferenciarlo bien de un mero programa, ya que
una caracterstica bsica de los programas es que son estticos. Ya hemos dicho
que un programa es una secuencia de rdenes que, por mucho que la miremos, no
vara nunca. Las variables no tienen valores, las rutinas no tienen direccin, las
condiciones estn sin evaluar. Un programa es simplemente XQ DOJRULWPR D
HMHFXWDU
En cambio, un proceso es dinmico. Tiene vector de estado indicando el momento y
estado de su ejecucin, las variables tienen valores, las rutinas se encuentran en
alguna direccin de memoria, y las condiciones son evaluables. El proceso es OD
HMHFXFLyQGHODOJRULWPR
Un ejemplo que puede describir la relacin programa-proceso puede ser el manual
de montaje de un aeromodelo que viene despiezado. Las instrucciones de montaje
que vienen en la caja son algo esttico (por eso aunque dejemos mucho tiempo las
instrucciones en la caja, el aeromodelo no aparece construido al cabo de un tiempo.
Sin embargo, cuando cogemos las instrucciones y empezamos a hacer lo que
indican, es cuando empieza la actividad, entonces comienza el SURFHVR de montaje.
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
&RQFHSWRGH3URFHVR
,QWURGXFFLyQ
4XpHVXQ3URFHVR"
(VXQ3URJUDPDHQ(MHFXFLyQ
8Q3URJUDPD (VHVWiWLFR1RYDUtDQDGD
1RWLHQHYHFWRUGHHVWDGR
9DULDEOHVVLQYDORUHV
1RUHTXLHUH
SURFHVDGRU
5XWLQDVVLQGLUHFFLyQ
&RQGLFLRQHVVLQHYDOXDU
(VHODOJRULWPRDHMHFXWDU
8Q3URFHVR
(VGLQiPLFR
1HFHVLWD
SURFHVDGRU
/DVYDULDEOHVWLHQHQYDORUHV
7LHQHYHFWRUGHHVWDGR
/DVUXWLQDVHVWiQHQDOJXQDGLUHFFLyQ
/DVFRQGLFLRQHVVHSXHGHQHYDOXDU
(VODHMHFXFLyQGHODOJRULWPR
352&(62
(VWDGR
6H
QHFHVLWD
6LVWHPDV2SHUDWLYRV,
$SXQWHVGH62,
3URJUDPD
3URFHVDGRU
8Q&3
8QiUHDGHWUDEDMR
(VWDGR
SRUSURFHVR
*HVWLyQGH3URFHVRV
*HVWLyQGH3URFHVRV
'HVFULSWRUGH3URFHVR
Como ya sabemos, en un sistema multiprogramado se pueden ejecutar
simultneamente varios programas, es decir, en un momento dado puede haber
varios procesos. En un sistema con un nico procesador no se puede decir que
haya varios programas ejecutndose estrictamente de una forma simultnea. En
realidad, la posesin del procesador se va repartiendo entre los distintos procesos,
dando lugar a una ejecucin pseudoparalela. No obstante, por simplicidad, nos
referiremos, en general, a ejecucin simultnea o paralela, tanto si es estricta
(sistema multiprocesador) como si no lo es (con un solo procesador).
El FRQWH[WR de un proceso se define como la informacin necesaria para especificar
completamente su estado actual. Esto incluye toda la informacin que ha de
salvarse cuando un proceso pierde la posesin de la CPU, y hay que restaurar
cuando se le vuelve a conceder la posesin del procesador.
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
'HVFULSWRUGH3URFHVR
,QWURGXFFLyQ
&yPR9HHO62DORV3URFHVRV"
0HGLDQWHVXYHFWRUGHHVWDGRHQXQ
'HVFULSWRUGH3URFHVR
(O'HVFULSWRUGH3URFHVRFRQWLHQHLQIRUPDFLyQ
GHO3URFHVR
GHVX0HPRULD
GH(VWDGRGHO3URFHVDGRU5HJLVWURV
&RQWH[WR
GHOSURFHVR
W\SH DESCRIPTOR_PROCESO LV
UHFRUG
Id_Proceso
Siguiente
Estado
Puntero_Pila
Memoria_Utilizada
Ficheros_Abiertos
Proceso_Padre
Procesos_Hijos
Dormido_Hasta
HQGUHFRUG;
6LVWHPDV2SHUDWLYRV,
*HVWLyQGH3URFHVRV
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
6LVWHPDV0XOWLSURFHVR3DUDOHOLVPR
En la Introduccin ya se vio, por encima, la utilidad de ejecutar varios programas de
forma simultnea para evitar el desaprovechamiento de los tiempos de espera de
CPU a las respuestas de los dispositivos perifricos en las operaciones de
entrada/salida que realiza un proceso.
Otra justificacin de la ejecucin paralela de programas viene dada por las leyes de
la fsica, pues segn la Teora de la Relatividad de Albert Einstein es imposible
transmitir seales elctricas a ms velocidad que la de la luz, esto es, unos 30cm
por nanosegundo. Esto quiere decir que el tiempo mnimo que puede tardar en
transmitirse una seal entre dos componentes de un ordenador separados 30cm es
1ns. O sea, que los ordenadores tendran que empezar a fabricarse cada vez ms
pequeos, pero claramente, sabemos que esto tiene ciertas limitaciones. Por otra
parte, algunos programas (clculo cientfico, tiempo real, etc.) requieren, a menudo,
ciertas velocidades de ejecucin, para que el resultado sea exitoso. Una forma de
conseguir que un programa se ejecute ms rpidamente que ejecutando una
instruccin tras otra, consiste en dividir el programa en varias tareas o procesos y
ejecutndolos en paralelo. Un smil de la vida real puede ser el proceso de
fabricacin de los automviles. Las cadenas de montaje de los coches no fabrican
primero las ruedas, luego el motor, a continuacin el chasis, despus la carrocera,
luego los cristales, ...; sino que cada uno de estos elementos se fabrica por
separado de forma paralela y simultnea, y cuando estn todos construidos, se
realiza el proceso de ensamblaje para formar el automvil completo. De esta forma
se consigue construirlo en bastante menos tiempo.
Ya tenemos, por tanto, dos buenas razones para la multiprogramacin:
Los procesos cooperantes, para realizar un trabajo en conjunto.
Mejorar el rendimiento del ordenador, aprovechando la CPU en sus tiempos de
espera por dispositivos de E/S, dando lugar a sistemas multiusuario o
simplemente de multiproceso.
No debemos confundir un sistema PXOWLSURFHVR con PXOWLXVXDULR. Un entorno
multiproceso es el que permite varios procesos simultneos, por ejemplo, una
persona en un terminal con ventanas tal que en cada ventana tiene distintos
procesos en ejecucin (un editor de texto, un reloj, un videoclip, etc.). En este
sistema es posible que no haya ms puestos de trabajo o terminales, con lo que
sera un entorno multiproceso monousuario. Si se dispone de varios terminales en
un sistema, entonces, adems de multiproceso, es multiusuario.
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
6LVWHPDV0XOWLSURFHVR3DUDOHOLVPR
3UREOHPDVGHO3URFHVDPLHQWR6HFXHQFLDO
/DVOH\HVGHODItVLFD
LPSRQHQOLPLWDFLRQHV
GHYHORFLGDG
1RVHDSURYHFKD
OD&38
62/8&,1
352&(6$0,(1723$5$/(/2RVHXGRSDUDOHOR
08/7,352*5$0$&,1
3URFHVRV
&RRSHUDQWHV
0XOWLSOH[DFLyQGHOD
&38HQWUHSURFHVRV
FRQFXUUHQWHV
FRRSHUDQWHVRQR
0XOWLSURFHVR0XOWLXVXDULR
6LVWHPDV2SHUDWLYRV,
*HVWLyQGH3URFHVRV
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
6LVWHPDV0XOWLSURFHVDGRU0RQRSURFHVDGRU
0XOWLSOH[DFLyQGHOD&38
Sabemos que para que un programa se ejecute, hay que convertirlo en proceso, y
para que ste evolucione de un estado a otro se requiere un procesador. Si
hablamos de sistemas multiproceso, es decir, que hay varios programas
simultneamente en memoria, lo ms conveniente para la ejecucin ms rpida es
asignar un procesador a cada uno de los procesos, para que evolucionen todos de
una forma realmente paralela o simultnea. Este es el caso de los ordenadores con
mltiples procesadores, en los que en un momento dado se encuentran realmente
en ejecucin varios programas. Si bien esta es la forma ms rpida de ejecutar
mltiples programas, tambin resulta ser, obviamente, la ms cara. No solamente
por la cantidad de hardware utilizado (cuando menos, varias CPUs), sino tambin
por el hardware y software adicional necesario para poder sincronizar y gestionar
mltiples CPUs, algo mucho ms complejo que cuando solamente se dispone de un
nico procesador. (Resultan mucho ms sencillos los departamentos de personal,
marketing, fabricacin, distribucin etc. de una empresa de 2, 3 o 4 empleados, que
los de una multinacional de miles de empleados).
Ya que la mayora de los ordenadores actuales de propsito general constan de un
slo procesador, vamos a centrarnos aqu en los ordenadores monoprocesadores,
dejando los de mltiples procesadores para otras asignaturas de arquitecturas
avanzadas.
Si tenemos un sistema operativo multiproceso y contamos con un nico procesador,
solamente tenemos una eleccin: +D\TXHUHSDUWLUHOSURFHVDGRUHQWUHORVSURFHVRV.
De esta manera, lo que conseguimos es simular una mquina multiprocesador, es
decir, tendremos un pseudoparalelismo en la ejecucin de los procesos. As, aunque
no obtengamos todas las ventajas de una ejecucin puramente paralela, s
aprovecharemos el hecho de que durante la ejecucin de un programa hay muchos
momentos en que no se puede continuar su ejecucin hasta que no se produzca
algn evento externo a la CPU, como por ejemplo la realizacin de una operacin
solicitada a un dispositivo de E/S, la pulsacin de un carcter en el teclado, la
llegada de un carcter por la lnea de comunicaciones, una interrupcin generada
por un detector, etc.
Quizs nos puedan servir como ejemplo las partidas de ajedrez simultneas que
mantienen los maestros de ajedrez con 20 principiantes. Cuando el maestro realiza
una jugada con un principiante, ste tarda mucho tiempo hasta que decide mover;
mientras tanto, el maestro puede realizar jugadas con el resto de los aprendices, y
seguramente, le dar tiempo a hacer un movimiento con cada uno de los rivales
antes de que el primero de ellos se haya decidido a mover una figura.
En este ejemplo tan optimista, esta partida simultnea se realiza en 1/20 del tiempo
que se tardara si el maestro primero se dedicase por entero a jugar una partida con
el primer aficionado, hasta finalizarla; luego comenzar otra partida con el segundo y
as sucesivamente hasta haber jugado las 20 partidas. En los casos reales de
nuestros ordenadores, el reparto de la CPU no suele resultar tan provechoso como
en el caso del maestro de ajedrez, pues a menudo, tambin hay procesos a los que
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
6LVWHPDV0XOWLSURFHVR
0iTXLQD0XOWLSURFHVDGRU
8Q3URFHVR
8Q3URFHVDGRU
0iTXLQD0RQRSURFHVDGRU
+D\TXHVLPXODUXQDPiTXLQDPXOWLSURFHVDGRU
6HXGRSDUDOHOLVPR
+D\TXHUHSDUWLUHOSURFHVDGRU
HQWUHORVSURFHVRV
3URFHVR
3URFHVR
3URFHVR
0XOWLSURFHVDGRU
0RQRSURFHVDGRUPXOWLSOH[DGR
3URFHVRHQHMHFXFLyQ
3URFHVRHQHVSHUD
6LVWHPDV2SHUDWLYRV,
*HVWLyQGH3URFHVRV
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
se les quita la posesin de la CPU antes de que ellos la liberen por una de sus
esperas a un evento externo, por lo que nos encontramos con procesos que estn
parados cuando s podran ejecutarse de tener una CPU disponible. En el peor de
los casos, es decir cuando se disponga de varios procesos que no tienen esperas
de E/S, la diferencia entre ejecutarlos en un entorno multiprocesador o
monoprocesador es la que se muestra en el grfico de la Figura 5, en la que se
aprecia que la CPU se reparte en porciones de tiempo entre los distintos procesos,
por lo que mientras uno se ejecuta, los dems deben esperar su turno de CPU. En
este caso decimos que la utilizacin de la CPU est PXOWLSOH[DGDHQHOWLHPSR.
(VWDGRV\7UDQVLFLRQHVGHORV3URFHVRV
Anteriormente hemos visto que un ejemplo del FLFORGHYLGD de un proceso podra
estar caracterizado por esta secuencia:
1. Se est ejecutando (posee la CPU).
2. Realiza una operacin de E/S y se pone a esperar la respuesta (abandona la
CPU).
3. Cuando recibe la respuesta de la operacin de E/S desea continuar la
ejecucin (necesita otra vez la CPU).
Tambin hemos visto con anterioridad que en otras ocasiones, el tiempo de CPU se
reparte en porciones entre todos los procesos que lo solicitan, por lo que un proceso
puede ver cmo pierde la posesin del procesador, de forma involuntaria, cuando se
le acaba la porcin de tiempo que tena asignada.
Este ciclo de vida de un proceso lo podemos ver en la Figura 6. En esta figura, los
crculos son recursos o condiciones deseadas por un proceso, mientras que los
rectngulos representan las colas de procesos que esperan por tales recursos. As,
vemos que un proceso recin creado inmediatamente quiere ejecutarse, para lo cual
necesita la CPU, por lo que pasa a la cola de los procesos que esperan por el
procesador (cola de procesos SUHSDUDGRV). Una vez que le llega el turno, ejecuta
las instrucciones, hasta que por uno de los motivos mencionados (operacin de E/S,
fin de la porcin de tiempo, etc.) pierde la posesin de la CPU y pasa a la cola del
recurso solicitado (Disco 1, Unidad de Cinta 3, esperar a las 2:00 de la maana). Si
la posesin del procesador se ha perdido por finalizar la porcin de tiempo asignado
o bien porque un proceso de mayor prioridad requiere el procesador, el recurso que
necesita el proceso expulsado (o expropiado) es la propia CPU, por lo que pasa a la
cola correspondiente (la de los procesos preparados).
Este ciclo se repite una y otra vez hasta que el proceso ejecuta su ltima instruccin,
o sea, que finaliza el trabajo, con lo que voluntariamente cede el control de la CPU y
da por concluida su existencia como proceso.
As, llegamos ya al diagrama bsico de estados de un proceso, que lo vemos
representado en la parte superior de la Figura 7. En l tenemos que un proceso est
ejecutando instrucciones ((Q (MHFXFLyQ), esperando a que le concedan la CPU
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
&LFORGH9LGDGHXQSURFHVR
6LVWHPDV0XOWLSURFHVR
&UHDFLyQ
35(3$5$'2
&38
7HUPLQDFLyQ
load
store
add
store
read fichero
(VSHUD(6
store
increment
write fichero
(VSHUD(6
load
store
add
store
read fichero
(VSHUD(6
([SXOVLyQ
3HULRGR
&38
3HULRGR
(6
'LVFR
',6&2
3HULRGR
&38
3HULRGR
(6
(VOD
KRUD
'RUPLGRKDVWD
ODV
3HULRGR
&38
&LQWD
&,17$
3HULRGR
(6
6LVWHPDV2SHUDWLYRV,
*HVWLyQGH3URFHVRV
Vamos a ver cmo se producen las transiciones entre estos tres estados.
&UHDFLyQ3UHSDUDGR
Inicialmente, al crear un proceso, no puede pasar directamente al estado de
Espera, pues no se ha ejecutado ninguna instruccin que as se lo indique; por
lo tanto, expresa su necesidad de ejecucin entrando en la cola de procesos
Preparados.
3UHSDUDGR(Q(MHFXFLyQ
Una vez que el proceso est preparado, solamente tiene que esperar a que le
llegue el turno. Los turnos del procesador se establecen en funcin de la
poltica de planificacin de la CPU. Cuando le llegue el turno tomar posesin
del procesador y empezar a ejecutar instrucciones.
Como podemos ver en el grfico, desde el estado de Ejecucin se puede pasar
a cualquiera de los otros dos estados (Espera y Preparado).
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
(VWDGRVGHO3URFHVR
6LVWHPDV0XOWLSURFHVR
(Q
(MHFXFLyQ
&UHDFLyQ
3UHSDUDGR
7HUPLQDFLyQ
(Q
(VSHUD
: ID_PROCESOS := 0;
end record;
: COLA_PROCESOS;
(QB(VSHUD
: COLA_PROCESOS;
6LVWHPDV2SHUDWLYRV,
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
*HVWLyQGH3URFHVRV
(Q(MHFXFLyQ3UHSDUDGR
Pasar a Preparado si abandona la CPU involuntariamente, es decir si se le
expulsa (o expropia), bien porque haya terminado su porcin de tiempo, o
porque haya pasado a Preparado otro proceso de mayor prioridad.
(Q(MHFXFLyQ(VSHUD
En cambio, pasa al estado de Espera si cede voluntariamente el procesador,
por tener que esperar a que se produzca un evento externo a la CPU.
(VSHUD3UHSDUDGR
Desde el estado de Espera no se puede volver directamente a Ejecucin, sino
que cuando se haya cumplido el evento externo, para recuperar la posesin del
procesador hay que pasar de nuevo por la cola de los procesos preparados.
As tenemos que para conseguir la posesin de la CPU siempre hay que pasar
por su cola correspondiente (como un recurso ms que es).
(Q(MHFXFLyQ7HUPLQDFLyQ
Como ya hemos dicho antes, el proceso termina cuando ejecuta su ltima
instruccin, luego siempre pasar al estado de Terminado desde Ejecucin.
Vistos los estados que puede tener un proceso y las transiciones entre ellos, nos
interesa saber FyPR HO VLVWHPD RSHUDWLYR OOHYD FRQWURO GH WRGRV ORV SURFHVRV
FUHDGRV, cmo se realizan estas colas de procesos y cmo se sabe qu proceso
est en ejecucin.
En un apartado anterior hemos visto que hay una estructura de datos que contiene
toda la informacin de control que requiere el sistema operativo para ocuparse de la
gestin o administracin del proceso. Nos estamos refiriendo al Descriptor de
Proceso o Bloque de Control de Proceso (BCP). Pues bien, entonces lo que el
sistema operativo necesita es mantener la coleccin de todos los BCPs de los
procesos existentes en cada momento. Esta coleccin de BCPs se puede organizar
de distintas maneras: mediante una cola esttica, con una cola dinmica, o
simplemente utilizando una tabla, es decir, un vector o array de BCPs. As vemos
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
(VWDGRVGHO3URFHVR
6LVWHPDV0XOWLSURFHVR
(1B(-(&8&,1
35(3$5$'26
%&3
%&3
%&3
%&3
3ULPHUR
OWLPR
'LVFR
3ULPHUR
OWLPR
&LQWD
%&3
3ULPHUR
OWLPR
%&3
7HUPLQDO
3ULPHUR
OWLPR
7DEOD
GH%&3V
6LVWHPDV2SHUDWLYRV,
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
*HVWLyQGH3URFHVRV
&DPELRGH3URFHVRHQ(MHFXFLyQ&DPELRGH&RQWH[WR
Cuando un proceso en ejecucin pierde la posesin de la CPU, se debe a uno de
los siguientes motivos:
Llamada al sistema
Interrupcin
Fin del proceso
Est claro que ante ciertas llamadas al sistema (una peticin de E/S, dormir, etc.) el
proceso en cuestin queda bloqueado, sin poder continuar la ejecucin de
instrucciones, hasta que se atienda el servicio solicitado; por esto, cede la posesin
del procesador para que pueda ejecutar instrucciones otro proceso que est
preparado.
Tambin puede ocurrir que una interrupcin anuncie el final de la actual posesin
del procesador. Esto ser as si la interrupcin es la generada por el reloj del
sistema y se detecta que se ha consumido la porcin de tiempo asignada (en un
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
6LVWHPDV0XOWLSURFHVR
&DPELRGH3URFHVR
HQHMHFXFLyQ
+//$0$'$$/6,67(0$
0RWLYRV
+,17(5583&,1
GHO&DPELR
3HWLFLyQGH(6
'RUPLU
)LQGHODURGDMDGHWLHPSR
6HSUHSDUDXQSURFHVRGH
PD\RUSULRULGDG
+),1'(/352&(62
&DPELRHQ'RV)DVHV
6HOHFFLRQDUHO6LJXLHQWH3URFHVR
3/$1,),&$'25
&DPELDUHO&RQWH[WRGH(MHFXFLyQ
',63$7&+(5
(O&DPELRGH3URFHVR&RQVXPH7LHPSR
0LQLPL]DUORV&DPELRVGH3URFHVRV
6LVWHPDV2SHUDWLYRV,
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
*HVWLyQGH3URFHVRV
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
(O3ODQLILFDGRU
&DPELRGH3URFHVR
6HOHFFLRQDHO6LJXLHQWH3URFHVRD(MHFXWDU
6HJ~QOD3ROtWLFDGH3ODQLILFDFLyQ
12(;38/625(6
(;38/625(6
3),)2
3(OPiVFRUWRHOSULPHUR
33ULRULGDGHV
35RXQG5RELQ
33ULRULGDGHV
),1'(/$52'$-$
'(7,(032
6LVWHPDV2SHUDWLYRV,
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
*HVWLyQGH3URFHVRV
Se salvan todos los registros del procesador en la Pila del proceso actualmente
en ejecucin (el A). A excepcin del REGISTRO DE ESTADO (RE), CONTADOR
DE PROGRAMA (CP) y PUNTERO DE PILA (PP).
Tras decidir que el proceso en ejecucin debe abandonar la CPU, el Planificador
elige el proceso que pasar a Ejecucin, al que nos referiremos como Proceso
B.
Se llama al 'LVSDWFKHU y comienza el cambio de contexto. Se producen las
siguientes acciones:
1. El Puntero de Pila del proceso A se guarda en su Descriptor de Proceso.
2. Se carga el Puntero de Pila a partir del PP guardado en el Descriptor del
Proceso B. Ahora la Pila de trabajo es la del proceso B
3. Se cargan todos los registros generales del procesador a partir de los datos
contenidos en la Pila, a excepcin del RE, el CP y el PP.
4. El valor que queda en la cima de la Pila es la direccin de vuelta del ltimo
punto en el que se llam al Dispatcher cuando el proceso B perdi el control de
la CPU.
5. Se actualiza la variable En_Ejecucin con Proceso_Seleccionado.
6. El Dispatcher termina. Al ejecutar la instruccin de RETORNO DE SUBRUTINA,
se devuelve el control al punto en el que se haba llamado al Dispatcher para
que el proceso B perdiese el control del procesador.
7. El sistema operativo termina de realizar el servicio que el Proceso B le haba
solicitado, por lo que ejecuta la instruccin mquina RETORNO DE
INTERRUPCIN. Esta instruccin origina que se cargue el REGISTRO DE
ESTADO y el CONTADOR DE PROGRAMA con los dos datos que se sacan de la
cima de la Pila.
8. Con el nuevo CONTADOR DE PROGRAMA, la instruccin que se ejecuta es la
siguiente al punto en el que el proceso B realiz una Llamada al Sistema (lo
que supuso su paso a Espera).
Ya hemos visto que el cambio de CPU de un proceso a otro requiere una serie de
acciones que se encargan de realizarlas el Planificador y el 'LVSDWFKHU. Pues bien,
estas acciones se ejecutan en un tiempo que, desde luego, no es nulo. La eleccin
del proceso a ejecutar suele ser muy simple y no supone una prdida de tiempo
considerable; pero el cambio de contexto s puede acarrear una gran cantidad de
instrucciones, incluidas operaciones de E/S si los contextos de memoria de los
procesos que intervienen hay que salvarlos y traerlos, respectivamente, del disco
duro, cosa que suele realizarse en los actuales sistemas con Memoria Virtual.
No es deseable, en absoluto, que el tiempo dedicado al cambio de proceso sea
considerable. Pensemos en un caso exagerado : si el 20% de las instrucciones
ejecutadas en la CPU son las dedicadas a realizar el cambio de ejecucin de dos
procesos, esto quiere decir que a las instrucciones de los programas del usuario
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
( O' L V S D W F K H U
& D P E LR G H 3 U R F H V R
( V H O( Q F D U J D G R G H & H G H U
H O& R Q W U R OG H OD & 3 8 D O3 U R F H V R
6 H OH F F LR Q D G R S R U H O3 OD Q L I LF D G R U
6 X V $ F F L R Q H V % i V L F D V 6 R Q
7 H U P LQ D U G H V D OY D U H OF R Q W H [ W R G H O
3 U R F H V R $ F W X D OP H Q W H H Q ( M H F X F L y Q
( V W D E OH F H U H O3 X Q W H U R G H 3 LOD G H O 1 X H Y R
3 U R F H V R T X H 3 D V D D ( M H F X F Ly Q
5 H V W D X U D U OR V 5 H J L V W U R V G H OD & 3 8 D
3 D U W L U G H OD 1 X H Y D 3 L OD H [ F H S W R & 3 \ 5 (
57(
5 H V W D X U D 5 (
P R G R X V X D U L R
5 H V W D X U D & 3
6 LV W H P D V 2 S H U D W LY R V ,
* H V W Ly Q G H 3 U R F H V R V
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
&DPELRGH3URFHVR
6LVWHPDV0XOWLSURFHVR
352&(62
$
HQHMHFXFLyQ
6,67(0$
23(5$7,92
S
int. o
352&(62
%
all
ys_c
SUHSDUDGR
6DOYDU
5HJLVWURV3B$
HQHVSHUD
6HOHFFLRQDU
3URFHVR
&DUJDU
5HJLVWURV3B%
HQHMHFXFLyQ
SUHSDUDGR
int. o
S
ys_ca
ll
6DOYDU
5HJLVWURV3B%
HQHVSHUDR
SUHSDUDGR
6HOHFFLRQDU
3URFHVR
&DUJDU
5HJLVWURV3B$
HQHMHFXFLyQ
6LVWHPDV2SHUDWLYRV,
*HVWLyQGH3URFHVRV
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
3URFHVR2FLRVR
Veamos ahora una situacin, a primera vista comprometida, que se puede dar en un
sistema multiproceso. Sabemos que cuando un proceso cede voluntariamente el
control de la CPU, el Planificador tiene que elegir otro proceso de usuario que est
preparado, pero
Qu pasa si no hay ningn proceso Preparado?
Si no hay ningn proceso que quiera ejecutar instrucciones qu hace la CPU?
Esta situacin no solamente es perfectamente posible, sino que se da con mucha
frecuencia. En un sistema con cinco usuarios qu impide que en un instante
determinado cuatro de los procesos estn esperando una respuesta del disco duro,
la llegada de un carcter por una lnea de comunicaciones, o que llegue una hora
determinada? La respuesta es: nada. Pues si en este momento el proceso del
quinto usuario tambin realiza una peticin a un dispositivo de E/S, tambin pasa a
Espera. En este momento el Planificador tendra que seleccionar un proceso de la
cola de Preparados, para darle el control, pero ya no hay ms procesos! qu va a
hacer la CPU mientras todos los procesos estn en Espera?
Hemos mencionado solamente los procesos de usuario, pero tambin hay procesos
del sistema operativo que pueden estar realizando servicios que se les haya
solicitado con anterioridad, por ejemplo, imprimiendo un fichero. De cualquier forma,
tampoco hay nada que impida que en un momento dado no haya ningn proceso
con necesidad de ejecutar instrucciones.
Para estos casos, en todos los sistemas suele haber un proceso del sistema
denominado 3URFHVR2FLRVR. Este proceso consta de un bucle infinito ejecutando
un algoritmo muy sencillo (puede ser incluso la instruccin 1R2SHUDFLyQ) en el que
no figura ninguna instruccin que pueda generar un paso a Espera. El proceso
ocioso puede estar continuamente realizando estudios estadsticos de utilizacin del
sistema, calculando decimales del numero , o cualquier trabajo infinito de la menor
prioridad. De esta forma, siempre tendremos un proceso Activo.
Diremos que la CPU est ociosa cuando est ejecutando el Proceso Ocioso.
Los procesadores suelen disponer de la instruccin HALT (o WAIT), la cual hace
que se detenga la ejecucin de instrucciones en la CPU, es decir, se deja de extraer
instrucciones de la memoria, y la CPU pasa al estado 'HWHQLGR, en el que
permanece hasta que se produce una interrupcin, pues en ese momento el
procesador la atiende y comienza a ejecutar las instrucciones de su rutina de
tratamiento.
3ODQLILFDFLyQGH3URFHVRV
Habiendo visto el ciclo de vida de los procesos, sabemos que un proceso que se
est ejecutando, eventualmente, por diversos motivos que se han comentado,
abandona la posesin del procesador voluntaria o involuntariamente, por lo que hay
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
que cederle la CPU a un proceso que sea lgicamente ejecutable, es decir, que est
Preparado. Si hay ms de un proceso Preparado, el sistema operativo debe decidir
cul de ellos se ejecutar primero. La parte del sistema operativo que le
corresponde tomar tal decisin es el 3ODQLILFDGRU, que seleccionar un proceso
basado en una poltica o algoritmo de planificacin.
El estado de Preparado se implementa como una cola de procesos dispuestos a
ejecutar instrucciones con ayuda de la CPU. Ahora bien, debemos a aclarar que
esta cola no tiene por que ser una cola FIFO (Primero en Entrar, Primero en Salir),
tambin podra ser una cola ordenada por prioridades, un rbol o, simplemente, una
lista desordenada. El Planificador debe seleccionar uno de los procesos de la lista,
pero no basndose necesariamente en la propia estructura de la lista. La estructura
de la lista nicamente debe ayudar al Planificador a aplicar el algoritmo de
planificacin.
&ULWHULRV
Antes de ver algoritmos concretos de planificacin debemos recordar, que la
eleccin que el Planificador va a realizar debe hacerse persiguiendo el bien del
sistema, pues es uno de los cometidos del sistema operativo. No obstante, distintas
polticas de planificacin tienen diferentes propiedades, y favorecen ms a un tipo
de procesos que a otros. Antes de elegir el algoritmo a utilizar en una situacin
concreta, debemos considerar las propiedades de varios algoritmos.
Se han sugerido muchos criterios para comparar algoritmos de planificacin de
CPU. Decidir las caractersticas que se van a utilizar en la comparacin es
fundamental para la eleccin del algoritmo ms apropiado. Veamos los criterios de
comparacin ms comnmente utilizados:
-XVWLFLD. Cada proceso debe conseguir su porcin correspondiente de CPU en
un tiempo finito.
(ILFLHQFLD. Se debe intentar mantener la CPU ocupada el mayor tiempo posible.
Al decir ocupada queremos decir ejecutando cualquier proceso que no sea el
Proceso Ocioso. En un sistema real, el porcentaje de utilizacin de CPU suele
estar en el rango 40-90%. Una utilizacin mayor del 90% significara que el
Planificador siempre encuentra procesos en la cola Preparados, o sea, que dicha
cola suele contener un nmero considerable de procesos. En un sistema
interactivo, esto puede suponer que los usuarios quizs se estn impacientando
por obtener las respuestas.
7LHPSRGH5HWRUQR (WXUQDURXQGWLPH). Desde el punto de vista de un proceso, el
criterio ms importante es cunto tiempo se va a necesitar para ejecutarse
completamente. El Tiempo de Retorno es la suma de los periodos que se pasan
esperando a cargarse en memoria, esperando en la cola de Preparados,
ejecutndose en la CPU, y esperando por operaciones de E/S. As pues, se debe
minimizar el tiempo de retorno de un proceso. Afecta principalmente a los
procesos EDWFK.
7LHPSRGH(VSHUD El algoritmo de planificacin de CPU no afecta a la cantidad
de tiempo que un proceso se pasa realizando operaciones de E/S, solamente
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
6LVWHPDV0XOWLSURFHVR
3ODQLILFDFLyQGH3URFHVRV
(O3ODQLILFDGRUVH(QFDUJDGH6HOHFFLRQDU
HO3URFHVRTXH3DVDD(MHFXFLyQ
\'HFLGH6HJ~QXQD3ROtWLFD
%DVDGDHQ$OJXQRV&ULWHULRV
-XVWLFLD
7LHPSRGH5HVSXHVWD
(ILFLHQFLD
7LHPSRGH(VSHUD
7LHPSRGH5HWRUQR
5HQGLPLHQWR
3ROtWLFDVGH3ODQLILFDFLyQ
1R([SXOVRUDV
EDWFK
3(O3ULPHURHQ/OHJDU
3(O0iV&RUWR3ULPHUR
33RU3ULRULGDGHV
([SXOVRUDV
PXOWLXVXDULR\
WLHPSRUHDO
37LHPSR&RPSDUWLGR
5RXQG5RELQ
33RU3ULRULGDGHV
30~OWLSOHV&RODV
30~OWLSOHV&RODV
5HDOLPHQWDGDV
6LVWHPDV2SHUDWLYRV,
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
*HVWLyQGH3URFHVRV
3ROtWLFDVGH3ODQLILFDFLyQ
En los diagramas de estados de los procesos, vimos que cuando un proceso en
Ejecucin abandona tal estado pasa a Espera o a Preparado, dependiendo si deja el
procesador voluntaria o involuntariamente. Si los procesos de un sistema nunca
dejan la CPU de forma involuntaria, se dice que la poltica de planificacin de CPU
es QRH[SXOVRUD o no expropiativa (QRQSUHHPSWLYHVFKHGXOLQJ). Por el contrario, si
pueden perder la posesin del procesador sin solicitarlo, nos encontramos con una
planificacin H[SXOVRUD o expropiativa (SUHHPSWLYHVFKHGXOLQJ).
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
3ROtWLFDVGH3ODQLILFDFLyQ
6LVWHPDV0XOWLSURFHVR
(O3ULPHURHQ/OHJDU3ULPHURHQ6HUYLU
J(VVLPSOH
L7LHPSRGHHVSHUDYDULDEOH5DUDPHQWHHOPtQLPR
L'HVDSURYHFKDORVGLVSRVLWLYRVGH(6
7UDEDMR
7LHPSRQHFHVDULR
7UDEDMR
7U 7U
(O0iV&RUWRHO3ULPHUR
J2IUHFHVLHPSUHHOPtQLPRWLHPSRPHGLRGHHVSHUD
7UDEDMR
7U 7U
7LHPSRQHFHVDULR
7UDEDMR
*HVWLyQGH3URFHVRV
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
(OPiVFRUWRSULPHUR
Este algoritmo, tambin conocido como SJF (6KRUWHVW-RE)LUVW), concede la CPU
al proceso que durante menos tiempo necesita la CPU de forma ininterrumpida.
Debe quedar claro que se selecciona el que menor porcin de tiempo de CPU
necesita en el momento de hacer la eleccin, no aquel cuyo tiempo total de CPU
es el menor de todos. Si dos procesos necesitan el procesador durante el mismo
tiempo, se elige uno mediante FCFS.
En la parte inferior de la Figura 14 tenemos la aplicacin de este algoritmo a
nuestro ejemplo. Como se puede ver, consigue el menor tiempo de espera
posible. Poniendo a un proceso corto por delante de uno largo, se decrementa el
tiempo de espera del corto ms de lo que se incrementa el del largo.
Consecuentemente, el tiempo medio decrece.
Este algoritmo, probablemente el ptimo, se comporta bien en la planificacin a
largo plazo de los procesos batch, en los que se conocen los requisitos de tiempo
total de CPU indicados por el usuario; pero en la planificacin de la CPU se
presenta el problema de que en el momento en que hay que asignar la CPU, no
hay forma de conocer a priori la porcin de tiempo que necesita cada proceso,
por lo que es difcilmente implementable. Se puede intentar una aproximacin al
SJF puro, haciendo una estimacin de la porcin necesaria basndose en
estadsticas de ejecuciones anteriores.
5RXQG5RELQ
Este algoritmo est especialmente diseado para los sistemas multiusuario de
tiempo compartido. Es similar al FCFS, pero se le aade la expropiacin de la
CPU cuando la posesin continuada de sta sobrepasa un tiempo preestablecido
(SRUFLyQGHWLHPSR), que suele ser del orden de 10 a 100 milisegundos.
La implementacin de este algoritmo se realiza con una cola FIFO para los
procesos Preparados. Los nuevos procesos se aaden al final de la cola. Cuando
el planificador tiene que seleccionar un proceso, elige el primero de la cola,
establece una temporizacin correspondiente a la porcin de tiempo, y le cede el
control. Ahora pueden ocurrir dos cosas:
1) El proceso termina o realiza una operacin de E/S antes de que se acabe su
porcin de tiempo, en cuyo caso cede la CPU voluntariamente, pasa a espera
y el planificador selecciona el siguiente proceso de la cola Preparados.
2) El proceso se ejecuta hasta dar lugar a que venza la temporizacin
establecida. En este caso, el dispositivo temporizador genera una interrupcin
que captura el sistema operativo, dando lugar a que se le expropie la CPU al
proceso en ejecucin, que pasa al final de la cola Preparados, y a que el
planificador seleccione al primer proceso de la cola para pasar a ejecucin.
Ya habamos comentado anteriormente la falta de eficiencia que pueden causar
los cambios continuos del proceso en ejecucin. En el caso de que la poltica de
planificacin del procesador sea por Prioridades de los procesos, se nos hace
imposible establecer la frecuencia de los cambios, pues vendr impuesta por los
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
6LVWHPDV0XOWLSURFHVR
3ROtWLFDVGH3ODQLILFDFLyQ
7LHPSR&RPSDUWLGR5RXQG5RELQ
3URFHVR
3URFHVR
3URFHVR
3URFHVRHQHMHFXFLyQ
3URFHVRHQHVSHUD
7UDEDMR
7LHPSRQHFHVDULR
7U
7U 7U
(O5HQGLPLHQWRGHO6LVWHPD
'HSHQGHGHOD3RUFLyQGH7LHPSR
*UDQGH
3HTXHxD
6RORKD\
FDPELRVGHFRQWH[WR
6LVWHPDV2SHUDWLYRV,
)&)6
*HVWLyQGH3URFHVRV
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
6 LV W H P D V 0 X OW LS U R F H V R
3 R OtW L F D V G H 3 OD Q L I L F D F Ly Q
3 U L R U LG D G H V H [ S X OV R U D V
+ / R V 3 U R F H V R V 7 L H Q H Q 3 U L R U LG D G H V
7 R P D H O & R Q W U R OG H OD & 3 8 L Q P H G L D W D P H Q W H
H O3 U R F H V R G H 0 D \ R U 3 U L R U LG D G
$ 3/,&$ &,2 1 (6
* U X S R V G H 3 H U V R Q D V
F D W H J R U tD V
& X L G D G R F R Q OD
, Q D Q L F Ly Q
6 2 /8 &,2 1 (6
3 5 R X Q G 5 R E LQ S R U S U L R U LG D G H V
3 3 U LR U L G D G H V
G LQ i P L F D V
6 LV W H P D V 2 S H U D W LY R V ,
7 LH P S R 5 H D O
( Q Y H M H F LP LH Q W R
* H V W Ly Q G H 3 U R F H V R V
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
0~OWLSOHVFRODV
Existe otro tipo de algoritmos para situaciones en las que los procesos estn
claramente clasificados en diferentes grupos. Por ejemplo, una divisin muy
comn es la que se hace entre procesos interactivos de primer plano (IRUHJURXQG)
y los procesos batch que suelen ejecutarse en un segundo plano (EDFNJURXQG).
Estos dos tipos de procesos tiene distintos requisitos en sus tiempos de
respuesta, por lo que podran tener distintos algoritmos de planificacin cada uno.
Adems, los procesos interactivos podran tener mayor prioridad que los se
ejecutan en un segundo plano.
Para esto, la cola Preparados podra estar dividida en varias colas separadas,
una por cada tipo de proceso. Cada proceso siempre se encola en su cola
correspondiente. As nos encontramos con que para elegir la cola de la que se va
a sacar un proceso se utiliza una poltica, mientras que para seleccionar qu
proceso se va a sacar de la cola elegida, se utiliza un algoritmo distinto. Tambin
puede ocurrir que en dos colas distintas se utilice la misma poltica de
planificacin, por ejemplo, tiempo compartido, pero que la porcin de tiempo sea
distinta en una cola que en otra.
0~OWLSOHVFRODVUHDOLPHQWDGDV
Una mezcla de las tcnicas de envejecimiento y de las mltiples colas, resulta en
las mltiples colas realimentadas.
Las distintas colas pueden tener polticas de tiempo compartido, pero las ms
prioritarias poseen una mayor porcin de tiempo. Cuando un proceso lleva mucho
tiempo en una cola de poca prioridad, se le pasa a otra cola de mayor prioridad,
consiguiendo as mayores porciones de tiempo.
3ODQLILFDFLyQHQ6LVWHPDV0XOWLSURFHVDGRU
Hasta ahora hemos tratado con algoritmos de asignacin de CPU en sistemas con
un solo procesador. Si se dispone de mltiples procesadores, la planificacin se
vuelve bastante ms compleja.
Al igual que en el caso de los sistemas monoprocesador, no existe la solucin
ptima, sino que sta depende de varios factores, y siempre hay unos procesos
beneficiados y otros perjudicados. Vamos a tratar simplemente algunos conceptos
generales sobre la planificacin de mltiples CPUs. Un estudio en profundidad de
este apartado puede encontrarse en literatura sobre arquitecturas avanzadas y
paralelas.
Cuando todos los procesadores de un sistema tienen la misma funcionalidad
(VLVWHPD KRPRJpQHR), cualquier procesador disponible puede utilizarse para
ejecutar un proceso preparado. Pero si los procesadores son distintos (VLVWHPD
KHWHURJpQHR), slo los programas compilados para un procesador determinado
pueden ejecutarse en ese procesador. Este es el caso de los sistemas distribuidos.
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
3ODQLILFDFLyQ
&RQ0~OWLSOHV3URFHVDGRUHV
/RVSURFHVDGRUHVSXHGHQVHU
',)(5(17(6
6LVWHPD+HWHURJpQHR
,*8$/(6
6LVWHPD+RPRJpQHR
&DGDSURFHVDGRUWLHQHVX
SURSLDFROD\VXSURSLD
SODQLILFDFLyQ
9DULDVFRODV"
L&DUJDGHVHTXLOLEUDGD
&DGDSURFHVRVHDVLJQDDO
WLSRGHSURFHVDGRUTXHOH
FRUUHVSRQGH
$XWRSODQLILFDFLyQ
8QSURFHVDGRUOLEUHVDFD
XQSURFHVRGHODFROD
&8,'$'2
6LVWHPDV2SHUDWLYRV,
'HEHKDEHUXQD~QLFDFRODGH
SURFHVRV
8QSURFHVDGRUKDFHGH
3ODQLILFDGRU\UHSDUWHORV
SURFHVRVHQWUHORV
SURFHVDGRUHV
*HVWLyQGH3URFHVRV
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
/D3ODQLILFDFLyQGH$OJXQRV6LVWHPDV2SHUDWLYRV
Aunque los conceptos de sistemas operativos pueden estudiarse o considerarse en
trminos puramente tericos, resulta conveniente observar cmo se han
implementado algunos sistemas operativos comerciales. As, ahora vamos a
comentar, aunque solo sea superficialmente, algunas de las decisiones de diseo
que se han tomado sobre la planificacin de la CPU en Unix, Linux y Windows NT.
8QL[
La primera versin de Unix se desarroll en 1969 por Ken Thompson en los
Laboratorios Bell. Muchas versiones y emulaciones se han hecho desde entonces.
Una de las ltimas versiones de Unix es la 6\VWHP9UHOHDVH, aparecida en 1989.
No obstante, muchos otros fabricantes tambin han desarrollado sus propias
versiones de este popular sistema operativo. As tenemos las versiones de IBM
(AIX), HP (HP-UX), Sun (Sun OS y Solaris), DEC (Ultrix) y algunas ms. Tambin se
han desarrollado versiones para PCs, como la de Microsoft (Xenix), la de Santa
Cruz y la de Tanenbaum (Minix), y para las ms variadas plataformas, desde el
Macintosh de Apple hasta supercomputadores como el Cray II.
Una de las versiones de Unix ms populares ha sido la desarrollada en la
Universidad de Berkeley por el Departamento de Defensa norteamericano para
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
&38 (L 1)
&38 =
M
8 (L)
M
+ QLFH
&38 (L 1)
M
donde
3 L
%DVH
8ML
QLFH
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
Prioridad
/LQX[
Linux es otro sistema operativo tipo Unix en el que aunque la compatibilidad con
Unix era uno de los objetivos de diseo, tiene algunas particularidades que difieren
del Unix estndar, entre ellas la poltica de planificacin de procesos, y dada la
popularidad que ha adquirido en estos ltimos aos, merece la pena comentarlo.
El desarrollo de Linux comenz en 1991, cuando el estudiante finlands Linus
Torvalds escribi un pequeo kernel o ncleo para el procesador 80386 de Intel y lo
puso a disposicin de todo el mundo de forma gratuita a travs de Internet. Este
ncleo implementaba un subconjunto de la funcionalidad de Unix, pero fue
creciendo hasta adquirir la funcionalidad completa.
Alrededor del nico NHUQHO GH /LQX[ se han construido multitud de programas que
constituyen el VLVWHPD /LQX[. Alguno de estos programas se ha construido
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
expresamente para Linux, mientras que otros se han tomado prestados de otros
sistemas o proyectos de colaboracin.
Una GLVWULEXFLyQGH/LQX[ consta de los componentes estndar de un sistema Linux,
ms un conjunto de herramientas de administracin que ayudan a simplificar la
instalacin y mantenimiento del sistema. Aunque la primera distribucin de Linux fue
la de SLS y la de Slackware posiblemente la ms popular, hoy da hay numerosas
distribuciones, entre ellas: Red Hat, Debian, Caldera, Craftworks, SuSE, Unifix, etc.
No obstante, debe tenerse en cuenta que todas ellas comparten el mismo kernel, y
los paquetes o utilidades que ofrece cada una suelen ser compatibles con las
dems distribuciones.
En este apartado vamos a centrarnos en los aspectos de planificacin del kernel de
Linux en su versin 2.0. Aunque este sistema operativo est preparado para
sistemas multiprocesador, aqu vamos a comentar nicamente la planificacin con
un nico procesador.
Linux dispone de dos algoritmos de planificacin (dos clases de planificacin). Uno
es el de tiempo compartido, para un reparto justo entre mltiples procesos; el otro
est diseado para tareas de tiempo real, donde las prioridades son ms
importantes que la justicia. Cada proceso puede acogerse a cualquiera de estas
polticas de planificacin, y as consta en su BCP.
Para los procesos de tiempo compartido, se utiliza un algoritmo basado en crditos.
Cada proceso dispone de un cierto nmero de crditos, de tal manera que para
seleccionar la siguiente tarea a ejecutarse, se elige a la que tiene ms crditos
acumulados. Cada vez que se produce una interrupcin de reloj, el proceso en
ejecucin pierde un crdito; cuando su nmero de crditos llega a cero, pierde la
CPU y se selecciona otro proceso.
Cuando no queda ningn proceso preparado con crditos, Linux vuelve a asignar
crditos a todos los procesos del sistema segn la regla siguiente:
&UpGLWRV =
FUpGLWRV UHVWDQWHV
+ SULRULGDG
2
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
:LQGRZV17
Este sistema operativo naci como consecuencia de que Microsoft decidi construir
un nuevo sistema operativo partiendo de cero y con una Nueva Tecnologa, que
soportara las aplicaciones tanto para OS/2 como para POSIX, Windows y MS-DOS.
Hay dos versiones de Windows NT: ZRUNVWDWLRQ (puesto de trabajo para un usuario)
y VHUYHU (utilizado como servidor para aplicaciones cliente-servidor), sin embargo
ambas utilizan el mismo ncleo, por lo que las caractersticas de planificacin que
comentaremos aqu se aplican a las dos versiones.
Aunque Windows NT dispone de un sistema de proteccin para mltiples usuarios,
no debe entenderse como un sistema multiusuario, pues no permite mltiples
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
consiguen un mayor aumento de prioridad, mientras que los que esperan por la
conclusin de una operacin con el disco slo consiguen un ligero aumento. Esta
estrategia tiende a ofrecer un buen tiempo de respuesta a los procesos interactivos
elevando la prioridad a los procesos que esperan por teclado o ratn, dejando que
los procesos con gran carga de procesador se ejecuten en tiempos muertos en
segundo plano.
Aunque esta planificacin expulsora siempre le otorga el procesador al proceso
preparado con mayor prioridad, no se puede decir que Windows NT sea un sistema
operativo de tiempo real estricto, pues no garantiza el tiempo mnimo que se tarda
en darle control a un proceso de alta prioridad que pasa a preparado.
3ODQLILFDFLyQHQ6LVWHPDV0XOWLSURFHVDGRUHV
Cuando Windows NT se ejecuta con un nico procesador, el proceso preparado de
mayor prioridad siempre est en ejecucin, y si hay ms de un proceso con la mayor
prioridad, la CPU se reparte por turno rotatorio entre todos los procesos preparados
de esa prioridad.
En un sistema multiprocesador con 1 procesadores, siempre se mantiene en
ejecucin a los 1 procesos de mayor prioridad, ejecutndose de manera exclusiva
en los 1 procesadores. El resto de los procesos de menor prioridad comparten el
nico procesador que queda.
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
&RPXQLFDFLyQ\6LQFURQL]DFLyQHQWUH3URFHVRV
Normalmente, los procesos que cooperan en la realizacin de un trabajo,
necesitarn durante su ciclo de vida la sincronizacin o comunicacin entre ellos o
con el proceso maestro que les haya creado. Se hace necesario algn sistema de
comunicacin cuando se requiere el intercambio de informacin entre dos o ms
procesos. Por ejemplo, un proceso puede estar produciendo una serie de datos que
sirven a su vez de entrada a otro proceso (como ocurre con el SLSH | de Unix). En
otros casos, como en los momentos en que se accede a estructuras de datos
comunes a varios procesos, se requiere algn mecanismo de sincronizacin para
que dos procesos no intenten acceder simultneamente a dicha estructura para
realizar operaciones de lectura/escritura de forma incontrolada.
As pues, en los siguientes apartados trataremos los problemas que pueden darse y
algunos mecanismos propuestos para comunicacin y sincronizacin entre procesos
cooperantes que comparten el mismo espacio lgico de direcciones.
&RQGLFLyQGH&DUUHUD
Como ya hemos dicho anteriormente, un sistema puede estar compuesto de
mltiples procesos que se pueden ejecutar en paralelo (simultneamente) si se
dispone de mltiples procesadores. Cuando solamente se dispone de una CPU, el
efecto del procesamiento paralelo puede simularse si los procesos se ejecutan
turnndose en la posesin del procesador. En otras palabras, el procesador puede
compartirse entre varios procesos. Incluso simulando el procesamiento paralelo,
resulta til ver cada proceso como si tuviera su propio procesador virtual dedicado.
Muchas de las dificultades que surgen en el verdadero procesamiento paralelo
tambin se producen en el caso simulado. Uno de estos problemas se muestra en el
ejemplo del programa superior de la Figura 18.
El primer proceso, el 2EVHUYDGRU, es el responsable de observar y contar eventos. El
segundo proceso, el 5HSRUWHUR, ocasionalmente imprime informes sobre el nmero
de eventos observados hasta el momento y seguidamente pone el &RQWDGRU de
eventos a cero. Cuando ambos procesos se ejecutan concurrentemente, puede
producirse la siguiente situacin. Supongamos que el reportero acaba de imprimir un
10, y antes de que pueda poner el &RQWDGRU a cero se produce la interrupcin de
tiempo y se concede el control de la CPU al 2EVHUYDGRU. ste, entonces, incrementa
el &RQWDGRU a 11. A continuacin, el 5HSRUWHUR vuelve a tomar posesin del
procesador y pone, por fin, el &RQWDGRU a cero, lo cual significa que un evento queda
sin ser contabilizado. En general, el 5HSRUWHUR puede fallar al informar de cualquier
nmero de eventos, ya que el incremento de la variable &RQWDGRU puede producirse
entre la impresin del valor, y su puesta a cero.
En este ejemplo se muestra que los resultados son impredecibles, ya que los
procesos se ejecutan con velocidades relativas igualmente impredecibles. Cuando el
resultado de un clculo depende de las velocidades relativas de los procesos, se
dice que hay una FRQGLFLyQ GH FDUUHUD. Las condiciones de carrera se producen
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
6LQFURQL]DFLyQGH3URFHVRV
SURJUDP Cuenta_Eventos;
Contador : INTEGER := 0;
SURFHVV Observador;
UHSHDW
Esperar_Evento;
Contador := Contador + 1;
IRUHYHU;
HQG Observador;
SURFHVV Reportero;
UHSHDW
Imprimir (Contador);
Contador := o;
IRUHYHU;
HQG Reportero;
EHJLQ
Observador;
Reportero;
HQG Cuenta_Eventos;
6HSURGXFHXQD&RQGLFLyQGH&DUUHUD
(ODFFHVRDODYDULDEOHQRHVDWyPLFR
process Observador;
repeat
Esperar_Evento;
(QWUDUB5&;
Contador := Contador + 1;
6DOLUB5&;
forever;
end Observador;
6HSLHUGHQ
HYHQWRV
62/8&,1
3URSRUFLRQDU
([FOXVLyQ0XWXD
5HJLyQ&UtWLFD
process Reportero;
repeat
(QWUDUB5&;
Imprimir (Contador);
Contador := 0;
6DOLUB5&;
forever;
end Reportero;
6LVWHP DV2SHUDWLY RV,
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
*HVWLyQGH3URFHVRV
([FOXVLyQ0XWXD\5HJLyQ&UtWLFD
Cmo evitar las condiciones de carrera? La clave para evitar problemas en las
situaciones en que se comparten objetos o recursos es encontrar algn modo de
prohibir que haya ms de un proceso leyendo o escribiendo el dato compartido al
mismo tiempo. En otras palabras, lo que se necesita es H[FOXVLyQPXWXD, es decir,
asegurarse de que si un proceso est accediendo a un dato compartido, el otro o los
otros procesos estarn imposibilitados para poder hacerlo tambin.
El problema de nuestro ejemplo es que el proceso 2EVHUYDGRU puede acceder al
&RQWDGRU (lo incrementa) antes de que el 5HSRUWHUR haya acabado de realizar las
operaciones con la variable (le faltaba ponerla a cero), o sea, se accede a la variable
antes de que el proceso que la est modificando la deje en un HVWDGRFRQVLVWHQWH.
Y este problema se produce porque las operaciones de acceso a la variable
compartida no son indivisibles en su ejecucin, es decir, porque no son DWyPLFDV o
ininterrumpibles.
En la vida de un proceso, parte del tiempo est ocupado con clculos internos y otro
tipo de cosas que no conducen a una condicin de carrera. Pero en otras ocasiones,
el proceso accede a variables o ficheros compartidos que s puede conducir a la
condicin de carrera. La parte del programa en la que se accede a memoria
compartida se denomina UHJLyQFUtWLFD. Si nos las pudiramos apaar para que dos
procesos no estuvieran al mismo tiempo en su regin crtica, evitaramos las
condiciones de carrera.
,PSOHPHQWDFLyQGHOD([FOXVLyQ0XWXD
En la parte inferior de la Figura 18 tenemos nuestro ejemplo transformado de
acuerdo a la premisa del acceso a la regin crtica. En este programa transformado
se muestra una solucin abstracta al problema de la exclusin mutua. Podemos ver
que la regin crtica de cada proceso est encerrada entre sendas sentencias de
entrada y salida de la regin ((QWUDUB5& y 6DOLUB5&). Estara bien que estas
primitivas de acceso a la regin crtica se comportasen como porteros, tal que si un
proceso intentara entrar en la regin crtica ocupada por otro proceso, el primero
quedara bloqueado por el portero hasta que el otro proceso saliese de ella.
&RQGLFLRQHVSDUDHO6LQFURQLVPRGH3URFHVRV&RRSHUDQWHV
Aunque con la exclusin mutua se evitan las condiciones de carrera, no es condicin
suficiente para que una serie de procesos paralelos cooperen correcta y
eficientemente utilizando datos compartidos. Se requieren las siguientes condiciones
para obtener una buena solucin:
1. Dos procesos no pueden estar al mismo tiempo dentro de la misma regin
crtica.
2. No se deben hacer suposiciones sobre el hardware, es decir, sobre la
velocidad o el nmero de procesadores que intervienen.
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
0HFDQLVPRV
En este apartado examinaremos, tanto a nivel hardware como software, algunos de
los muy diversos mtodos de sincronizacin que existen para resolver el problema
de la exclusin mutua. Estos son:
Inhibicin de interrupciones
Espera activa
Semforos
Monitores
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
([FOXVLyQ0XWXD
6LQFURQL]DFLyQ
5HTXLVLWRVSDUDVX,PSOHPHQWDFLyQ
'RVSURFHVRVQRSXHGHQHVWDUDOPLVPRWLHPSRGHQWUR
GHODPLVPDUHJLyQFUtWLFD
1RVHGHEHQKDFHUVXSRVLFLRQHVVREUHHOKDUGZDUH
YHORFLGDGRQGHSURFHVDGRUHV
1RVHGHEHQKDFHUVXSRVLFLRQHVVREUHODYHORFLGDGHV
UHODWLYDVGHORVSURFHVRV
1LQJ~QSURFHVRIXHUDGHVXUHJLyQFUtWLFDSXHGH
EORTXHDUDRWURVSURFHVRV
1LQJ~QSURFHVRGHEHUiHVSHUDUHWHUQDPHQWHDHQWUDU
HQVXUHJLyQFUtWLFD
1RVHGHEHSRVSRQHULQGHILQLGDPHQWHODGHFLVLyQGH
FXiOHVHOVLJXLHQWHSURFHVRTXHGHEHHQWUDU
9$5,26
6,67(0$6
,QKLELFLyQGH,QWHUUXSFLRQHV
9DULDEOH&HUURMR(VSHUD$FWLYD
6HPiIRURV
0RQLWRUHV
6LVWHPDV2SHUDWLYRV,
*HVWLyQGH3URFHVRV
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
([FOXVLyQ0XWXD
,QKLELFLyQGH,QWHUUXSFLRQHV
,QWHUUXSFLRQHV
,QKLELGDV
3RVHVLyQLQGHILQLGDGHOD&38
352%/(0$6
36HSXHGHQSHUGHULQWHUUXSFLRQHV
36HSULYDD72'26ORVSURFHVRVGHOD&38
33HOLJURVRHQPDQRVGHOXVXDULR
62/8&,1(VSHFLILFDUOD5HJLyQ&UtWLFD
...
Entrar_RC (RC_Eventos);
...
...
Salir_RC (RC_Eventos);
...
8WLOSDUDORVQ~FOHRVGHORVVLVWHPDVRSHUDWLYRV
6LVWHPDV2SHUDWLYRV,
*HVWLyQGH3URFHVRV
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
(VSHUD$FWLYD&HUURMRV
Otra posibilidad de impedir el acceso simultneo de dos procesos a la regin crtica
es haciendo que una variable acte como cerrojo o indicador de si la regin crtica
est ocupada o no. Esto se puede hacer con una variable booleana que tome los
valores 0 (libre) y 1 (ocupada). Todos los procesos que deseen acceder a una
regin crtica deben cumplir un protocolo de acceso y salida de la regin. Cuando un
proceso llegue a la entrada de la regin debe consultar el valor de la variablecerrojo; si el valor es 0, la pone a 1 y entra en la regin crtica; si la variable ya
estaba a 1, el proceso debe esperar hasta que valga 0.
La idea de este mtodo es similar al acceso al lavabo de un avin de pasajeros. Si
el cartel indica /LEUH, entramos, cerramos la puerta, y el cartel pasa a indicar
2FXSDGR. En cambio, si al intentar acceder al lavabo, el cartel indica 2FXSDGR,
simplemente esperamos a que quede libre.
Por desgracia, esta idea contiene el mismo problema que nuestro ejemplo de los
procesos Observador y Reportero. Supongamos que un Proceso A lee el cerrojo y
ve que est a 0. Antes de que pueda ponerlo a 1, pierde el control de la CPU y lo
toma otro Proceso B que tambin quiere entrar en la regin crtica. Este ltimo
consulta tambin el valor del cerrojo (que sigue a 0), lo pone a 1 y entra en la regin.
Antes de salir de la regin crtica, finaliza su porcin de tiempo y se le devuelve el
control al Proceso A, que contina lo que estaba haciendo, con lo que pone el
cerrojo a 1 (otra vez) y entra en la regin crtica, creyendo que l es el nico que
est dentro, porque ha entrado siguiendo el protocolo de acceso.
Como vemos, el problema se debe a que la consulta del cerrojo y su posterior
puesta a 1 (ocupado) no se realiza como una accin atmica.
Para solucionar esto han surgido diversos algoritmos, entre ellos, el de la panadera
(de Lamport); el algoritmo de Decker (para 2 procesos); el de Dijkstra (para n
procesos); el de Knuth, Eisemberg y McGuire; y el de Peterson. La descripcin de
estos algoritmos puede encontrarse en cualquiera de los textos indicados en la
bibliografa.
Se consigue una buena solucin con un poco de ayuda hardware. Los procesadores
de propsito general suelen ofrecer la siguiente instruccin mquina (por lo tanto,
ininterrumpible en su ejecucin):
TAS (Cerrojo, Valor)
Esta instruccin (7HVW DQG 6HW) acta de la siguiente manera. Se lee la variable
&HUURMR, y en funcin de su valor, se establecen los IODJV correspondientes en el
Registro de Estado del procesador. Por ltimo, a dicha variable se le asigna el
contenido del segundo parmetro, 9DORU. De esta forma se consigue realizar las dos
acciones de comprobacin y asignacin del valor ocupado sin ninguna
interrupcin.
En la implementacin de Entrar_RC y Salir_RC con TAS de la Figura 21 se
puede ver que cuando un proceso llega a la entrada de la regin crtica, si la
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
9DULDEOH&HUURMR
([FOXVLyQ0XWXD
(QWUDUB5&
6DOLUB5&
TST
BNZ
MOV
RET
RC_Eventos
Entrar_RC
1, RC_Eventos
MOV
RET
0, RC_Eventos
5&B(YHQWRV DB
(VWDP
RV
DOSUL FRPR
QFLSLR
+D\9DULRV$OJRULWPRVTXHOR6ROXFLRQDQ
'HNNHUSURFHVRV'LMNVWUDQSURFHVRV
.QXWK(LVHQEHUJ 0F*XLUH
$OJRULWPRGHOD3DQDGHUtDGH/DPSRUW
3HWHUVRQ
0HMRUFRQ$\XGDGHO+:
Entrar_RC
TAS
BNZ
RET
RC_Eventos,1
Entrar_RC
Salir_RC
MOV
RET
0,RC_Eventos
+3UREOHPDGHOD,QYHUVLyQGH3ULRULGDGHV
+\VLKD\P~OWLSOHVSURFHVDGRUHV"
(O*UDQ3UREOHPDGHHVWDV6ROXFLRQHV
(63(5$
$&7,9$
6LVWHPDV2SHUDWLYRV,
&RQVXPH5RGDMDVGH7LHPSR
*HVWLyQGH3URFHVRV
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
*HVWLyQGH3URFHVRV
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
6HP iIRURV
([FOXVLyQ0 XWXD
Package Semaforos is
type SEMAFOROS is private;
procedure ,QLFLDOL]DU(S
: SEMAFOROS;
Valor : INTEGER);
procedure %DMDU (S: SEMAFOROS);
/ODP DGDVDO6LVWHP D
DWyPLFDV
LI9DORUB6HP iIRUR!WKHQ
9DORUB6HP iIRUR 9DORUB6HPiIRUR
HOVH
LI+ D\B$ OJ~QB3URFHVRB(VSHUDQGRWKHQ
3RQHUORB3UHSDUGR
3ODQLILFDGRU
HOVH
9DORUB6HP iIRUR
HQGLI
HQGLI
6 LV WH P D V 2 S H UD WLY R V ,
$SXQWHVGH62,
* H V WLy Q G H 3 U R F H V R V
*HVWLyQGH3URFHVRV
Nos queda hablar de la inicializacin del semforo. Como ya veremos en las notas
sobre su implementacin, un semforo tiene un contador interno asociado, tal que
cada vez que un proceso realiza una operacin Bajar sobre l, se decrementa en 1,
hasta llegar a cero. Por esto, el valor inicial de dicho contador indica el nmero
mximo de procesos que pueden utilizar simultneamente el recurso asociado. En el
caso de que el recurso sea una regin crtica, el valor inicial del semforo deber ser
1, pues es el nmero mximo de procesos que pueden acceder simultneamente a
la regin. Los valores que puede tomar el contador del semforo son, entonces, 0 y
1; por esto a un semforo de este tipo se le denomina VHPiIRURELQDULR.
Ahora podemos ver, en la Figura 23, la versin con semforos de nuestro ejemplo
del Observador y el Reportero. Obsrvese que el programa Cuenta_Eventos
comienza inicializando a 1 el semforo S, y arrancando a continuacin los dos
procesos.
H Q Q X H V W U R H M H P S O R
6 HP iIRURV
Program Cuenta_Eventos;
Contador : INTEGER;
S
: SEMAFOROS;
process Observador;
repeat
Esperar_Evento;
%DMDU6
Contador := Contador
6XELU6
forever;
end Observador;
1;
process Reportero;
repeat
%DMDU6
Imprimir (Contador);
Contador := 0;
6XELU6
forever;
end Reportero;
begin
,QLFLDOL]DU6
Observador;
Reportero;
end Cuenta_Eventos;
6 LV W H P D V 2 S H U D W LY R V ,
* H V W Ly Q G H 3 U R F H V R V
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
*HVWLyQGH3URFHVRV
6HPiIRURV
,PSOHPHQWDFLyQ
6LVWHPDV2SHUDWLYRV,
*HVWLyQGH3URFHVRV
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
0RQLWRU
([FOXVLyQ0XWXD
/RVVHPiIRURVVRQXQEXHQPHFDQLVPR
SDUDVLQFURQL]DFLyQGHSURFHVRVSHUR
6LQRVHXVDQDGHFXDGDPHQWH
RUGHQQ~PHURYDORULQLFLDO
3$FFHVR&RQFXUUHQWH
3,QWHUEORTXHRV
8Q0RQLWRUHVXQFRQMXQWRGDWRVFRQVXVSURFHGLPLHQWRVGH
DFFHVRHQFHUUDGRVHQXQPyGXORHVSHFLDO0RQLWRU
6RODPHQWHXQSURFHVRSXHGHHVWDUDFWLYR
HQXQPRQLWRUHQXQPRPHQWRGDGR
(;&/86,1
0878$
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
*HVWLyQGH3URFHVRV
Los monitores son una construccin de los lenguajes de programacin, de tal forma
que los compiladores saben que las llamadas a los procedimientos de un monitor se
manejan de forma distinta a las llamadas a los procedimientos convencionales.
Normalmente, en la llamada de un proceso a un procedimiento de un monitor, las
primeras instrucciones del procedimiento son para comprobar si algn otro proceso
se encuentra dentro del monitor; si es as, el proceso llamante queda bloqueado
hasta que el otro proceso salga del monitor. Si no hay ningn proceso dentro del
monitor, el proceso llamante puede entrar y continuar la ejecucin.
La implementacin de la exclusin mutua en las entradas del monitor es labor del
compilador. Normalmente suele realizarse con ayuda de un semforo binario, de tal
forma que en el prlogo de un procedimiento de monitor, se incluye una llamada a
Bajar(S), y a la terminacin del procedimiento se llama a Subir(S), siendo S un
semforo asociado a cada monitor.
Ya que es el compilador, no el programador, el que se ocupa de cumplir el protocolo
de acceso a la regin crtica, es mucho ms difcil que algo se haga mal o que se
produzca algn olvido. En cualquier caso, la persona que escribe un monitor no
tiene por qu saber cmo implementa la exclusin mutua el compilador. Le basta
con saber que metiendo las regiones crticas en monitores, nunca habr ms de un
proceso dentro de la misma regin crtica al mismo tiempo.
Puesto que cuando un proceso se encuentra dentro de un monitor, no puede entrar
otro proceso, debe evitarse que el proceso que est dentro pueda quedarse
bloqueado en estado de Espera, o sea, que no debe ejecutar llamadas al sistema
que lo pasen a tal estado. Sin embargo hay situaciones en las que se requiere pasar
a Espera. Para ello, existen otras construcciones, para que cuando un proceso
dentro de un monitor deba pasar a espera, se permita la entrada a algn otro
proceso que est esperando para entrar. Aunque estas construcciones (las YDULDEOHV
FRQGLFLyQ), no vamos a tratarlas en estos apuntes, puede obtenerse una descripcin
detallada consultando la bibliografa de referencia.
3DVRGH0HQVDMHV
Aunque los semforos y los monitores son buenos mecanismos para la
sincronizacin de procesos todava tienen algunas pegas: los semforos son de
demasiado bajo nivel, y los monitores solamente estn disponibles en unos pocos
lenguajes de programacin.
Otro problema con los monitores y los semforos es que estn diseados para
resolver el problema de la exclusin mutua en sistemas con una o ms CPUs que
comparten una memoria comn. Pero cuando se trata de un sistema distribuido,
formado por mltiples procesadores, cada uno con su propia memoria particular y
conectados por una red de rea local, estas primitivas se vuelven inservibles, pues
ya no hay variables compartidas, y ninguno de estos mecanismos proporciona
intercambio de informacin entre mquinas. Se necesita algo ms.
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
3DVRGH0HQVDMHV
&RPXQLFDFLyQGH3URFHVRV
&RPXQLFDFLyQ
HQWUH3URFHVRV
0HPRULD&RPSDUWLGD
3DVRGH0HQVDMHV
(OSURJUDPDGRUUHVXHOYHORV
SUREOHPDVGHFRQFXUHQFLD
1RKD\YDULDEOHV
FRPSDUWLGDV
(QYLDU0HQVDMH
5HFLELU0HQVDMH
3URF
3URF
5HFLELU0HQVDMH
(QYLDU0HQVDMH
$/*81$6&8(67,21(6
8QLGLUHFFLRQDO 0HPRULD&RPSDUWLGD
(O(QODFH
%XV+DUGZDUH
3XHGH6HU
%LGLUHFFLRQDO
5HGGH&RPXQLFDFLRQHV
+ 0RGHORV
/yJLFRV
&RPXQLFDFLyQ',5(&7$R,1',5(&7$
&RPXQLFDFLyQ6,0e75,&$2$6,0e75,&$
+ &DSDFLGDGGHO%X]yQ
+
7DPDxRGHO0HQVDMH
6LVWHPDV2SHUDWLYRV,
$SXQWHVGH62,
)LMR
9DULDEOH
*HVWLyQGH3URFHVRV
*HVWLyQGH3URFHVRV
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
0RGHORVGH&RPXQLFDFLyQ
Primero debemos decir que los procesos reciben mensajes en EX]RQHV. Es decir,
que cuando un proceso enva mensajes, estos van a parar a buzones, y los
procesos que quieren recibirlos tendrn que sacarlos de esos buzones.
Los procesos que desean comunicarse deben disponer de una manera explcita de
indicar el destino del mensaje que se enva, o el remitente del mensaje que se
quiere recibir, y esto depende de que la comunicacin sea 'LUHFWD o ,QGLUHFWD.
&RPXQLFDFLyQ'LUHFWD
En la comunicacin directa de envo de mensajes, tanto el emisor como el receptor
deben indicar explcitamente el proceso destino o remitente del mensaje. As, las
primitivas de envo y recepcin tendrn el siguiente aspecto:
(QYLDU3URFHVRB'HVWLQR0HQVDMH
5HFLELU3URFHVRB2ULJHQ0HQVDMH
Como se puede apreciar en el esquema superior de la Figura 27, cada proceso tiene
su propio buzn de recepcin de mensajes.
Una comunicacin de este tipo tiene las siguientes caractersticas:
Automticamente se establece un enlace entre cada par de procesos que se
quieren comunicar.
Cada uno de ellos necesita saber la identidad del otro proceso con el que se
quiere comunicar.
Un enlace asocia nicamente a dos procesos.
Entre cada par de procesos solamente existe un enlace.
El enlace o comunicacin puede ser unidireccional o bidireccional.
En la Figura 27 tambin tenemos a nuestros dos procesos, el Observador y el
Reportero, comunicndose por mensajes. Tal comunicacin es directa,
unidireccional (el Observador slo enva, y el Reportero solamente recibe) y
VLPpWULFD, pues tanto el emisor como el receptor necesita conocer el nombre del
otro proceso.
Una variante dentro de esta comunicacin directa, es que el modelo sea DVLPpWULFR
(esquema inferior de la Figura 27), es decir, que puede haber mltiples procesos
enviando mensajes a un nico receptor, en cuyo caso el proceso receptor no tiene
que indicar de qu proceso quiere recibir mensajes. En la comunicacin asimtrica,
la llamada al sistema para enviar mensajes permanece invariable, mientras que la
de recepcin, queda as:
5HFLELU,GB3URFHVR0HQVDMH
Donde ambos parmetros son de salida. ,GB3URFHVR contendr el identificador del
proceso que envi el 0HQVDMH recibido.
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
&RPXQLFDFLyQ'LUHFWD
3DVRGH0HQVDMHV
3&DGDSURFHVRWLHQHVXSURSLREX]yQ
3&DGDSURFHVRLPSOLFDGRGHEHLQGLFDU
H[SOtFLWDPHQWHHOQRPEUHGHOUHFHSWRURHPLVRU
(QYLDU30HQVDMH
5HFLELU30HQVDMH
3URF
3URF
5HFLELU30HQVDMH
(QYLDU30HQVDMH
(VTXHPD6,0e75,&2
2EVHUYDGRU
5HSRUWHUR
repeat
. . .
Esperar_Evento
. . .
(QYLDU5HSRUWHUR0HQVDMH
forever
repeat
. . .
5HFLELU2EVHUYDGRU0HQVDMH
. . .
Imprimir_Evento
forever
2EV
(QYLDU5HSRUWHUR0HQVDMH
2EV
(QYLDU5HSRUWHUR0HQVDMH
2EV
5HS
5HFLELU5HPLWHQWH0HQVDMH
(QYLDU5HSRUWHUR0HQVDMH
(VTXHPD$6,0e75,&2
3HJDGHOD
&RPXQLFDFLyQ
'LUHFWD
6LVWHPDV2SHUDWLYRV,
6LFDPELDHOQRPEUHGHXQSURFHVR
KD\TXHUHYLVDUWRGDVODVUHIHUHQFLDVDpO
*HVWLyQGH3URFHVRV
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
&RPXQLFDFLyQ,QGLUHFWD
3DVRGH0HQVDMHV
/RV%X]RQHV6RQ&RPSDUWLGRV
2EV
%X]yQB
2EV
5HS
%X]yQB
2EV
5HS
Recibir (Buzn_2, Mensaje);
/RVPHQVDMHVVHHQYtDQ\UHFLEHQDGHEX]RQHVQRDSURFHVRV
5HSB\5HSBHMHFXWDQRecibir (Buzn_2, Mensaje)
2EVBHQYtDXQPHQVDMHDO%X]yQB
+4XpSURFHVRUHFLEHHOPHQVDMHGH2EVB"
(O6LVWHPD2SHUDWLYRRIUHFHVHUYLFLRVSDUD
Procedure &UHDUB%X]RQ (Nombre : in
Buzon
Nombres;
: out Buzones);
Nombres;
: out Buzones);
: in Buzones;
Mensaje : in Mensajes);
procedure 5HFLELU (Buzon
: in Buzones;
Mensaje : out Mensajes);
procedure 'HVWUXLUB%X]RQ (Buzon : in out Buzones);
6LVWHPDV2SHUDWLYRV,
*HVWLyQGH3URFHVRV
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
Crear un buzn.
Conectarse a un buzn.
Enviar y recibir mensajes de un buzn.
Destruir un buzn.
&DSDFLGDGGHO%X]yQ
Un buzn tiene una capacidad que determina el nmero de mensajes que puede
tener almacenados temporalmente. Este almacn se puede ver como una cola de
mensajes asociada al buzn. Bsicamente hay tres posibilidades sobre el tamao
del buzn:
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
&DSDFLGDG/LPLWDGD
La cola tiene una longitud mxima finita (Q mensajes), lo que quiere decir que,
como mucho, podr haber Q mensajes en el buzn esperando a ser recibidos por
uno o varios procesos. As, si la cola no est llena, cuando un proceso enva un
mensaje, ste se encola en el buzn, y el emisor puede continuar la ejecucin sin
ninguna espera. El proceso receptor podra estar esperando a recibir un mensaje,
con lo que ahora ya podra recibirlo y continuar tambin la ejecucin; pero
tambin es posible que no hubiera todava ningn proceso esperando por el
mensaje, en cuyo caso, el mensaje simplemente queda encolado en el buzn
hasta que un proceso quiera recibirlo. No obstante, ya que el tamao del buzn
es limitado, si al enviar un mensaje a un buzn, ste est lleno, entonces hay dos
alternativas:
- El proceso emisor queda bloqueado en espera de que haya espacio libre en
el buzn.
- Como parmetro de salida en la llamada a (QYLDU, se le indica un VWDWXV de
error indicativo del llenado del buzn. En este caso, el proceso emisor no se
bloquea, y se deja en sus manos la decisin de reenvo o no del mensaje.
La tcnica habitual de implementar estos buzones es mediante un buffer
circular.
6LQ/tPLWHGH&DSDFLGDG
La cola de mensajes tiene una longitud potencialmente infinita, por lo que puede
albergar cualquier nmero de mensajes, y por lo tanto, el emisor nunca queda
bloqueado.
Los buzones de capacidad ilimitada suelen implementarse como una lista
encadenada de mensajes, por lo que la limitacin slo est en la cantidad de
memoria que el proceso tiene disponible.
&DSDFLGDG1XOD
La longitud mxima de la cola de mensajes es cero, por lo que no puede haber
mensajes en el buzn esperando a ser recibidos. En este caso, el emisor o
remitente que quiera enviar un mensaje debe esperar hasta que el destinatario
reciba el mensaje. As, los dos procesos deben ponerse de acuerdo en el
momento de realizar el envo/recepcin del mensaje para que la transferencia
tenga lugar. En este caso se dice que la comunicacin es VtQFURQD. A esta
comunicacin sncrona tambin se le conoce con el nombre de UHQGH]YRXV (cita).
Se debe hacer notar que cuando la capacidad del buzn no es cero, el proceso
emisor no sabe cundo un mensaje enviado ha llegado a su destino, pues no tiene
que esperar a que el proceso destino lo reciba (comunicacin DVtQFURQD), y esto
puede ser crucial para el normal desarrollo del programa. En este caso, el receptor
debera comunicarse explcitamente con el emisor para hacerle saber que ha
recibido el mensaje.
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
3DVRGH0HQVDMHV
&DSDFLGDGGHO%X]yQ
+&DSDFLGDG/LPLWDGDQPHQVDMHV
6LKD\HVSDFLR(OHPLVRUFRQWLQ~DODHMHFXFLyQ
GHVSXpVGHOHQYtR
6LHVWiOOHQR3(OHPLVRUTXHGDEORTXHDGRKDVWDTXH
KD\DHVSDFLRHQHOEX]yQSDUDGHMDU
XQPHQVDMH
36HGHYXHOYHXQVWDWXV OOHQR
+&DSDFLGDG,OLPLWDGD
(OHPLVRUQXQFDVHEORTXHDHQHOHQYtRGHPHQVDMHV
+&DSDFLGDG1XOD
(OHPLVRUTXHGDEORTXHDGRKDVWDTXHHOUHFHSWRUHVWi
OLVWRSDUDUHFLELUHOPHQVDMH
&RPXQLFDFLyQ
6tQFURQD
5(1'(=9286
(QORVEX]RQHVFRQFDSDFLGDG!
&yPRVDEHHOHPLVRUTXHHOPHQVDMHKDOOHJDGRDVXGHVWLQR"
PROCESO P1:
Enviar (P2, Mensaje);
Recibir (P2, Mensaje);
PROCESO P2:
Recibir (P1, Mensaje);
Enviar (P1, Mensaje);
6LVWHPDV2SHUDWLYRV,
$SXQWHVGH62,
+D\TXHIRU]DUHO
VLQFURQLVPR
*HVWLyQGH3URFHVRV
*HVWLyQGH3URFHVRV
7KUHDGV
Vamos a comentar ahora un nuevo tipo de procesos que en los ltimos aos a
surgido con fuerza entre los sistemas operativos y que se adapta especialmente
bien a la estructura de los sistemas con mltiples procesadores: los WKUHDGV o
procesos ligeros.
Para que un programa pueda ejecutarse (convertirse en proceso) se requieren dos
elementos:
Un procesador.
Un entorno de ejecucin.
El entorno de ejecucin se refiere al resto de los recursos (adems del procesador)
que necesita un programa para ejecutarse. As, por ejemplo, sabemos que se
necesita un rea de memoria para acoger el cdigo del programa, un rea de
memoria para ubicar las variables globales, otro rea de memoria, denominado
KHDS, de donde se sirven las peticiones dinmicas de memoria, y por ltimo tambin
se necesita un rea de memoria para albergar la pila de trabajo. Una vez que el
proceso est cargado en memoria puede comenzar su ejecucin. Con memoria
virtual, el comienzo de la ejecucin va a implicar que todas las primeras referencias
a memoria generen una falta de pgina, tanto en la cach como en memoria
principal, por lo que se deber dedicar un tiempo a la carga de pginas iniciales
hasta que se consiga el conjunto de trabajo estable. Tambin es normal que un
proceso haga operaciones de E/S con ficheros, por lo que ser necesario abrir los
ficheros con los que se vaya a trabajar, y durante la ejecucin se tendrn EXIIHUV de
E/S asociados con cada dispositivo o fichero. Como nos podemos imaginar se
requiere cierto tiempo para conseguir un entorno de ejecucin estable.
Los procesos tradicionales (como los de Unix) se crean de tal forma que comparten
el procesador (en un entorno monoprocesador) y a cada uno se le asigna un entorno
de ejecucin diferente, es decir, cada uno tiene sus reas de memoria, sus tablas de
pginas, sus descriptores de los ficheros que maneja, sus EXIIHUV de E/S,
semforos, etc. Y esto, que parece razonable, se hace para todos los procesos del
sistema, es decir, se trata a todos los procesos del sistema como si fueran
totalmente disjuntos y que lo nico que comparten es el procesador.
Ahora bien, hay situaciones en las que un trabajo laborioso, puede descomponerse
en varias subtareas o subprocesos, de tal forma que todos ellos cooperan en la
consecucin de un mismo fin. En estos trabajos es normal que haya mucha
comunicacin y compartimiento de datos entre los subprocesos componentes. El
mecanismo normal de comunicacin en estos casos son los mensajes, que no deja
de ser un mecanismo costoso en tiempo. La comunicacin entre procesos por
memoria compartida, aunque rpida, es peligrosa, pues un proceso malintencionado
podra machacar reas de memoria de otro proceso con el que comparte memoria,
sin embargo esto no es normal en procesos cooperantes.
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
7KUHDGV
3DUDHMHFXWDUXQSURJUDPDVHUHTXLHUH
0&
(QWRUQRGH(MHFXFLyQ
(VSDFLRGHGLUHFFLRQHV
9DULDEOHVJOREDOHV
)LFKHURVDELHUWRV
7HPSRUL]DGRUHV
3URFHVRVKLMRV
6HxDOHV
6HPiIRURV
&RQWDELOLGDG
&RQWDGRUGHSURJUDPD
3XQWHURGHSLOD
5HJLVWURGHHVWDGR
5HJLVWURVJHQHUDOHV
&DPELRGH
FRQWH[WR
3&DPELRHQHOSURFHVDGRU
3&DPELRGHHQWRUQRGHHMHFXFLyQ
)DOWDVGHSiJLQD
)DOWDVGHFDFKp
$EULUILFKHURV
/OHQDUEXIIHUVGH(6
1HFHVDULRFRQ3URFHVRV
'LVMXQWRV
3(52
SLOD
3URFHVRV&RRSHUDQWHV
38('(1&203$57,5
5(&85626
SLOD
GDWRV
FRG
FRG
3
3
SLOD
SLOD
GDWRV
FyGLJR
3
3
3&UHDFLyQ5iSLGDGH3URFHVRV
3&DPELR5iSLGRGH&RQWH[WR
6LVWHPDV2SHUDWLYRV,
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
*HVWLyQGH3URFHVRV
Hemos visto que la creacin de un proceso puede ser un tanto costosa, pues crea
un entorno de trabajo totalmente diferente para cada uno. Sin embargo, para
procesos cooperantes parece que no se requieren entornos totalmente distintos,
pues es muy posible que prefieran reas de memoria comunes para compartir datos
(a su propio riesgo) y comunicarse rpidamente. Es ms, seguramente prefieren
compartir las memorias cach, y los EXIIHUV de E/S, pues parte de los datos que
manejan van dirigidos o provienen de las mismas fuentes. Dos o ms procesos
gemelos cooperantes podran compartir incluso el rea de cdigo. Segn esto, la
creacin de procesos cooperantes requerira un entorno de trabajo muy reducido: la
pila de trabajo y, en caso de procesos no gemelos, un rea de memoria para el
cdigo. Esto traera ventajas por dos vertientes:
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
7KUHDGV
.HUQHOGH62
3URF&RRSHUDQWHV
3URF1R&RRSHUDQWHV
7KUHDG
7KUHDG
7KUHDG
3URFHVR
3URFHVR
$FWRU
7DUHD
(TXLSR7HDP
7KUHDG
R
3URFHVR/LJHUR
3URFHVR
R
3URFHVR3HVDGR
$PRHED
&KRUXV
0DFK
96\VWHP
0D\RU
1~PHURGH
3URFHVRV
&RRSHUDQWHV
0HMRUDSURYHFKDPLHQWR
GHORV7KUHDGV
WKUHDG
UHSDUWLGRU
5$0FRPSDUWLGD
/RV6'VHSUHVWDQD
WHQHUDSOLFDFLRQHV
IRUPDGDVSRUPXFKRV
SURFHVRVFRRSHUDQWHV
WKUHDGV
GHVHUYLFLR
FDFKp
SHWLFLyQ
62
&UHDUSURFHVRWKUHDG
8QL[
7RSD]
EX]yQ
&DPELRFRQWH[WR
PV
PV
PV
PV
6REUHXQSURFHVDGRU&9$;GH',*,7$/
6LVWHPDV2SHUDWLYRV,
$SXQWHVGH62,
*HVWLyQGH3URFHVRV
*HVWLyQGH3URFHVRV
$SXQWHVGH62,