Você está na página 1de 62

Repasando

https://www.youtube.com/watch?v=Wy4NlEzARio
Ver hasta el minuto 5

Procesos - Tipos
Independientes
Su estado no es compartido
Son deterministas.
Son reproducibles
Pueden ser detenidos y re-arrancados sin ningn
efecto negativo
i.e.: programa que calcula nmeros primos

Procesos - Tipos
Cooperantes
Los procesos comparten su estado
El funcionamiento es no determinista
Su funcionamiento puede ser irreproducible
i.e.: un proceso escribe abc en el terminal y otro
cba
Sirven para:
Compartir informacin
Acelerar clculos
Proveer modularidad
Por Conveniencia

Procesos
Sincronizacin:
Identificar las condiciones necesarias para que
varios procesos compartan recursos sin que se
produzcan problemas en el sistema.
Seccin crtica:
Es la porcin de cdigo en la que se accede a
un recurso compartido (estructura de datos o
dispositivo) que no debe ser accedido por ms
de un proceso o hilo en ejecucin.

Procesos
Una SC se termina en un tiempo determinado y el
hilo, proceso o tarea tiene que esperar algn
perodo de tiempo para entrar de nuevo a la
Seccin crtica.
Se necesita un mecanismo de sincronizacin en la
entrada y salida de la seccin crtica para asegurar
la utilizacin en exclusiva del recurso.

Procesos - Sincronizacin
Se hace necesario algn sistema de comunicacin
cuando se requiere el uso de informacin (datos o
estructuras) compartida entre dos o ms procesos.

Hay momentos en que se accede a estructuras de


datos comunes a varios procesos, se sincroniza
para que dos procesos no intenten acceder
simultneamente a estas y que se realicen
operaciones de lectura/escritura de forma
incontrolada.

Procesos - Cooperantes
El problema productor-consumidor
Considere la siguiente situacin:
El proceso A, es el responsable de observar y
contar eventos.
El proceso B, ocasionalmente imprime informe
sobre el nmero de eventos observados y luego
pone el contador de eventos en 0.
Cul es la situacin?

Procesos - Cooperantes
Supongamos que el reportero acaba de imprimir un
10, y antes de que pueda poner el contador a cero
se produce la interrupcin de tiempo y se concede
el control de la CPU al A.
ste, incrementa el contador a 11.
A continuacin, el B vuelve a tomar posesin del
procesador y pone, por fin, el a cero, lo cual
significa que un evento (el 11) queda sin ser
contabilizado

Procesos Cooperantes
Program Cuenta_Eventos;
Contador : INTEGER := 0;
Process Observador;
Repeat
/* Este repeat . Forever es que se ejecuta siempre */
Esperar_Evento;
Contador := Contador + 1;
forever;
End Observador;
Process Reportero;
repeat
Imprimir (Contador);
Contador := o;
forever;
End Reportero;
Begin
Observador; /* En este momento se crea el proceso Observador */
Reportero;
/* En este momento se crea el proceso Reportero */
end Cuenta_Eventos;

Procesos Condiciones de carrera


Cuando el resultado de un clculo depende de las
velocidades relativas de los procesos, se dice que
hay una condicin de carrera.

Se
producen
cuando
procesos
paralelos
comparten datos o recursos, como la variable
contador del ejemplo.

Procesos Exclusin mutua


Exclusin mutua:
Es el mecanismo que asegura que slo una persona
o proceso est haciendo algo en un instante
determinado (los otros estn excluidos).

Procesos Exclusin mutua por SC


Program Cuenta_Eventos;
Contador : INTEGER := 0;
Process Observador;
repeat
Esperar_Evento;
Entrar_SC;
Contador := Contador + 1;
Salir_SC;
forever;
End Observador;
Process Reportero;
Repeat
Entrar_SC; /* Cuando pido entrar en una SC es que quiero que el CPU sea mo hasta que yo lo
suelte */
Imprimir (Contador);
Contador := o;
Salir_SC;
/* Aqu se suelta el procesador */
forever;
End Reportero;
begin
Observador;
Reportero;

Otro ejemplo
Un proceso produce datos que son posteriormente
procesados por otro proceso
i.e.: el manejador de teclado y el programa que
recoge los caracteres de un buffer
Lo ms cmodo es emplear un buffer circular

Otro ejemplo Cdigo del productor


El productor no puede escribir en el buffer si est lleno
Comparte con el consumidor: el buffer y la variable contador
do {
...
produce un nuevo elemento (elemento_p)
...
while (contador == MAX) haz_nada;
buffer[indice_p] = elemento_p;
indice_p = (indice_p + 1) % MAX;
contador = contador + 1;
} while (TRUE);

Otro ejemplo Cdigo del consumidor


El consumidor no puede leer del buffer si est vaco
Comparte con el productor : el buffer y la variable contador
do {
while (contador == 0) haz_nada;
elemento_c = buffer[indice_c];
indice_c = (indice_c + 1) % MAX;
contador = contador - 1;
...
consume el elemento (elemento_c)
...
} while (TRUE);

Condiciones de carrera
El cdigo anterior no funciona por existir condiciones
de carrera al actualizar la variable contador
Veamos:

contador = contador + 1;
Proceso 1 Suma
Proceso 2 Resta
load r0, A
load r0, A
add r0, 1
sub r0, 1
store A, r0
store A, r0
Problema: la modificacin de la variable contador
no es atmica

Atomicidad
Una operacin es atmica (en un sistema monoprocesador) cuando se ejecuta con las interrupciones
deshabilitadas
Las referencias y las asignaciones son atmicas en
la mayora de los sistemas. Esto no es siempre cierto
para matrices, estructuras o nmeros en coma
flotante.
Implica la indivisibilidad, debe realizarse en su
totalidad o no realizarse.
Si el HW no proporciona operaciones atmicas,
stas no pueden construirse por SW

Sincronizacin (de nuevo)


Persona A

Persona B

3:00 Mira en la refri. No


hay leche

3:05 Va a la pulpera

Mira en la refri. No hay leche

3:10 Llega a la pulpera

Va a la pulpera.

3:15 Deja la pulpera

Llega a la pulpera.
Deja la pulpera.

3:20 Llega a casa y guarda


la leche
3:25
3:30

Llega a casa y... Mucha


leche!

Seccin crtica - Solucin


Toda solucin debe cumplir tres condiciones
Exclusin mutua
Progreso
Espera limitada
Solucin general:
do {
protocolo de entrada
seccin crtica
protocolo de salida
resto de la seccin
} while (TRUE);

Exclusin mutua- Soluciones


Se requieren las siguientes condiciones para obtener
una buena solucin:
Dos procesos no pueden estar al mismo tiempo
dentro de la misma regin crtica.
No se deben hacer suposiciones sobre el
hardware, es decir, sobre la velocidad o el nmero
de procesadores que intervienen.
No se deben hacer suposiciones sobre las
velocidades relativas de los procesos.

Exclusin mutua- Soluciones


Ningn proceso fuera de su regin crtica puede
bloquear a otros procesos.
Ningn proceso deber esperar eternamente a
entrar en su regin crtica.
No se debe posponer indefinidamente la decisin
de cul es el siguiente proceso que debe entrar.

Interbloqueo Qu es?
Un proceso esta interbloqueado si est esperando
por un evento determinado que nunca va a ocurrir.
tiene

Proceso A

Recurso 1

necesita

necesita
Recurso 2

Proceso B

tiene

Interbloqueo - Definicin
Interbloqueo entre dos procesos por el uso de
recursos no compartibles (abrazo mortal)

Postergacin
indefinida
(inanicin,
bloqueo
indefinido, aplazamiento indefinido o Lockout):
cuando un proceso espera por un evento que
puede ocurrir pero no se sabe cuando.

Veamos los conceptos


http://www.youtube.com/watch?v=zKmvF0RASEg

Exclusin mutua- Soluciones


Soluciones basadas en variables de control
Soluciones basadas en instrucciones mquina
especficas (test-and-set o swap)
Soluciones basadas en primitivas del SO
Soluciones
monitores

basadas

en regiones

crticas

Variables de control

Vlidas para varios procesadores


Suposicin:
Instrucciones
de
almacenamiento atmicas

carga

Variables de control
Algoritmo de Dekker
Variables compartidas:
Turno es entero;
Turno = 1; /*Inicializa turno en 1*/

La variable Turno obliga a que los procesos tengan


que alternar turnos de acceso a la SC

Variables de control
Algoritmo de Dekker
Programa Uno;
Proceso Uno

Proceso Dos

Repeat

Repeat

Hace_Cosas();

Hace_Algo();

While turno = 2 Do;

While turno = 1 Do;

Seccin_Crtica();

Seccin _Crtica();

turno = 2;

turno = 1;

Hace_mas_cosas();

Hace_algo_mas();

Until Fin

Until Fin

Algoritmos de Decker - Soluciones


http://www.youtube.com/watch?v=oMSINASmhzg
No ver!

Sincronizacin por hardware - Cerrojos


Se hace 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).
Se consigue una buena solucin con un poco de
ayuda hardware con la siguiente instruccin
mquina (por lo tanto, ininterrumpible en su
ejecucin)
TAS (Cerrojo, Valor)

Sincronizacin por hardware


El proceso que quiere entrar a la seccin crtica
consulta el cerrojo. Si est libre (cerrojo==0), el
proceso lo echa (cerrojo=1) y entra a la seccin
crtica.
Si est echado, ejecuta una espera activa
consultando su valor hasta que est libre.

Cuando un proceso deja la seccin crtica, libera el


cerrojo (cerrojo=0)

Sincronizacin por hardware


Variable compartida cerrojo iniciada a FALSE
do {
while (test_and_set (&cerrojo))
haz_nada;
seccin crtica
cerrojo = FALSE;
resto de la seccin
} while (TRUE);

Soluciones por hardware - SWAP


Procedure intercambiar(var r:registro; var m:memoria); var temp;
Begin
temp:=m;
m:=r;
r:=temp
End.

Sincronizacin por hardware - SWAP


Variable compartida cerrojo iniciada a FALSE
do {
llave = TRUE;
do { swap (cerrojo, llave);
} while (llave != FALSE);
seccin crtica
cerrojo = FALSE;
resto de la seccin
} while (TRUE);

Sincronizacin por hardware - Ventajas


Es aplicable a cualquier nmero de procesos en
sistemas con memoria compartida, tanto de
monoprocesador como de multiprocesador.
Es simple y fcil de verificar.
Puede usarse para disponer de varias secciones
crticas; cada seccin crtica puede definirse con
su propia variable.

Interrupciones
Es un mecanismo que permite ejecutar un bloque
de instrucciones interrumpiendo la ejecucin de un
programa, y luego restablecer la ejecucin del
mismo sin afectarlo directamente.
De este modo un programa puede ser interrumpido
temporalmente para atender alguna necesidad
urgente del computador y luego continuar su
ejecucin como si nada hubiera pasado.

Interrupciones
Internas del hardware:
No son modificables, por ejemplo el reloj.
Externas de hardware:
Activadas por evento en los perifricos, por
ejemplo teclados, impresoras, tarjetas de
comunicacin, etc
De software:
Activadas
invocando
directamente
el
ensamblador y el nmero de interrupcin.
De excepcin: i.e. Divisin por cero

Sincronizacin por hardware Interrupciones

Un proceso se mantiene ejecutndose hasta que se solicite un


servicio al S.O. o hasta que sea interrumpido.
Para garantizar la exclusin mutua, es suficiente con impedir
que un proceso sea interrumpido.
Se utiliza el S.O. para habilitar o inhabilitar las interrupciones.
While (cierto)
{
/*inhabilitar interrupciones */;
/* seccin critica */;
/* habilitar interrupciones */;
/* resto */;
}

Interrupciones Ventajas - Desventajas


Ventaja:
Si se desactivan las interrupciones no se
presenta el problema de la exclusin mutua
porque al hacerlo impedimos que ningn otro
proceso pueda parar al que se est ejecutando.
Desventaja:
Si a un proceso se le olvida volver a habilitar las
interrupciones, se hace propietario de la
mquina y puede botar el sistema.

Soluciones - Semforos
Introducidos por Dijkstra en los aos 60
Es un tipo especial de variable que slo puede ser
accedida por dos primitivas P y V
P (semforo): operacin atmica que espera hasta
que la variable semforo sea
positiva, en este
momento la decrementa en 1 (espera activa)
V (semforo): operacin atmica que incrementa
la variable semforo en 1

Semforos

Son independientes de la mquina


Son simples
Pueden trabajar con varios procesos
Pueden permitir que varios procesos entren en la
seccin crtica al mismo tiempo en caso de
necesitarse esta posibilidad
Doble uso de los semforos:
Exclusin mutua
Planificacin

Semforos

Restricciones:
El consumidor espera a que haya datos en el buffer
El productor espera a que haya buffers vacos
Slo un nico proceso puede manipular el buffer a
la vez

Semforos:
smf_llenos, smf_vacos y exmut
Inicializacin:
smf_llenos = 0
smf_vacos = nmero_de_buffers
exmut = 1

Semforos
Productor

do {
P (smf_vacos);
P (exmut);
Produce_dato,
V (exmut);
V (smf_llenos);
} while (TRUE);

Consumidor
do {
P(smf_llenos);
P (exmut);
Consume_dato;
V (exmut);
V (smf_vacos);
} while (TRUE);

Por qu el productor hace P(smf_vacos) y V(smf_llenos)?


Es importante el orden en que se ejecutan las primitivas P y V?
Cmo podemos extender el problema si hay dos consumidores?

El problema de los filsofos pensadores


El modelaje de este problema dentro del sistema
operativo, va orientado a resolver problemas de
recursos de entrada y salida del sistema.
Fue propuesto pos Edsger Dijkstra para
representar el problema de la sincronizacin de
procesos en un SO.
La interpretacin est basada en pensadores
chinos, quienes coman con dos palillos, donde se
necesita el del comensal que se siente al lado para
poder comer.

La cena de los filsofos pensadores Enunciado


Cinco filsofos se sientan alrededor de una mesa y pasan su vida cenando y
pensando. Cada filsofo tiene un plato de fideos y un palillo a la izquierda de
su plato.
Para comer los fideos son necesarios dos palillos y cada filsofo slo puede
tomar los que estn a su izquierda y derecha. Si cualquier filsofo coge un
palillo y el otro est ocupado, se quedar esperando, con el palillo en la
mano, hasta que pueda coger el otro palillo, para luego empezar a comer.
Si dos filsofos adyacentes intentan tomar el mismo palillo a una vez, se
produce una condicin de carrera: ambos compiten por tomar el mismo
palillo, y uno de ellos se queda sin comer.

Los filsofos - Analicemos


Qu ocurre si todos los filsofos toman a la vez el
palillo de la derecha?
Todos se quedarn esperando eternamente,
porque alguien debe liberar el palillo que le falta.
Nadie lo har porque todos se encuentran en la
misma situacin (esperando que alguno deje sus
palillos). Entonces los filsofos se morirn de
hambre.
Cmo denominaran esta situacin?

Los filsofos - Estados


Un filsofo solo puede tener tres estados:
Pensando
Comiendo
Con hambre
Debera haber un vector de estados y otro de
semforos (palillos) por el nmero de filsofos que
hay en la mesa.
Debera haber una variable de exclusin mutua
para entrar y salir de la seccin crtica.
La seccin crtica del problema es?

Los filsofos El problema


Ofrecer una solucin que permita a todos los
filsofos comer y pensar sin morirse de hambre.
Un filsofo en una posicin i, en la mesa, hace lo
siguiente:
while (TRUE) {
piensa();
tomar_tenedores(i);
come();
poner_tenedores(i);
}

Simbologa de ifs
== si es igual
&& significa .and. Que se cumplan ambas
condiciones
Cuando se pone (i-1) %N, es el mdulo, que es lo
que me sobra de dividir un nmero entre otro, i.e.
5%2 = 1 (es el sobrante, no el resultado)
Cuando se usa ++, estamos sumando 1
Cuando se usa --, estamos restando 1

Solucin
Tomar-Tenedores (i)
Poner-Tenedores (i)
Comprobar (i)
toma_tenedores(i
poner_tenedores(
comprobar(int i)
int i) {
nt i) {
{
P(exmut);
if (estado[i] ==
P(exmut);
HAMBRIENTO
&&
estado[i] = HAMBRIENTO;

estado[i] = PENSANDO;

estado[(i-1)%N] !=
COMIENDO
&&

comprobar(i);

comprobar((i-1)%N);

estado[(i+1)%N] !=
COMIENDO)

{
V(exmut);

comprobar((i+1)%N);

estado[i] = COMIENDO;

P(pallillo[i]);

V(exmut);

V(palillo[i]);
}

} /* Fin de
tomar_tenedores */

}/* Fin de
poner_tenedores */

} /* Fin de
comprobar */

Preguntas a responder
Cul debera ser el valor inicial de las posiciones
del vector que contiene el semforos de los
palillos?

Por qu se comprueba siempre desde la Seccin


Crtica.

Problema del barbero dormiln

Problema: En una barbera, hay M barberos y N sillas de


espera, si un cliente entra y no hay sillas, se va.
Por el contrario, si no hay clientes, el/los barbero/s
duermen hasta que llegue al menos un cliente.
Semforos:
clientes: nmero de clientes en espera sin contar el que
est en la silla del peluquero
barberos: nmero de barberos inactivos

exmut: exclusin mutua


Variable compartida:
esperando: nmero de clientes esperando
Inicio: clientes=0 barberos=0
esperando=0

exmut=1

Problema del barbero dormiln


Proceso clientes
do {
P(exmut);
do {
if (esperando < SILLAS)
P(clientes);
{
P(exmut);
esperando=esperando+1;
esperando=esperando-1;
V(clientes);
V(barberos);
V(exmut);
V(exmut);
P(barberos);
/* Se corta el pelo */
} else {
/* Corta el pelo */
V(exmut);
}
} while (TRUE);
} while (PELOLARGO);
Proceso barbero

Problema del puente estrecho

Problema: Por un puente slo pueden pasar o autos que


suben o autos que bajan.

Solucin:
Variables compartidas:
int contadorsubida = 0;
int contadorbajada = 0;
semaforo exmut_s, exmut_b, puente;
Inicializacin:
Los semforos inicialmente deben valer 1
No se tratan los problemas de inanicin

Cdigo subida

Cdigo bajada

P(exmut_b);
P(exmut_s);
contadorbajada++;/*Suma
contadorsubida++; /*Suma
uno */
1 */
if (contadorbajada==1)
if (contadorsubida==1)
P(puente);
P(puente);
V(exmut_b);
V(exmut_s);
.. Se baja el puente ..
.. Se sube el puente ..
P(exmut_b);
contadorbajada--;
P(exmut_s);
if (contadorbajada==0)
contadorsubida--;
V(puente);
if (contadorsubida==0)
V(exmut_b);
V(puente);
V(exmut_s);

Comunicacin con mensajes

Vlido para comunicacin intermquina


Definicin:
Mensaje:

parte de informacin que es pasada de un


proceso a otro
Buzn:

lugar donde se depositan los mensajes desde el


envo a la recepcin

Operaciones sobre mensajes:


Enviar
Recibir

Mtodos de Comunicacin con mensajes

Comunicacin en un nico sentido: los mensajes


fluyen en un nico sentido
Ejemplos: Tuberas de UNIX, productor-consumidor y
streams

Mtodos de Comunicacin con mensajes

Comunicacin bidireccional: los mensajes fluyen en


ambos sentidos
Ejemplos: Llamadas a procedimientos remotos (RPCs), el
modelo cliente-servidor o el de peticin-respuesta

Comunicacin con mensajes


Los procesos utilizan una pareja de servicios del
sistema operativo para comunicarse. Estos
servicios son conocidos habitualmente como Send
y Receive.
Para llevar a cabo la comunicacin un proceso
ejecuta la funcin Send y el otro Receive,
intercambiando de esta forma un bloque de
informacin que recibe el nombre de mensaje.

Ejemplos

Productor:

Consumidor:

int mensaje1[1000];
while (1) {
--Preparamos el mensaje1-enviar(mensaje1, buzn);
}

int mensaje2[1000];
while (1) {
recibir(mensaje2, buzn);
--Procesamos el mensaje2-}

Cliente:
char resp[1000];
envia("leer vax", buzon1);
recibir (resp, buzon2);

Servidor:
char orden[1000;
char resp[1000];
recibir (orden, buzon1);
enviar (resp, buzon2);

Porqu utilizar mensajes

Muchas

aplicaciones responden a este esquema

Las

partes que se comunican pueden ser completamente


independientes.
Ventajas:

Es ms difcil que se produzcan errores


Permite que los procesos no confen entre s
Las aplicaciones pueden ser escritas por programadores y en
tiempos diferentes
Los procesos pueden correr en diferentes procesadores,
conectados a travs de una red