Beruflich Dokumente
Kultur Dokumente
Sincronizaci on
Gustavo Romero
Arquitectura y Tecnolog a de Computadores
19 de octubre de 2010
c Gustavo Romero
Sincronizaci on (1/79)
Indice
c Gustavo Romero
Sincronizaci on (2/79)
Lecturas recomendadas
Operating Systems (9, 10, 11) Fundamentos de Sistemas Operativos (4, 6, 7) Sistemas Operativos (5, 6) Sistemas Operativos Modernos (2)
c Gustavo Romero
Sincronizaci on (3/79)
Introducci on
c Gustavo Romero
Sincronizaci on (4/79)
Concurrencia (1)
Niveles:
Multiprogramaci on: gesti on de multiples procesos. Multiprocesamiento: gesti on de m ultiples hebras dentro de un proceso. Procesamiento distribuido: gesti on de m ultiples procesos sobre m ultiples m aquinas (sin memoria compartida).
Contexto:
Entre aplicaciones: originalmente ideada con este n. Dentro de una aplicaci on: conveniente en ciertos tipos de aplicaciones. Sistema operativo: las mismas ventajas que aporta a las aplicaciones son deseables aqu .
Tipos:
Monoprocesador: los procesos se entrelazan en el tiempo para ofrecer la apariencia de ejecuci on simult anea. Multiprocesador: la ejecuci on de m ultiples procesos se solapa en el tiempo.
c Gustavo Romero Sincronizaci on (5/79)
Concurrencia (2)
Problemas:
La compartici on de recursos est a plagada de peligros. La gesti on optima de los recursos es complicada. La localizaci on de errores de programaci on es muy complicada debido a su naturaleza no determinista y no reproducible.
Todos los sistemas comparten este tipo de problemas aunque algunos pueden verse agravados en m aquinas con m as de un procesador.
c Gustavo Romero
Sincronizaci on (6/79)
Conceptos importantes
Condici on de carrera: situaci on en la que el resultado de una operaci on depende del orden de ejecuci on de varias hebras. Secci on cr tica: secci on de c odigo que no pueden ejecutar varias hebras de forma concurrente. Exclusi on mutua: requisito de acceso exclusivo a recursos durante la ejecuci on de una secci on cr tica. Interbloqueo (deadlock): situaci on en la que varias hebras son incapaces de avanzar porque todas ellas est an esperando que alguna de las otras haga algo. Inanici on: situaci on en la que una hebra preparada es mantenida en dicho estado indenidamente. Circulo vicioso (livelock): situaci on en la que varias hebras cambian su estado pero sin llegar a realizar trabajo u til.
c Gustavo Romero Sincronizaci on (7/79)
Por qu e sincronizar?
c Gustavo Romero
Sincronizaci on (8/79)
Coordinaci on
Recursos compartidos
Problema b asico:
2 hebras acceden a una variable compartida. Si la variable compartida es leida y escrita por ambas hebras tendremos que coordinar el acceso.
c Gustavo Romero
Sincronizaci on (10/79)
Supongamos un saldo inicial de 1.000e. Estudiaremos el caso en que dos personas intentan retirar 100e a la vez de la misma cuenta desde dos cajeros autom aticos. Imaginemos que cada procedimiento se ejecuta como una hebra diferente. La ejecuci on de las 2 hebras podr a entrelazarse debido a la planicaci on del sistema operativo. Existe alg un problema? Cu al ser a el saldo de la cuenta tras retirar fondos?
c Gustavo Romero
Sincronizaci on (12/79)
saldo = conseguir saldo(cuenta); saldo = saldo - cantidad; almacenar saldo(cuenta, saldo); return saldo;
saldo = conseguir saldo(cuenta); saldo = saldo - cantidad; almacenar saldo(cuenta, saldo); return saldo; almacenar saldo(cuenta, saldo); return saldo;
Condiciones de carrera
El problema ocurre porque dos hebras acceden a un recurso compartido sin sincronizar su uso. Las condiciones de carrera producen resultados impredecibles. Dependen de cu ando se ejecutan las hebras, durante cu anto tiempo y de cu ando se produce el cambio entre ellas, y por supuesto, de lo que est en haciendo. El acceso concurrente a recursos compartidos debe ser controlado. Es la u nica forma de que podamos comprender el comportamiento de los programas. Necesitamos reintroducir el determinismo y la predecibilidad.
c Gustavo Romero Sincronizaci on (15/79)
Operaciones at omicas
Para comprender un programa concurrente debemos conocer qu e operaciones deber an ser indivisibles. Operaci on at omica: una operaci on que siempre se ejecuta hasta completarse o que por el contrario no inicia su ejecuci on.
Es indivisible: no puede ser detenida a mitad y luego continuar. Son la base fundamental sobre la que se crean programas multihebra y sin las que no habr a forma de hacer que funcionasen de manera correcta.
En la mayor a de los procesadores las operaciones de lectura y escritura de una palabra de memoria son at omicas. Sin embargo existen muchas instrucciones que no son at omicas:
El almacenamiento de reales grandes puede no serlo. Las instrucciones de sobre cadenas o vectores.
c Gustavo Romero Sincronizaci on (16/79)
esto...
hola, soy 918374512 hola, soy 649128354
o esto...
hola, soy hola, soy 918374512 649128354
int a = 0, b = 0; // variables compartidas void *suma(void*) { while(true) { a = a + 1; b = b + 1; } return NULL; } void *resta(void*) { while(true) { a = a - 1; b = b - 1; } return NULL; }
c Gustavo Romero
Sincronizaci on (19/79)
El c odigo que accede a variables compartidas son secciones cr ticas tras cierto tiempo a = b Compartir datos y recursos induce problemas similares. Problemas: CFLAGS = -O3? volatile?
c Gustavo Romero Sincronizaci on (20/79)
Exclusi on mutua
Debemos utilizar exclusi on mutua para sincronizar el acceso a los recursos compartidos, por ejemplo, serializando el acceso. Cualquier c odigo que utilice exclusi on mutua para sincronizar su ejecuci on es denominado secci on cr tica.
S olo una hebra puede ejecutar su secci on cr tica. El resto de hebras son forzadas a esperar a la entrada. Cuando una hebra abandona su secci on cr tica otra puede entrar.
c Gustavo Romero
Sincronizaci on (21/79)
c Gustavo Romero
Sincronizaci on (22/79)
Problemas
c Gustavo Romero
Sincronizaci on (23/79)
Dos procesos repiten indenidamente su trabajo: el productor genera datos que introduce en un b ufer. El consumidor recuperar los datos y hace algo con ellos. Hay un problema de concurrencia? = si, el consumidor no puede consumir desde un b ufer vacio.
c Gustavo Romero Sincronizaci on (24/79)
Aparecen nuevos problemas si el b ufer no es innito? = si, el productor no puede introducir datos en un b ufer lleno. Si hay m as de un productor y/o consumidor = Deben competir por el uso del b ufer con sus iguales.
c Gustavo Romero Sincronizaci on (25/79)
En una barber a trabaja un barbero que tiene un u nico sill on de trabajo y varias sillas para esperar. Cuando no hay clientes, el barbero se sienta en una silla y se duerme. Cuando llega un nuevo cliente, este o bien despierta al barbero o, si el barbero est a afeitando a otro cliente, se sienta en una silla. Si todas las sillas est an ocupadas por clientes esperando se va.
c Gustavo Romero
Sincronizaci on (26/79)
Cierto n umero de hebras acceden a memoria, unas para leer y otras para escribir. Mientras una escriba ninguna otra podr a acceder. S se permite a varias hebras leer simult aneamente. Problemas? Inconsistencia y competici on. 3 versiones: prioridad lectores, prioridad escritores y justa.
c Gustavo Romero Sincronizaci on (27/79)
c Gustavo Romero
Sincronizaci on (28/79)
Niveles de sincronizaci on
programas API de alto nivel hardware procesos/hebras cooperativos cerrojos, sem aforos, monitores, paso de mensajes load&store, deshabilitar interrupciones, test&set, compare&swap
A continuaci on veremos c omo implementar varias primitivas de sincronizaci on de alto nivel: Si las u nicas operaciones at omicas disponibles son la carga y el almacenamiento ser a m as complicado. Necesitamos primitivas u tiles a nivel de usuario.
c Gustavo Romero
Sincronizaci on (29/79)
Se nales
c Gustavo Romero
Sincronizaci on (30/79)
Los dos mecanismos se diferencian s olo ligeramente. Debemos intentar no mezclarlos. El uso habitual de las se nales es...
Una hebra desea informar a...
otra hebra o cualquier hebra o conjunto de ellas
c Gustavo Romero
Sincronizaci on (31/79)
Se nales
Denici on: mensaje entre hebras que puede provocar la ejecuci on de un procedimiento en el receptor. Tipos: Bandera:
Valor binario: 0/1, si/no,... El signicado de la bandera debe ser acordado entre las hebras en comunicaci on.
Contador:
Cada valor puede tener un signicado diferente o reejar el n umero de se nales pendientes.
C omo asegurar que la secci on a1 se ejecuta antes que b2? la secci on b2 debe esperar hasta que a1 se haya ejecutado.
c Gustavo Romero Sincronizaci on (33/79)
Tipos de soluciones
Soluciones hardware:
Instrucciones especiales del procesador. Garantizan la ejecuci on at omica.
c Gustavo Romero
Sincronizaci on (35/79)
Problemas que podremos resolver empleando se nales: El productor debe avisar al consumidor para que pueda utilizar el objeto que acaba de introducir en el b ufer. El consumidor debe avisar al productor de que ha consumido un objeto del b ufer y por lo tanto ha quedado un hueco libre. El productor debe esperar cuando el b ufer est a lleno. El consumidor debe esperar cuando el b ufer est a vac o.
c Gustavo Romero
Sincronizaci on (36/79)
void* productor(void*) { while (true) { while (contador == N); b ufer[contador] = producir(); contador = contador + 1; } }
void* consumidor(void*) { while (true) { while (contador == 0); contador = contador - 1; consumir(b ufer[contador]); } }
void* productor(void*) { while (true) { while ((entra + 1) % N == sale); b ufer[entra] = producir(); entra = (entra + 1) % N; } } Funciona? es eciente? es escalable?
void* consumidor(void*) { while (true) { while (entra == sale); consumir(b ufer[sale]); sale = (sale + 1) % N; } }
Escalabilidad
Cu ando se dice que una soluci on del problema productor/consumidor es escalable? Cuando funciona de forma efectiva para:
p 1 productores. c 1 consumidores. un b ufer de 0 < N < MAXINT elementos.
c Gustavo Romero
Sincronizaci on (39/79)
Eciencia
Cu ando se dice que una soluci on del problema productor/consumidor es eciente? Cuando funciona de forma r apida y con poca sobrecarga. La soluci on anterior no es eciente porque...
La sincronizaci on mediante espera ocupada desperdicia el tiempo del procesador. El planicador puede prevenir la ineciente espera ocupada. S olo es u til si conocemos que la espera ocupada va a ser corta.
c Gustavo Romero
Sincronizaci on (40/79)
block()
sleep() bloquear/dormir de UNIX.
unblock()
wakeup() desbloquear/despertar de UNIX.
yield()
pthread yield() ceder el procesador entre hebras. sched yield() ceder el procesador entre procesos UNIX.
c Gustavo Romero
Sincronizaci on (41/79)
Problemas: condici on de carrera (contador) e interbloqueo 1 . Mejora la eciencia: deja de utilizar espera ocupada.
1
Ser a mejor utilizar objetos se nal u objetos sincronizaci on con m etodos apropiados. Hasta ahora hemos intentado enviar se nales sin exito mediante...
espera ocupada a nivel de usuario. bloqueo a nivel del n ucleo.
c Gustavo Romero
Sincronizaci on (44/79)
Objeto se nal
implementaci on a nivel de usuario
Qu e podr a suceder si o.se~ nalar() es invocado varias veces antes que o.esperar()? se pierden se nales. Qu e podr a suceder si o.esperar() es invocado antes que o.se~ nalar()? se deber a bloquear la hebra. Funcionar a en cualquier tipo de sistema? no, exige memoria compartida. Es eciente y escalable?
c Gustavo Romero
Sincronizaci on (45/79)
void se~ nalar() { activa = true; } void esperar() { while (activa == false); activa = false; } private: bool activa; };
c Gustavo Romero Sincronizaci on (46/79)
// exige cooperaci on
void esperar() { while (activa == false) yield(); // evita espera ocupada activa = false; } private: bool activa; };
c Gustavo Romero
Sincronizaci on (47/79)
M ultiples usos de un mismo objeto se nal dentro del un mismo par de hebras.
No es efectivo ni eciente.
c Gustavo Romero
Sincronizaci on (48/79)
c Gustavo Romero
Sincronizaci on (49/79)
void esperar() { bloqueada = esta; bloquear(bloqueada); bloqueada = ninguna; // necesario? } private: hebra bloqueada; };
c Gustavo Romero Sincronizaci on (50/79)
c Gustavo Romero
Sincronizaci on (51/79)
Resumen
Problemas a un sin resolver: Las operaciones se~ nalar() y esperar() deber an ser at omicas. Evitar la espera ocupada a nivel de usuario. Sobre las soluciones vistas... Todas pueden perder se nales.
Repetidas operaciones se~ nalar() pueden sobreescribir se nales todav a no consumidas.
La operaci on se~ nalar() es as ncrona (no bloqueante) en caso de que no haya otra hebra bloqueada mediante esperar().
Existe el peligro de desbordar a otra hebra (servidor).
c Gustavo Romero
Sincronizaci on (52/79)
Observaciones: se~ nalar() es as ncrono. Hay alguna soluci on m as obvia? sincron a. Protege frente a clientes maliciosos? no.
c Gustavo Romero Sincronizaci on (53/79)
c Gustavo Romero
Sincronizaci on (54/79)
No. Casi todos los sistemas utilizan banderas. Ejemplo: varias interrupciones sucesivas podr a provocar varios cambios de hebra sucesivos.
Supongamos un sistema en que las interrupciones se producen con mucha frecuencia y las prioridades pueden anidarse C omo puede ser benecioso utilizar banderas?
c Gustavo Romero Sincronizaci on (55/79)
c Gustavo Romero
Sincronizaci on (56/79)
Sincronizaci on pura
hebra 1 ... secci on a1 { ... } s.sincronizar() secci on a2 { ... } ... hebra 2 ... secci on b1 { ... } s.sincronizar() secci on b2 { ... } ...
class sincronizaci on { private: bool activo; hebra bloqueada; public: sincronizaci on(): activo(false), bloqueada(ninguna) { }
// soy el primero
// esperar a la otra
c Gustavo Romero
Sincronizaci on (62/79)
Barrera
A Barrier Process C D B A Barrier Barrier Time (b) (c) B C D A B C D
Time (a)
Time
Uso de una barrera: (a) Las hebras se aproximan a la barrera. (b) Al llegar a la barrera las hebras se bloquean. (c) La u ltima hebra llega y provoca el desbloqueo de todas.
c Gustavo Romero Sincronizaci on (63/79)
Signicado: la hebra azul s olo puede puede continuar tras un punto de espera si las tres hebras verdes han alcanzado co de su c odigo. cierto punto espec
c Gustavo Romero Sincronizaci on (64/79)
Signicado: las hebras azules s olo puede puede continuar si la hebra verde han alcanzado cierto punto de su c odigo.
c Gustavo Romero Sincronizaci on (65/79)
c Gustavo Romero
Sincronizaci on (66/79)
La hebra azul s olo puede continuar si alguna de las dos hebras verdes alcanza cierto punto de su c odigo. Problema: C omo y d onde almacenar temporalmente las se nales?
c Gustavo Romero Sincronizaci on (67/79)
c Gustavo Romero
Sincronizaci on (68/79)
Denici on: un sem aforo es una variable entera, que aparte de la inicializaci on, s olo puede ser modicada mediante dos operaciones at omicas y mutuamente excluyentes. p() / decrementar() / esperar() Operaci on que decrementa el valor del sem aforo. v() / incrementar() / se nalar() Operaci on que incrementa el valor del sem aforo.
c Gustavo Romero
Sincronizaci on (69/79)
C omo dise nar e implementar los sem aforos con contador? Para evitar la espera ocupada... Cuando una hebra debe esperar ante un sem aforo = poner a la hebra llamadora en una cola de bloqueados en espera de un evento. La ocurrencia de un evento puede comunicarse mediante el incremento del valor del sem aforo.
c Gustavo Romero
Sincronizaci on (70/79)
Sem aforos con contador Signicado de los sem aforos con contador: Un valor positivo indica el n umero se nales emitidas. Un valor negativo indica el n umero de hebras que esperan por una se nal longitud de la cola de hebras bloqueadas en espera de una se nal. Si el contador es cero ni hay se nales emitidas ni hay hebras esperando que se produzca una se nal.
c Gustavo Romero
Sincronizaci on (71/79)
} void v() // se~ nalar() { hebra h; valor = valor + 1; h = bloq.borrar primero(); desbloquear(h); } private: int valor; cola<hebra> bloq; };
Sincronizaci on (72/79)
Se nales UNIX
Pueden lanzarse mediante la orden kill del int erprete de ordenes y la llamada al sistema kill(). No tienen un signicado ni un interfaz com un. Hay cuatro versiones diferentes:
System V unreliable BSD System V reliable POSIX
El uso de las se nales puede conducir a condiciones de carrera. La programaci on con se nales es engorrosa.
c Gustavo Romero
Sincronizaci on (73/79)
c Gustavo Romero
Sincronizaci on (75/79)
c Gustavo Romero
Sincronizaci on (76/79)
// instala la funci on manejador como manejador // de se~ nal para la se~ nal signum typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t manejador); // envia la se~ nal signum a el proceso pid int kill(pid_t pid, int signum); // env a la se~ nal signum a el proceso actual // equivalente a kill(getpid(), signum) int raise(int signum); // env a la se~ nal signum a la hebra hebra int pthread_kill(pthread_t hebra, int signum);
c Gustavo Romero Sincronizaci on (77/79)
El manejador por defecto, se ejecuta en modo usuario o modo n ucleo? depende de quien maneje el evento. Manejadores denidos por el usuario:
Implemente manejadores de se nal cortos. Tenga mucho cuidado al utilizar se nales. Muchos sistemas UNIX exigen reinstalar el manejador de se nal para poder volver a utilizarlo por segunda vez.
Detecta una posible condici on de carrera?
c Gustavo Romero
Sincronizaci on (78/79)
alarma.cc
i n t FRECUENCIA ALARMA = 1 ; // s e g u n d o s void atrapar alarma ( int ) ; // d e c l a r a c i n anticipada
// v o i d i n s t a l a r a l a r m a ( ) // i n s t a l a d o r d e l m a n e j a d o r de s e a l y a l a r m a { s i g n a l ( SIGALRM , a t r a p a r a l a r m a ) ; // e s t a b l e c e r m a n e j a d o r de l a s e a l a l a r m (FRECUENCIA ALARMA ) ; // e s t a b l e c e r a l a r m a } // v o i d a t r a p a r a l a r m a ( i n t ) // m a n e j a d o r de s e a l { i n s t a l a r a l a r m a ( ) ; // r e i n s t a l a r t r a s c a d a a l a r m a cout < < ALARMA !!! < < endl ; } // i n t main ( ) { i n s t a l a r a l a r m a ( ) ; // i n s t a l a r a l a r m a p o r p r i m e r a v e z f o r ( ; ; ) ; // b u c l e } infinito
c Gustavo Romero
Sincronizaci on (79/79)