Sie sind auf Seite 1von 22

Sincronizaci on entre procesos Problemas cl asicos

Fernando Schapachnik
Departamento de Computaci on, FCEyN, Universidad de Buenos Aires, Buenos Aires, Argentina

Sistemas Operativos, primer cuatrimestre de 2012

Fernando Schapachnik

Problemas cl asicos de sincronizaci on entre procesos

(2) Siempre los mismos problemas...


En muchas areas de la computaci on hay problemas cl asicos. Eso signica que aparecen una y otra vez bajo diferentes formas, pero son b asicamente el mismo problema. En el caso de sincronizaci on entre procesos tambi en sucede que muchos de estos problemas nos suelen inducir a pensar en soluciones incorrectas. Por eso est a bueno estudiarlos y conocer buenas formas de solucionarlos. Adem as, analizarlos suele aportar una mirada bastante profunda sobre problemas fundamentales de la computaci on, y a veces, del razonamiento humano. OJO: conocer los problemas cl asicos y sus soluciones no debe ser una excusa para la pereza. Los problemas concretos tienen particularidades y contextos que hacen necesario evaluarlos de manera individual y pensar en cada caso. ! Dicho de otra forma, el conocimiento no reemplaza a la inteligencia. Ambos se complementan.
Fernando Schapachnik Problemas cl asicos de sincronizaci on entre procesos

(3) Los turnos

Problema:
Tenemos una serie de procesos Pi , i {1 . . . N } que se est an ejecutando en simult aneo (supongamos que tenemos N CPUs). Cada proceso i tiene una sentencia si . Queremos que en el sistema global se ejecuten s 1, s 2, . . . , sN .

De qu e nos disfrazamos? Podemos utilizar sem aforos.

Fernando Schapachnik

Problemas cl asicos de sincronizaci on entre procesos

(4) Los turnos (cont.)


Listing 1: Inicializaci on
proc i n i t () { f o r ( i= 0 ; i <N+1; i ++) s e m a f o r o s [ i ]= new S e m aforo ( 0 ) ; f o r ( i= 0 ; i <N ; i ++) f o r k P( i ) ; semaforos [ 0 ] . s i g n a l ( ) ; }

Listing 2: Proceso Pi
p r o c P( i ) { s e m a n t= s e m a f o r o s [ i ] ; s e m s i g= s e m a f o r o s [ i + 1 ] ; sem ant . wait ( ) ; s( i ); sem sig . s i g n a l ( ) ; }
Fernando Schapachnik Problemas cl asicos de sincronizaci on entre procesos

(5) Barrera - Rendezvous

Otro problema muy com un es el de rendezvous (punto de encuentro), o barrera de sincronizaci on. Dados Pi = [a(i ); b(i )], i {1 . . . N }, asegurarse que los b(i ) se ejecuten reci en despu es de que se ejecutaron todos los a(i ). Es decir, queremos poner una barrera entre los a y los b. Sin embargo, no hay que restringir de m as: no hay que imponer ning un orden entre los a(i ) ni entre los b(i ).

Fernando Schapachnik

Problemas cl asicos de sincronizaci on entre procesos

(6) Rendezvous (cont.)

Listing 3: Inicializaci on
proc i n i t () { e n b a r r e r a= 0 ; // Cant . de p r o c s en l a b a r r e r a . mutex= new S e m a f o r o ( 1 ) ; // P e r m i t o empezar de i n m e d i a t o . b a r r e r a= new S e m aforo ( 0 ) ; f o r ( i= 0 ; i <N ; } i ++) f o r k P( i ) ;

Fernando Schapachnik

Problemas cl asicos de sincronizaci on entre procesos

(7) Rendezvous (cont.)


Listing 4: Proceso Pi
p r o c P( i ) { a( i ); mutex . w a i t ( ) ; // A c c e s o a v a r . c o m p a r t i d a . e n b a r r e r a ++; b o o l t o d o s e n b a r r e r a= ( e n b a r r e r a==N ) ; mutex . s i g n a l ( ) ; i f ( todos en barrera ) // Todos e s t a n l i s t o s p a r a c o n t i n u a r . Que s i g a n . barrera . signal (); barrera . wait ( ) ; b( i ); }

Esta soluci on no es correcta. Qu e est a mal?


Fernando Schapachnik Problemas cl asicos de sincronizaci on entre procesos

(8) Rendezvous (cont.)


En el ejemplo anterior hab a deadlock. ! Listing 5: Proceso Pi (correcto)
p r o c P( i ) { a( i ); mutex . w a i t ( ) ; // A c c e s o a v a r . c o m p a r t i d a . e n b a r r e r a ++; b o o l t o d o s e n b a r r e r a= ( e n b a r r e r a==N ) ; mutex . s i g n a l ( ) ; i f ( todos en barrera ) // Todos e s t a n l i s t o s p a r a c o n t i n u a r . Que s i g a n . barrera . signal (); barrera . wait ( ) ; barrera . signal (); b( i ); }

Notar que hay un signal() de m as.


Fernando Schapachnik Problemas cl asicos de sincronizaci on entre procesos

(9) Rendezvous (cont.)


Otra soluci on, si contamos con la primitiva broadcast(). Listing 6: Proceso Pi (correcto)
p r o c P( i ) { a( i ); mutex . w a i t ( ) ; // A c c e s o a v a r . c o m p a r t i d a . e n b a r r e r a ++; b o o l t o d o s e n b a r r e r a= ( e n b a r r e r a==N ) ; mutex . s i g n a l ( ) ; i f ( todos en barrera ) // Todos e s t a n l i s t o s p a r a c o n t i n u a r . Que s i g a n . barrera . broadcast ( ) ; else barrera . wait ( ) ; b( i ); }

Fernando Schapachnik

Problemas cl asicos de sincronizaci on entre procesos

(10) Secci on cr tica de a k


Siguiente problema. N procesos, s olo k ejecutan a la vez la secci on cr tica sc (i ). Es f acil: Listing 7: Inicializaci on
proc i n i t () { sem= new S e m aforo ( k ) ; f o r ( i= 0 ; i <N ; } i ++) f o r k P( i ) ;

Listing 8: Proceso Pi
p r o c P( i ) { sem . w a i t ( ) ; sc ( i ) ; sem . s i g n a l ( ) ; }
Fernando Schapachnik Problemas cl asicos de sincronizaci on entre procesos

(11) Apareamiento
Vamos a presentar una versi on no cl asica de un problema cl asico. Est a el Crucero de Noel, donde queremos guardar parejas de distintas especies (no s olo una por especie). Hay una puerta por cada especie. Los animales forman la en cada puerta, en dos colas, una por sexo. Queremos que entren en parejas. Tarea: programar el c odigo de cada proceso P (i, sexo). Pista: usar dos sem aforos y la funci on entrar(i). Tarea adicional: una u nica puerta, pero tiene que coincidir la especie. Ojo con el deadlock!

Fernando Schapachnik

Problemas cl asicos de sincronizaci on entre procesos

(12) Lectores/escritores

Otro problema m as. Se da mucho en bases de datos. Hay una variable compartida. Los escritores necesitan acceso exclusivo. Pero los lectores pueden convivir. C omo podr a solucionarse?

Fernando Schapachnik

Problemas cl asicos de sincronizaci on entre procesos

(13) Lectores/escritores (cont.)


Listing 9: Inicializaci on
proc i n i t () { s t a e s l a que t o d o s s e d i s p u t a n . v a r i a b l e c o m p a r t i d a ; // E mutex= new S e m aforo ( 1 ) ; a c c e s o e x c l u s i v o= new S e m aforo ( 1 ) ; i n t l e c t o r e s= 0 ; f o r ( i= 0 ; i <N ; i ++) f o r k L e c t o r ( i ) ; f o r ( i= 0 ; i < M; i ++) f o r k E s c r i t o r ( i ) ; }

Los escritores necesitan acceso exclusivo, sin vueltas: Listing 10: Escritores
proc E s c r i t o r ( i ) { a c c e s o e x c l u s i v o . wait ( ) ; E s c r i b i r ( compartida ) ; acceso exclusivo . signal (); }
Fernando Schapachnik Problemas cl asicos de sincronizaci on entre procesos

(14) Lectores/escritores (cont.)


Listing 11: Lectores
proc Lector ( i ) { mutex . w a i t ( ) ; l e c t o r e s ++; i f ( l e c t o r e s ==1) // Soy e l p r i m e r o , r e c l a m o a c c e s o e x c l u s i v o p a r a // t o d o s l o s l e c t o r e s . a c c e s o e x c l u s i v o . wait ( ) ; mutex . s i g n a l ( ) ; Leer ( compartida ) ; mutex . w a i t ( ) ; l e c t o r e s ; i f ( l e c t o r e s ==0) // Soy e l u l t i m o , d e j o que e n t r e n l o s acceso exclusivo . signal (); mutex . s i g n a l ( ) ; }

escritores .

Fernando Schapachnik

Problemas cl asicos de sincronizaci on entre procesos

(15) Lectores/escritores (cont.)

Puede haber deadlock? No, pero puede haber inanici on de escritores. Tarea: pensar c omo evitarlo.

Fernando Schapachnik

Problemas cl asicos de sincronizaci on entre procesos

(16) Fil osofos que cenan


Este problema lo invent o Dijkstra en 1965. Tenemos 5 l osofos en una mesa circular, con deos en el medio y un tenedor entre cada l osofo. Para comer necesitan dos tenedores. Los l osofos hacen:
proc F i l osofo ( i ) while ( true ) { pensar ( ) ; conseguir tenedores ( i ); comer ( ) ; dejar tenedores ( i ); }

Problema: programar conseguir tenedores() y dejar tenedores() de manera tal que:


EXCL) DEAD) INAN) CONC) S olo un l osofo tenga cada tenedor en cada momento. No haya deadlock. No haya inanici on. M as de un l osofo est e comiendo a la vez.
Fernando Schapachnik Problemas cl asicos de sincronizaci on entre procesos

(17) Fil osofos que cenan

Empecemos por algunas deniciones b asicas: Macros c omodas para los tenedores:
izq(i) = i der(i) = (i + 1) mod 5

Qu e son los tenedores? Seguro que hay que garantizar acceso exclusivo a ellos: Un arreglo: tenedores[i]= new Sem aforo(1)

Fernando Schapachnik

Problemas cl asicos de sincronizaci on entre procesos

(18) Soluci on ing enua


Empecemos por la idea m as elemental:
func c o n s e g u i r t e n e d o re s ( i ) { tenedores [ izq ( i ) ] . wait ( ) ; tenedores [ der ( i ) ] . wait ( ) ; } func d e j a r t e n e d o r e s ( i ) { tenedores [ izq ( i ) ] . signal (); tenedores [ der ( i ) ] . s i g n a l ( ) ; }

Est a bien? Esta soluci on garantiza EXCL, pero falla con DEAD. C omo rompemos el deadlock? Pensemos en las condiciones. Tarea: pensar en soluciones para este problema. Buscar las ya existentes.
Fernando Schapachnik Problemas cl asicos de sincronizaci on entre procesos

(19) Barbero

Otro problema cl asico: En una peluquer a hay dos salas, una de espera, con n sillas y otra donde est a la u nica silla donde el u nico peluquero corta el pelo. Si no hay clientes, el peluquero se duerme una siesta. Si entra un cliente, y no se puede sentar a esperar, se va. Si el peluquero est a dormido, lo despierta.

Fernando Schapachnik

Problemas cl asicos de sincronizaci on entre procesos

(20) Barbero (cont.)

Vamos a usar tres sem aforos:


a l g u n c l i e n t e= new S e m aforo ( 0 ) ; p a s a r= new S e m aforo ( 0 ) ; mutex= new S e m aforo ( 1 ) ; c l i e n t e s= 0 ;

El peluquero es sencillo:
proc Peluquero while ( true ) { a l g u n c l i e n t e . wait ( ) ; pasar . s i g n a l ( ) ; cortar pelo (); }

Fernando Schapachnik

Problemas cl asicos de sincronizaci on entre procesos

(21) Barbero (cont.)


Veamos a los clientes:
proc C l i e n t e () // Hay l u g a r ? C a p a c i d a d = n + 1 ( a l que l e c o r t a n ) mutex . w a i t ( ) ; i f ( c l i e n t e s==n+1) // No , me v o y . mutex . s i g n a l ( ) ; r e t i r a r s e ( ) ; // No v u e l v e // S hay l u g a r , e n t r o . c l i e n t e s ++; mutex . s i g n a l ( ) ; // A v i s o que l l e g u e. algun cliente . signal (); // E s p e r o a que me d e j e n p a s a r . pasar . wait ( ) ; e n t r a r a c o r t a r s e e l p e l o ( ) ; // Todo p a r a e s t o ! // S a l g o . mutex . w a i t ( ) ; c l i e n t e s ; mutex . s i g n a l ( ) ;
Fernando Schapachnik Problemas cl asicos de sincronizaci on entre procesos

(22) Bibliograf a

The Little Book of Semaphores, Second Edition. Allen B. Downey. http://greenteapress.com/semaphores/ Cooperating sequential processes. Edgar W. Dijkstra. Technical Report 123, Univ. Texas. http://www.cs.utexas. edu/users/EWD/transcriptions/EWD01xx/EWD123.html.

Fernando Schapachnik

Problemas cl asicos de sincronizaci on entre procesos

Das könnte Ihnen auch gefallen