You are on page 1of 2

SINCRONIZACION Y COMUNICACION ENTRE PROCESOS En un Sistema Operativo multitarea, sus programas se componen de mltiples partes denominadas threads, las

cuales se ejecutan de forma paralela. Debido a esto, cuando dos o ms threads intentan acceder a la vez a un mismo recurso (por ejemplo, una zona de memoria compartida), el resultado puede ser , en el mejor de los casos, impredecible. Por eso surgen los sistemas de sincronizacin entre procesos. Estos permiten establecer un sincronismo entre dos o mas threads y procesos de una forma consistente y, sobre todo, fiable y predecible. En OS/2, estos sistemas estn formados por los semforos. CONCEPTO DE SEMAFORO Un semforo es una estructura diseada para sincronizar dos o ms threads o procesos, de modo que su ejecucin se realice de forma ordenada y sin conflictos entre ellos. El por qu no se pueden usar directamente otras estructuras mas clsicas, como por ejemplo usar una variable comn para decidir si se puede o no acceder a un recurso, se debe a que estamos en un sistema multitarea: hacer esto implicara realizar una espera activa (un bucle, comprobando constantemente si la variable est o no a 0, y as saber si podemos seguir ejecutando o no). Por otro lado, puede ocurrir algo mucho peor: supongamos que un proceso comprueba la variable, y ve que el recurso est libre, por lo que procedera a cambiar dicha variable de valor y seguir. Pues bien, si justo despus de la comprobacion pero antes de que cambie el valor se conmuta de tarea (puede pasar, pues el sistema operativo puede hacerlo en cualquier momento), y el nuevo proceso comprueba la variable, como todava no se ha actualizado, creer que el recurso est libre, e intentar tomarlo, haciendo que ambos programas fallen. Lo peor del caso es que se tratar de un error aleatorio: unas veces fallar (cuando se produzca cambio de tarea en ese punto) y otras no. Para evitarlo, se idearon los semforos. Un semforo bsico es una estructura formada por una posicin de memoria y dos instrucciones, una para reservarlo y otra para liberarlo. A esto se le puede aadir una cola de threads para recordar el orden en que se hicieron las peticiones. Se empieza por inicializar la posicin de memoria a 1 (o al valor correspondiente si ese recurso concreto admite ms de un acceso simultneo). Esto se hace en el inicio del programa principal. A continuacin, cada vez que un thread o un proceso quiera acceder a dicho recurso (por ejemplo, un fichero), har primero una peticin con la primera de las llamadas disponibles. Cuando el S.O. ejecuta esa llamada, comprueba el valor que hay en la posicin de memoria del semforo, y si es distinta de cero, se limita a restarle 1 y devolver el control al programa; sin embargo, si ya es cero, duerme al proceso que hizo la peticin y lo mete en la cola de procesos, en espera de que el semforo se ponga a un valor distinto de cero. Por ltimo, cuando el proceso ha terminado el acceso al recurso, usa la segunda llamada para liberar el semforo. Cuando el S.O. la ejecuta, comprueba si la cola del semforo est vacia, en cuyo caso se limita a incrementar el valor del semforo, mientras que si tiene algn proceso, lo despierta, de modo que vuelve a recibir ciclos de CPU y sigue su ejecucin. Si haba varios procesos en espera, se irn poniendo en marcha uno tras otro a medida que el anterior va liberando el semforo. Cuando termina el ltimo, el semforo se vuelve a poner a 1. Se trata, por tanto, del mismo proceso que seguiramos con

la variable, pero con la ventaja de que es un mecanismo estandar para todos los procesos, y como es una operacion atmica (esto es, que durante su ejecucin no se admiten cambios de tarea), no surje el problema de que una conmutacin pueda producir errores aleatorios. Vemos que la primera vez que un proceso usa el semforo, este tiene valor 1, por lo que pasa a cero y el proceso puede acceder al recurso. Si durante ese tiempo otro proceso quiere acceder tambin, al usar el semforo, este tiene valor cero, por lo que el S.O. deja de darle ciclos de CPU. Cuando el primer proceso ha terminado, libera el recurso, con lo que el S.O. puede comprobar que el segundo proceso est esperando, por lo que le vuelve a dar ciclos. En este punto, el proceso sigue como si nunca hubiese sido detenido. Este tipo de semforos son los de Exclusin mtua, o Mutex. Otra utilizacin de los semforos es cuando uno o ms procesos tienen que esperar a que otro halla terminado una tarea. Para ello, el primer proceso borra el semforo y con una primitiva adecuada se pone a esperar a que el semforo se active (posted). Mientras, el segundo proceso va trabajando, y cuando termina lo que tiene que hacer, activa el semforo, con lo que el primer proceso vuelve a ponerse en marcha, sin haber desperdiciado ciclos de CPU. Son semforos evento. Vemos que puede haber varios procesos esperando por el mismo semforo, y el thread que lo activa no tiene por qu saber cuantos son. Cobran su importncia cuando el evento no es producido por otro thread, sino por otras funciones del S.O. Los semforos se identifican con un nombre, el cual tiene la forma \SEM32\un_nombre. Un_nombre es el identificador del semforo. Existe la posibilidad de crear un semforo sin nombre, en cuyo caso se puede especificar si es un semforo compartido o no (por otros procesos) .

You might also like