Académique Documents
Professionnel Documents
Culture Documents
Contenido Curso
Módulo 1: Concurrencia
Módulo 2: Interbloqueo
Módulo 3: Sistemas Operativos de Tiempo Real
Módulo 4: Sistemas de Múltiples Procesadores
Módulo 5: Seguridad
1
Sistemas Operativos II
Módulo 1
CONCURRENCIA
2
Temas a desarrollarse
Principios de la Concurrencia
Exclusión Mutua
- Soporte de software
- Soporte de hardware
Sistemas Distribuidos
Sincronización
- Basada en Mensajes
- Invocación a Procesos Remotos - RPC -
3
Introducción
7
Interacción entre Procesos
• Durante su vida los procesos del sistema junto con los
procesos de los usuarios interactúan entre sí compartiendo
recursos, y también compitiendo por el uso de esos recursos.
• Por este motivo, respecto de los recursos, los procesos son
cooperativos - cuando comparten - y competitivos - cuando
compiten -.
COMPETENCIA
• Uno de los problemas que se presenta en el diseño de SO´s es
cuando dos o más procesos compiten por un recurso que no
puede ser compartido en forma simultánea. Ej: dos procesos
necesitan modificar el mismo registro de una base de datos.
• Los procesos que intervienen en este caso se denominan
procesos competitivos. 8
Interacción entre Procesos
COOPERACIÓN
Una situación diferente aparece cuando dos o más procesos
cooperan en resolver un mismo problema.
En este caso cada proceso conoce la existencia de los otros y
por lo tanto debe sincronizarse su ejecución con el resto de
los procesos con lo cuales coopera.
Los procesos que intervienen en este tipo de tareas se
denominan procesos cooperativos.
Un ejemplo típico lo constituyen los procesos del tipo
productor/consumidor -ver figura siguiente-.
9
Interacción entre Procesos
11
Interacción entre Procesos
CLASIFICACIÓN GENERAL DE INTERACCIÓN
Según la interacción entre los procesos habrá competencia o
cooperación. Se pueden tener los siguientes tipos de
interacción:
Procesos independientes entre sí: en este caso los procesos
no conocen la existencia de otros procesos.
Esta situación es la que se presenta con mayor frecuencia en
los sistemas multiprogramados con el acceso a recursos de
uso exclusivo: un disco, una impresora, un registro de archivo.
(independientemente del número de procesadores que
contenga el sistema).
El sistema debe arbitrar los medios para que la competencia
de acceso a tales recursos sea de manera secuencial (no
12
simultánea).
Interacción entre Procesos
Procesos indirectamente dependientes entre sí: los
procesos no conocen la existencia de otros procesos en forma
explícita pero comparten algún objeto en común como, por
ejemplo, un buffer de E/S. (Ej: un proceso de impresión con el
driver de la impresora).
En este caso se presenta una cooperación entre procesos en
el compartimiento del recurso.
Procesos directamente dependientes entre sí: son procesos
que se comunican entre sí por el ID y trabajan en forma
conjunta, cooperándose mutuamente en alguna actividad.
Estos procesos son cooperativos.
13
Interacción entre Procesos
Grado de Influencia de un proceso
Relación
dependencia sobre otro
Procesos Competencia. Los resultados de un proceso son
independientes. independientes de la acción de otros.
La velocidad de ejecución puede
verse afectada.
16
Problema de la Sección Crítica
El problema de la sección crítica nace de la competencia de
los procesos por el acceso a recursos de uso compartido.
Cuando varios procesos pueden aleatoriamente modificar el
contenido de un recurso que es compartido entre ellos, el SO
debe proveer mecanismos para proteger al recurso del acceso
simultáneo de dos o más procesos a fin de evitar la posible
corrupción de los datos.
Este tipo de recursos compartidos se dice que son de uso
exclusivo y pueden ser lógicos (software) o físicos (hardware).
Recursos exclusivos lógicos: archivo, estructura de datos,
variable compartida.
Recursos exclusivos físicos: discos, impresoras, placas de
red. 17
Problema de la Sección Crítica
Introducción del problema de la sección crítica:
Supóngase que 2 procesos P1 y P2 están ejecutando
concurrentemente y deben incrementar una variable x
compartida[*] entre ambos. x: puede ser, p/ej. el nº de archivos
abiertos, o el nº de procesos terminados del sistema, etc.
P1: . P2: .
. .
x=x+1 x = x +1
Estas instrucciones en lenguaje de alto nivel son traducidas en
varias instrucciones en código de máquina.
[*]No confundir variable compartida con variable global.
Var. compartida: puede ser accedida por todos los proc´s. que la referencian.
Var. global: es accedida sólo por los proced´s o rutinas de dicho proceso).
Una var. compartida es definida en un espacio de direcciones universal, 18
mientras que una var.global es definida en el espacio de direcciones del procso.
Problema de la Sección Crítica
• Para simplificar el ejemplo considérese un computador con dos
procesadores centrales C1 y C2, cada uno con sus registros
internos R1 y R2.
• Si C1 procesa a P1 y C2 procesa a P2 se podrían tener los
siguientes casos de secuencia de ejecución de estos procesos
en lenguaje de máquina:
19
Problema de la Sección Crítica
Caso 1:
P1: R1 = x P2: ...
R1 = R1 + 1 ...
x = R1 ...
R2 = x
R2 = R2 + 1
x = R2
Caso 2:
P1: R1 = x P2: ...
R1 = R1 + 1 …………………….. R2 = x
x = R1 …………………….. R2 = R2 + 1
x = R2
P/Ej: si inicialmente x = 2, en Caso1, x = 4; en cambio, en Caso2,
20
x=3
Problema de la Sección Crítica
Análisis del ejemplo anterior:
Del Caso1 y Caso2 se observa que se obtienen resultados
diferentes en el valor de x que dependen del instante en que
comenzaron a ejecutarse los procesos P1 y P2, lo cual es
totalmente inaceptable.
Para obtener la solución correcta (x = 4), en el ejemplo visto se
debería permitir que sólo un proceso por vez incremente la
variable x.
Esto implica que la sentencia x = x +1 es una sección crítica del
programa, debiéndose evitar que dos procesos ingresen a la
misma simultáneamente.
Dicho de otra forma: sólo se debe permitir que los procesos
ingresen en forma mutuamente excluyente a la misma.
Debe proveerse exclusión mutua de los procesos en la sección
crítica. Con ello se evita la corrupción de la información. 21
Problema de la Sección Crítica
ESCENARIO GENERAL
Se analizará el problema de la sección crítica en forma genérica:
Existen varios procesos secuenciales cíclicos que, generalmente,
se comunican a través de una o más variables compartidas.
Cada proceso tiene una sección crítica durante la cual accede a
un dado recurso compartido de uso exclusivo.
Para un dado recurso compartido de uso exclusivo:
El objetivo es lograr que en cualquier momento sólo uno de los
procesos se encuentre procesando en su sección crítica.
Es lo mismo que decir: una vez que un dado proceso se
encuentra ejecutando en su sección crítica, ningún otro
proceso puede ejecutar en su correspondiente sección crítica
22
(Exclusión mutua).
Problema de la Sección Crítica
Esquemáticamente, el modelo que se propone para analizar el
problema es el sigte: (se trata de un único recurso)
25
Soluciones al Problema de la Sección Crítica
SOLUCIÓN POR SOFTWARE
Solución para el caso de 2 procesos respecto de un recurso.
Objetivo: En base al diagrama esquemático de los procesos que
se muestra en la figura, la solución implica diseñar el código
Comienzo_SC y Fin_SC que cumpla con las 4 condiciones
enunciadas.
Comienzo_SC Comienzo_SC
< SC1 > < SC2 >
Fin_SC Fin_SC
Programa1 Programa2
... ...
Proceso P1 Proceso P2 26
Soluciones al Problema de la Sección Crítica
SOLUCIÓN POR SOFTWARE (Cont.)
La solución del problema, aunque parezca simple, es de suma
complejidad y llevó varios años encontrar un resultado que
cumpla con la 4 condiciones establecidas.
A continuación se verán algunos ejemplos que, a primera vista,
serían una solución al problema; pero que, cuando se los
analiza con detenimiento, se advierte que no cumplen con una
o más condiciones impuestas. Esto permitirá reconocer la
complejidad del problema.
27
Soluciones al Problema de la Sección Crítica
SOLUCIÓN POR SOFTWARE - Ejemplo 1
Objetivo: se intentará lograr que los procesos P1 y P2 entren a su
respectivas SC alternadamente; para ello se usará la variable
compartida turno que mantiene el turno del proceso al que
corresponde ingresar a su SC:
int turno = 2; (corresponde ingresar a P2)
P1: P2:
do forever do forever
while turno = 2 do nop; while turno = 1 do nop;
< SC1 > < SC2 >
turno = 2; turno = 1;
programa1; programa2;
end do end do 28
Soluciones al Problema de la Sección Crítica
SOLUCIÓN POR SOFTWARE - Ejemplo 1 (cont)
La solución propuesta falla en la condición 2. En efecto, si por
ejemplo el programa1 fuese mucho más largo que el
programa2 (o se ejecuta en un procesador más lento) o si el
proceso P1 se bloqueara en el programa1; el proceso P1, que
se encuentra totalmente fuera de SC1, estaría bloqueando el
ingreso de P2 a SC2.
Eso es debido a que cuando P1 está en programa1, el valor de
turno podría ser 1[*] y, por lo tanto, P2 no puede ingresar a SC2.
29
Soluciones al Problema de la Sección Crítica
SOLUCIÓN POR SOFTWARE - Ejemplo 2
Se sigue con los 2 procesos.
Objetivo: para evitar el problema de la solución propuesta en el
Ejemplo1 se utilizarán dos variables comunes C1 y C2 que
indicarán si un proceso está dentro o fuera de su SC.
Descripción de la operación:
Proceso Pi desea entrar en su SCi: para ello pone el indicador Ci
en “falso” y espera que el otro indicador esté en “cierto” para
entrar en su SCi. Luego que sale de su SCi y pone el
indicador Ci en “cierto” permitiendo que el otro proceso
pueda ingresar a su SC.
30
Soluciones al Problema de la Sección Crítica
SOLUCIÓN POR SOFTWARE - Ejemplo 2 (cont.)
Boolean C1 = C2 = true; {valor inicial de variables compartidas}
P1: P2:
do forever do forever
C1 = false; C2 = false;
while not C2 do nop; while not C1 do nop;
< SC1 > < SC2 >
C1 = true; C2 = true;
programa1; programa2;
end do end do
31
Soluciones al Problema de la Sección Crítica
SOLUCIÓN POR SOFTWARE - Ejemplo 2 (cont.)
Aquí no se cumple la condición 4: es posible que C1 y C2
contengan el valor “false” en forma simultánea (por ejemplo,
C1 se puso en “false” y apareció una IRQ, pasando P2 a
ejecutarse con C2 también en “false”).
En tal caso los dos procesos entrarán en un lazo de bloqueo
indefinido: uno esperando por el otro, para su ingreso a su
respectiva SC.
Con C1 y C2 inicializados en “false” es imposible para P1 y P2
proseguir, quedan mutuamente trabados (interbloqueo).
32
Soluciones al Problema de la Sección Crítica
SOLUCIÓN POR SOFTWARE - Ejemplo 3
Objetivo: evitar el bloqueo indefinido poniendo C1 y C2 en “true”
luego de chequear si son “false”.
Boolean C1 = C2 = true;{valor inicial de variables compartidas}
P1: P2:
do forever do forever
C1 = false; C2 = false;
if not C2 then C1 = true; if not C1 then C2 = true;
else else
< SC1 > < SC2 >
C1 = true C2 = true;
programa1; programa2;
end if end if
end do end do 33
Soluciones al Problema de la Sección Crítica
SOLUCIÓN POR SOFTWARE - Ejemplo 3 (cont.)
Esta solución falla en la condición 3 y 4: si, p/ej. P2 siempre
chequea el indicador C1 justo después de que fue puesto en
“false” por P1 y, como resultado, pone a C2 en “true” antes
de que sea chequeado por P1; P1 siempre entrará en su SC,
mientras que se obliga a P2 a esperar (viola la condición 3).
El otro tipo de bloqueo se produce, por ejemplo, cuando P1 y P2
comienzan a ejecutar en forma simultánea y exactamente a
la misma velocidad. Esto puede motivar que estén
chequeando y modificando los indicadores indefinidamente
sin poder ingresar a sus respectivas SC[*].
[*] Este tipo de bloqueo indefinido tiene baja probabilidad de ocurrencia puesto
que, para que ocurra el bloqueo, ambos procesos deben mantener
exactamente la misma velocidad de procesamiento siempre. Si uno de
ellos ejecuta más rápido o más lento que el otro, el bloqueo mutuo se34
resuelve.
Fin de la clase
35
Soluciones al Problema de la Sección Crítica
SOLUCIÓN POR HARDWARE
Existen diversas soluciones. Método más simple: exclusión mutua
deshabilitando las IRQ al procesador cuando un proceso se
encuentra en su SC. (usado por UNIX en 1eras. versiones).
El esquema es el siguiente: Pi:
deshabilitar IRQ´s
< SCi >
habilitar IRQ´s
38
Soluciones al Problema de la Sección Crítica
SOLUCIÓN POR HARDWARE - función test&set
P1:
do forever
while not test&set(X) do nop; {lazo de espera}
< SCi >
X = true;
end do
39
Soluciones al Problema de la Sección Crítica
SOLUCIÓN POR HARDWARE
Ventajas:
Es aplicable a cualquier número de procesos tanto en sistemas
monoprocesador como en sistemas multiprocesador.
Es simple y, por lo tanto, muy fácil de verificar.
Puede ser utilizado para soportar múltiples secciones críticas.
Desventajas:
En su implementación, normalmente se emplean lazos de
espera donde la CPU utiliza ciclos sin ninguna computación útil
En ciertas circunstancias es posible que se provoque inanición
de procesos.
Es posible que aparezca bloqueo indefinido (“deadlock”),
dependiendo del tipo de planificador de CPU que utilice el SO.
40
Soluciones al Problema de la Sección Crítica
SOLUCIÓN POR HARDWARE
Debido a las desventajas expuestas, las soluciones por
hardware no son generalmente empleadas en los SO
modernos.
41
Sistemas Distribuidos
Un sistema distribuido está compuesto por varios
computadores interconectados por una red de comunicación.
Cada computador tiene su propia memoria principal, la cual
no es compartida con ningún otro computador.
Desde el punto de vista de un computador específico, el
resto de los computadores y sus correspondientes recursos
son remotos mientras que sus propios recursos son locales.
La diferencia más notable entre los sistemas distribuidos y
los sistemas multiprograma o multiprocesador, es que en los
primeros no se comparte el mismo conjunto de recursos,
particularmente la memoria, entre los procesos intervinientes.
42
Sistemas Distribuidos
Los sistemas componentes del sistema distribuido no
necesariamente deben ser iguales.
Por el contrario, la aplicación práctica consiste en conectar
sistemas con diferentes configuraciones, diferentes SO´s, etc.
La conexión es provista por un bus de alta velocidad o una red
de comunicación LAN, MAN o WAN.
Sistema B
Red de Comunicación
Sistema A
Sistema C Sistema D
43
Sistemas Distribuidos
Motivos de la importancia de los sistemas distribuidos:
Compartimiento de Recursos.
Ejemplo: Un usuario de A puede usar una impresora
disponible en B, mientras un usuario de C puede utilizar un
disco de A.
Mayor velocidad de procesamiento.
Si un proceso particular puede ser dividido en varios
procedimientos, éstos se pueden ejecutar concurrentemente
en varios sistemas (paralelismo físico). Además, si un
sistema se halla sobrecargado, algunos procesos podrían
migrarse a un sistema co menor carga.
44
Sistemas Distribuidos
Confiabilidad (tolerancia a fallas).
Cuando un sistema deja de funcionar puede ser remplazado
por otro que está operativo
Comunicación.
Consiste en establecer aplicaciones típicas de red
comunicadas entre los sistemas del SD, como la
transferencia de archivos, logeo remoto, correo electrónico,
etc. Ej: grupos de trabajo geográficamente separados pueden
desarrollar un mismo proyecto en forma cooperativa: transferir
archivos del proyecto, ingresar en los distintos sistemas para
correr programas, utilizar el correo electrónico para coordinar
tareas, etc.
45
Métodos de Sincronización basados en Mensajes
Primitivas “send” y “receive”
Son utilizadas para enviar y recibir datos de cualquier tipo entre
los procesos.
No existe una definición universal para send y receive. En forma
genérica, las sintaxis de estas primitivas podría ser:
• send (p,msg)
• receive (q,msg)
send: envía el mensaje msg (puede ser cualquier estructura de
datos) al proceso p.
receive: se usa para recibir un mensaje. q es el proceso que
espera el mensaje, mientras que msg es la estructura de
datos donde se depositará el mensaje.
46
Métodos de Sincronización basados en Mensajes
Preguntas para entender la variedad de uso de las primitivas
send y receive:
1. Cuando un proceso envía un mensaje, ¿debe esperar hasta
que sea aceptado por el proceso receptor o puede continuar
procesando?
2. ¿Qué debería ocurrir cuando se invoca receive y no hay
mensaje para ser recibido?
3. El proceso que envía el mensaje ¿debe especificar el proceso
receptor, o el mensaje puede ser recibido por todos los
procesos?
4. El proceso receptor ¿tiene que especificar exactamente de qué
proceso está esperando un mensaje o puede aceptarlo de
cualquier proceso?
47
Métodos de Sincronización basados en Mensajes
Las dos primeras preguntas tienen que ver con la comunicación,
mientras que las dos últimas están relacionadas con la
invocación de procesos.
La comunicación: puede ser sincrónica o asincrónica.
La invocación: puede ser implícita o explícita.
Respuestas a las preguntas formuladas.
Pregunta 1: Cuando un proceso envía un mensaje, ¿debe
esperar hasta que sea aceptado por el proceso receptor o
puede continuar procesando?
Existen dos posibles repuestas: si el proceso emisor se bloquea
hasta que el mensaje es aceptado, la primitiva send se
denomina sincrónica. Caso contrario se denomina
asincrónica.
48
Métodos de Sincronización basados en Mensajes
Pregunta 2: ¿Qué debería ocurrir cuando se invoca receive y no
hay mensaje para ser recibido?
De igual forma que para 1, se puede tener una primitiva recieve:
- sincrónica o bloqueante: cuando se invoca receive y no hay un
mensaje, el proceso se bloquea esperando por él.
- asincrónica o no bloqueante: si no hay mensajes cuando la
primitiva es invocada, el proceso sigue procesando.
49
Métodos de Sincronización basados en Mensajes
3. El proceso que envía el mensaje ¿debe especificar el
proceso receptor, o el mensaje puede ser recibido por todos
los procesos?
4. El proceso receptor ¿tiene que especificar exactamente de
qué proceso está esperando un mensaje o puede aceptarlo
de cualquier proceso?
Las preguntas 3 y 4 están orientadas a resolver el problema del
nombre de los procesos.
Resp. a 3: en el caso de send es muy común el envío del
mensaje a todos los procesos (broadcasting o nombramiento
implícito)
Resp. a 4: de igual forma, un proceso puede querer recibir
mensajes de cualquier proceso (primitiva receive con
nombramiento implícito).
Cuando el envío o recepción de mensaje es selectivo: primitivas
con nombramiento explícito. (Ver Tabla siguiente) 50
Métodos de Sincronización basados en Mensajes
send Bloqueante No Bloqueante
Nombramiento Enviar el mensaje m al Enviar el mensaje m al
Explícito receptor r. Esperar hasta receptor r.
que m sea aceptado.
Nombramiento Enviar m a todos los Enviar m a todos los
Implícito procesos. Esperar hasta procesos.
que m sea aceptado.
54
Comunicación a través de Buzones y Puertos
(“Mailboxes” y “Ports”)
En ausencia de primitivas receive c/ nombto implícito, un
proceso está limitado a recibir mensajes de una única fuente
en todo instante.
La idea básica es hacer que las colas que almacenan los
mensajes sean visibles a los procesos. Es decir, una primitiva
send no utiliza el nombre de un proceso como su destino;
sino que direcciona a una cola adónde el mensaje será
agregado.
De manera similar, la primitiva receive del proceso receptor
direcciona la cola desde la cual va aceptar los mensajes.
55
Comunicación a través de Buzones y Puertos
Buzón o Mailboox: cola direccionada por más de un proceso
transmisor. (Figura (a) sigte).
Es el método más general de comunicación ya que
cualquiera de los n transmisores puede emitir mensajes que
pueden ser recogidos por cualquiera de los m receptores.
Desafortunadamente, en los sistemas distribuidos la
implementación de operaciones receive puede ser bastante
costosa puesto que todas apuntan al mismo buzón.
Frecuentemente se implementa una versión limitada de un
mailboox, denominado puerto o “port”.
Puerto: todos los mensajes que provienen de diferentes procesos
son direccionados al mismo puerto, el que está asociado a
un único receptor. (Figura (b) sigte).
56
Comunicación a través de Buzón y Puerto
Procesos Procesos
Transmisores Receptores
S1 send receive R1
. .
. Buzón .
. receive .
send
Sn Rm
(a)
Procesos
Transmisores
S1 send
Proceso
Receptor
.
receive
. Puerto Q
.
send
Sn
57
(b)
Comunicación a través de Buzones y Puertos
Las Primitivas send y receive son una de las tantas primitivas
utilizadas en la sincronización de procesos que no utilizan
memoria compartida. La desventaja de estas primitivas es que
son de bajo nivel; esto significa que el programador se ve
forzado a intercalar en el medio de sus procedimientos de alto
nivel las primitivas send y receive.
Existen otras primitivas de alto nivel que son utilizadas para la
sincronización de procesos que no disponen de compartimiento
de variables.
Estas primitivas se basan en invocaciones a procedimientos
remotos llamadas comúnmente RPC (Remote Procedure Call)
58
Llamado a Procedimientos Remotos - RPC -
Los RPC se utilizan para la sincronización de procesos en
sistemas distribuidos. (Es una variante de las primitivas de
pasaje de mensajes).
Parte esencial de este esquema: permitir interactuar a los
programas en distintos computadores utilizando la misma
semántica usada para llamados a procedimientos locales; es
decir, como si los programas que interactúan estuvieran en la
misma máquina, con la salvedad de que no están.
Los esquemas de sincronización basados en RPC son usados
en la mayoría de los SO´s (Ej: Windows NT, UNIX, entre otros).
59
Llamado a Procedimientos Remotos - RPC -
Razones de la amplia aceptación de los RPC:
La invocación de procedimientos es un mecanismo
ampliamente aceptado y utilizado desde hace décadas por los
programadores.
El uso de RPC permite a las interfaces remotas ser
especificadas como un conjunto de operaciones con tipos de
datos perfectamente establecidos. De esta manera, la interfaz
puede ser claramente documentada.
Al especificarse una interfaz bien definida y documentada, los
desarrolladores de software pueden escribir módulos clientes y
servidores que pueden moverse entre distintos computadores y
SO´s con mínimas modificaciones.
60
Llamado a Procedimientos Remotos - RPC -
Visión de un RPC:
Puede ser visto como una primitiva de alto nivel, si se lo
compara con las primitivas send() y receive() de pasaje de
mensajes.
Desde el punto de vista del programador: tiene el mismo efecto
que una invocación a un procedimiento estándar local: se
transfiere el control a otro procedimiento, mientras se suspende
al programa que lo invoca.
Una sentencia “return” ejecutada por el procedimiento
invocado, transfiere nuevamente el control al procedimiento
original, en dónde se continúa con la ejecución de la
instrucción que sigue luego del llamado al procedimiento
remoto.
61
Llamado a Procedimientos Remotos - RPC -
Diferencia entre un procedimiento local y uno remoto:
Este último se ejecuta en un espacio de direcciones totalmente
separado y, por lo tanto, no se puede compartir ninguna
variable global.
Para el intercambio de información:
El programa que invoca al RPC debe pasar todos los valores al
procedimiento como parámetros de entrada.
De igual manera, los resultados son devueltos al proceso que
invoca el RPC como parámetros de salida.
62
Llamado a Procedimientos Remotos - RPC -
Los RPC desde el punto de vista de la implementación:
Varían totalmente respecto de los procedimientos normales:
debido a que los procedimientos remotos ejecutarán en un
espacio de direcciones diferentes (posiblemente en otro
computador) no pueden ser parte del proceso que lo invoca.
Por lo tanto se debe crear un proceso separado para ejecutar
el RPC.
63
Fin Módulo 1
64