SEMÁFOROS Un semáforo es un mecanismo de comunicación con el cual no se mueven datos, puesto que solo se puede consultar y modificar su valor al tener un carácter puramente informativo. Dijkstra dio en 1968 una solución al prolema de la e!clusión mutua con la introducción del concept concepto o de semáfo semáforo ro inari inario. o. "stá "stá t#cnic t#cnicaa permit permitee resolv resolver er la mayor$a mayor$a de los prole prolemas mas de sincro sincroni% ni%aci ación ón entre entre proces procesos os y forma forma parte parte del dise&o dise&o de muc'os muc'os sistem sistemas as operat operativo ivoss y de len(uajes de pro(ramación concurrentes. Un semáforo inario es un indicador )*+ de condición que re(istra si un recurso está disponile o no. Un semáforo inario sólo puede tomar dos valores - y 1. *i, para un semáforo inario, * 1 entonces el recurso está disponile y la tarea lo puede utili%ar/ si * - el recurso no está disponile y el proceso dee esperar. 0os semáforos se implementan con una cola de tareas o de condición a la cual se a&aden los procesos que están en espera del recurso. *ólo se permiten tres operaciones sore un semáforo 2niciali%ar "spera )3ait+ *e&al )si(nal+ "n al(u al(uno noss te!t te!tos os,, se util utili% i%an an las las nota notaci cion ones es 4 y 5 para para las las oper operac acio iones nes de esper esperaa y se&a se&all respectivamente, ya que #sta fue la notación empleada ori(inalmente por Dijkstra para referirse a las operaciones. s$ pues, un semáforo inario se puede definir como un tipo de datos especial que sólo puede tomar los valores - y 1, con una cola de tareas asociada y con sólo tres operaciones para actuar sore #l. 0as operaciones pueden descriirse como si(ue 7 inicializa )* *emaforoinario/ v inte(er+ 4oner el valor del semáforo * al valor de v )- o 1+ 7 espera )*+ if * 1 then * else suspender la tarea que 'ace la llamada y ponerla en la cola de tareas 7 señal )*+ if la cola de tareas está vac$a then * 1 else reanudar la primera tarea de la cola de tareas 0as operaciones son procedimientos que se implementan como acciones indivisiles y por ello la comproación y camio de valor del indicador se efecta de manera real como una sola operación, lo cual 'ay que tener presente a la 'ora de dise&ar el planificador de tareas. "n sistemas con un nico procesador astará simplemente con in'iir las interrupciones durante la ejecución de las operaciones del semáforo. "n los sistemas multiprocesador, sin emar(o, este m#todo no resulta ya
que las instrucciones de los procesadores se pueden entrela%ar de cualquier forma. 0a solución está en utili%ar instrucciones 'ard3are especiales, si se dispone de ellas, o en introducir soluciones soft3are como las vistas anteriormente, que ya indicamos, que serv$an tanto para sistemas uniprocesador como para sistemas multiprocesador. 0a operación inicializa se dee llevar a cao antes de que comience la ejecución concurrente de los procesos ya que su función e!clusiva es dar un valor inicial al semáforo. Semáforos vs. Monitores
: Un semáforo es un ojeto que es utili%ado para sincroni%ar el acceso a un recurso compartido, mientras que un monitor constituye la interfa% de acceso al propio recurso compartido. : 0os monitores ofrecen mayor se(uridad )reliaility+, rouste% y escalailidad/ complementan al encapsulamiento de un ojeto, sincroni%ando el acceso al mismo. : 0os semáforos permiten limitar el nmero de procesadores que acceden concurrentemente a un recurso compartido, estaleciendo un protocolo de adquisición )wait + y lieración ) signal +.
Un proceso que corre la operación espera y encuentra el semáforo a 1, lo pone a - y prosi(ue su ejecución. *i el semáforo está a - el proceso queda en estado de espera 'asta que el semáforo se liera. Dic'o estado se dee considerar como uno más de los posiles de un proceso. "sto es as$ deido a que un proceso en espera de un semáforo no está en ejecución ni listo para pasar a dic'o estado puesto que no tiene la ;4U ni puede pasar a tenerla mientras que no se lo indique el semáforo.
=i(ura 1. , etc. *i no 'ay nin(n proceso en espera del semáforo este se deja lire )* 1+ para el primero que lo requiera.
EXCLUSION MUTUA CON SEMÁFOROS 0a e!clusión mutua se reali%a fácilmente utili%ando semáforos. 0a operación de espera se usará como procedimiento de loqueo antes de acceder a una sección cr$tica y la operación se&al como procedimiento de desloqueo. *e utili%arán tantos semáforos como clases de secciones cr$ticas se estale%can. "l proceso 41 de la sección anterior a'ora toma la forma process 41 e(in loop
espera )*+ / *ección ;r$tica se&al )*+ /
*uspendido Durmiente 0isto "spera "jecución "spera *e&al )? resto del proceso ?+ end end 41/
SINCRONIZACIÓN "l uso de semáforos 'ace que se pueda pro(ramar fácilmente la sincroni%ación entre dos tareas. "n este caso las operaciones espera y señal no se utili%an dentro de un mismo proceso sino que se dan en dos procesos separados/ el que ejecuta la operación de espera queda loqueado 'asta que el otro proceso ejecuta la operación de señal. veces se emplea la palara señal para denominar un semáforo que se usa para sincroni%ar procesos. "n este caso una señal tiene dos operaciones espera y señal que utili%an para sincroni%arse dos procesos distintos. *upon(amos que un proceso quiere que se le notifique que 'a tenido lu(ar un suceso determinado y que otro proceso es capa% de detectar que 'a ocurrido dic'o suceso/ el ejemplo si(uiente muestra como se puede implementar una sincroni%ación entre los dos procesos utili%ando un semáforo.
Ejemplo )? *incroni%ación con semáforo?+ module *incroni%ación/ var sincro semaforo/ process 41 )? 4roceso que espera ?+ begin .... espera)sincro+/ .... end 41/ process 4@ )? 4roceso que se&ala ?+ begin .... se&al)sincro+/ .... end 4@/ begin )? *incroni%ación?+ iniciali%a)sincro, -+/ cobegin 41/ 4@/ coend end *incroni%acion.
"l semáforo se iniciali%a a cero de modo que cuando el proceso 41 ejecuta la operación de espera se suspende 'asta que el proceso 4@ ejecuta la operación se&al. 0a sincroni%ación se reali%a perfectamente incluso si el proceso 4@ ejecuta la operación se&al antes de que el proceso 41 ejecute la operación de espera, ya que en este caso el proceso 4@ incrementa el semáforo y permite que 41 decremente el semáforo y si(a su ejecución cuando alcan%a la operación espera. "l ejemplo que si(ue muestra la solución que el uso de semáforos ofrece al prolema clásico del productorconsumidor. "ste prolema aparece en distintos lu(ares de un sistema operativo y
caracteri%a a aquellos prolemas en los que e!iste un conjunto de procesos que producen información que otros procesos consumen, siendo diferentes las velocidades de producción y consumo de la información. "ste desajuste en las velocidades, 'ace necesario que se estale%ca una sincroni%ación entre los procesos de manera que la información no se pierda ni se duplique, consumi#ndose en el orden en que es producida.
Ejemplo *uponemos que se tienen dos procesos 41 y 4@/ 41 produce unos datos que consume 4@. 41 almacena datos en al(n sitio 'asta que 4@ está listo para usarlos. 4or ejemplo, 41 (enera información con destino a una impresora y 4@ es el proceso (estor de la impresora que se encar(a de imprimirlos. 4ara almacenar los datos se dispone de un uffer o %ona de memoria comn al productor y al consumidor. *e supone que para almacenar y tomar datos se dispone de las funciones Poner(x) y Tomar(x). 4ara saer el estado del uffer se usan las funciones Lleno, que devuelve el valor
4roductor/ ;onsumidor/
coend end 4roductorB;onsumidor/
"l productor espera en un ucle 'asta que el uffer no est# lleno y pueda poner el dato !/ el consumidor tami#n espera en un ucle a que el uffer no est# vac$o y pueda tomar un dato. 0a solución no es satisfactoria porque 1. 0as funciones 4oner)!+ y
se&al)Colleno+/ ;onsume)!+ end end ;onsumidor/ begin
iniciali%a)ccesouffer, 1+/ iniciali%a)Colleno, 1+/ iniciali%a)Covacio, -+/ cobegin 4roductor/ ;onsumidor/ coend end 4roductorB;onsumidor/
"n la solución presentada, el acceso al uffer para tomar o poner un dato está prote(ido por las operaciones espera y señal del semáforo AccesoBuffer . ntes de ejecutar las operaciones espera(olleno) y espera(o!acio) se liera el semáforo AccesoBuffer para evitar que el sistema se loquee. "sto puede ocurrir si, por ejemplo, el productor (ana el acceso al uffer y permanece en espera de que #ste no est# lleno para poner un dato, a la ve% que el consumidor no puede acceder al uffer por tenerlo el productor y, por lo tanto, tami#n queda en espera de (anar el acceso no puediendo sacar del estado de lleno al uffer.
Monitores Un monitor es un conjunto de procedimientos que proporciona el acceso con e!clusión mutua a un recurso o conjunto de recursos )datos o dispositivos+ compartidos por un (rupo de procesos. 0os procedimientos van encapsulados dentro de un módulo que tiene la propiedad especial de que sólo un proceso puede estar activo cada ve% para ejecutar un procedimiento del monitor. "l monitor se puede ver como una valla alrededor del recurso )o recursos+, de modo que los procesos que quieran utili%arlo deen entrar dentro de la valla, pero en la forma que impone el monitor. uc'os procesos pueden querer entrar en distintos instantes de tiempo, pero sólo se permite que entre un proceso cada ve%, dei#ndose esperar a que sal(a el que está dentro antes de que otro pueda entrar. 0a ventaja para la e!clusión mutua que presenta un monitor frente a los semáforos u otro mecanismo es que #sta está impl$cita la nica acción que dee reali%ar el pro(ramador del proceso que usa un recurso es invocar una entrada del monitor. *i el monitor se 'a codificado correctamente no puede ser utili%ado incorrectamente por un pro(rama de aplicación que desee usar el recurso. ;osa que no ocurre con los semáforos, donde el pro(ramador dee proporcionar la correcta secuencia de operaciones espera y señal para no loquear al sistema. 0os monitores no proporcionan por si mismos un mecanismo para la sincroni%ación de tareas y por ello su construcción dee completarse permitiendo, por ejemplo, que se puedan usar señales para sincroni%ar los procesos. s$, para impedir que se pueda producir un loqueo, un proceso que (ane el acceso a un procedimiento del monitor y necesite esperar a una se&al, se suspende y se coloca fuera del monitor para permitir que entre otro proceso/ por ello, los procesos 4E y 46 de la fi(ura ??? esperan una condición situados fuera del monitor. Una variale que se utilice como mecanismo de sincroni%ación en un monitor se conoce como variable de condición. cada causa diferente por la que un proceso dea esperar se asocia una variale de condición. *ore ellas sólo se puede actuar con dos procedimientos espera y señal. "n este caso, cuando un proceso ejecuta una operación de espera se suspende y se coloca en una cola asociada a dic'a variale de condición. 0a diferencia con el semáforo estria en que a'ora la ejecución de esta operación siempre suspende el proceso que la emite. 0a suspensión del proceso 'ace que se liere la posesión del monitor, lo que permite que entre otro proceso. ;uando un proceso ejecuta una operación de señal se liera un proceso suspendido en la cola de la variale de condición utili%ada. *i no 'ay nin(n proceso suspendido en la cola de la variale de condición invocada la operación señal no tiene nin(n efecto. "l monitor dee usar un sistema de prioridades en la asi(nación del recurso que impida que un proceso en espera de lo(rar entrar se vea poster(ado indefinidamente por otros procesos nuevo s que deseen utili%arlo.
SINTAXIS DEL MONITOR 0a sinta!is de un monitor es como si(ue monitor nomreBmonitor/ declaración de los tipos y procedimientos que se importan y e!portan declaración de las variales locales del monitor y de las variales de condición procedure 4rc1)..+/ begin ... end/
procedure 4rc@)..+/ begin ... end/ .... procedure 4rcm)..+/ begin ... end/ begin iniciali%ación del monitor end.
"l monitor no tiene por qu# e!portar todos sus procedimientos sino sólo aquellos que sean p"#licos )puertas de entrada de las fi(uras ??? y ???+ , manteniendo como pri!ados aquellos a los que sólo pueden acceder otros procedimientos definidos dentro del monitor. 4ara indicar los procedimientos del monitor que se e!portan y actuan por lo tantos como puertas de entrada al monitor usaremos la sentencia export 4rc1, 4rc@,....,4rcn Utili%aremos la palara condición para definir las variales de condición del monitor. "l cuerpo del monitor contiene una secuencia de instrucciones de iniciali%ación que se ejecutan una sola ve% y antes de que se realice al(una llamada a los procedimientos del monitor. *e denomina condiciones a la ilioteca donde se encuentra la definición de las variales de condición y de los procedimientos espera y señal de los monitores. 0a variale ocupado indica el estado del semáforo. 4uesto que está inicialmente en falso, el primer proceso que reali%a una invocación a la operación sespera puede acceder al recurso controlado por el monitor y como la variale ocupado se pone a verdadero, cualquier otro proceso que ejecute la operación sespera dee esperar a que se ejecute una operación sseñal para poder acceder al recurso. ;uando esto ocurre la variale ocupado pasa a tener el valor falso y la condición li#re recie una se&al, lo que 'ace que uno de los procesos que esperan en su cola pase a completar la ejecución de sespera y pueda acceder al recurso. "jecuciones sucesivas de sseñal van despertando a procesos en espera 'asta que no 'aya más procesos en la cola de la condición li#re. ;uando no 'ay nin(n proceso en espera de la variale de condición la ejecución de sseñal sólo tiene por efecto poner la variale ocupado a false, lo que permite que el primer proceso que ejecute sespera pueda acceder al recurso.
Un monitor es un ojeto que implementa acceso ajo e.m a todos sus m#todos. "n Fava, son ojetos de una clase cuyos m#todos plicos son todos sync'roni%ed $ Un ojeto con m#todos s%nc&roni'ed proporciona un cerrojo que permite implantar monitores con comodidad. 0os m#todos 3ait, notify, notifyll permiten sincroni%ar el monitor, de acuerdo a la semántica de los mismos ya conocida.
manera de ejemplo se presentan al(unas funciones sore semáforos en UC2G. 0a operación de control que se va a reali%ar viene indicado por parametros cuyos posiles valores válidos son Operación H"<50
*"<50 H"<42D
H"
H"
H"<00 *"<00
24;B*<< 24;B*"<
24;BA2D
fecto ! valor devuelto Semnum 0ee el valor de un semáforo y lo Cmero de un devuelve a trav#s del nomre de la semáforo. función. 2niciali%a un semáforo a un valor Cmero de un determinado que se especifica en arg . semáforo. 0ee el 42D del ltimo proceso que Cmero de un acto sore el semáforo y lo devuelve a semáforo. trav#s del nomre de la función. 0ee el nmero de procesos que 'ay Cmero de un esperando a que se incremente el valor semáforo. del semáforo, y lo devuelve a trav#s del nomre de la función. 0ee el nmero de procesos que 'ay Cmero de un esperando a que el semáforo tome el semáforo. valor -, y lo devuelve a trav#s del nomre de la función. 0ee el valor de todos los semáforos Cmero de almacenándolos en arg . semáforos. 2niciali%a el valor de todos los Cmero de semáforos. 0os valores de iniciali%ación semáforos. deen estar en arg . 0ee la información administrativa y la almacena en arg . odifica la información administrativa para lo cual dic'a información dee estar en arg$ 2ndica al kernel que dee orrar el conjunto de semáforos. "sta operación no tiene efecto mientras que e!ista al(n proceso que #ste usando los semáforos.
"nterpretación de arg
5al
rray rray
uf
uf