Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Semáforo

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 4

Semforo (informtica)

Un semforo es una variable especial (o tipo abstracto de datos) que constituye el mtodo clsico para restringir o permitir el acceso a recursos compartidos (por ejemplo, un recurso de almacenamiento del sistema o variables del cdigo fuente) en un entorno de multiprocesamiento (en el que se ejecutarn varios procesos concurrentemente). Fueron inventados por Edsger Dijkstra en 1965 y se usaron por primera vez en el sistema operativo THEOS.
ndice
[ocultar]

1 Operaciones 2 Usos 3 Ejemplo de uso 4 Vase tambin 5 Enlaces externos

[editar]Operaciones

Los semforos slo pueden ser manipulados usando las siguientes operaciones (ste es el cdigo con espera activa):

Inicia(Semforo s, Entero v) { s = v; }

En el que se iniciar la variable semforo s a un valor entero v.

P(Semforo s) { if(s>0) s = s-1; else wait(); }

La cual mantendr en espera activa al regido por el semforo si ste tiene un valor inferior o igual al nulo.

V(Semforo s) { if(!procesos_bloqueados) s = s+1; else signal(); }

Estas instrucciones pueden modificarse para evitar la espera activa, haciendo que la operacin P duerma al mismo proceso que la ejecuta si no puede decrementar el valor, mientras que la operacin V despierta a un proceso que no es quien la ejecuta. En un pseudolenguaje ms entendible, la operacin P suele denominarse "wait" o "espera" y la operacin V "signal" o "seal". El porqu de los nombres de estas funciones, V y P, tiene su origen en el idioma holands. "Verhogen" significa incrementar y "Proberen" probar, aunque Dijkstra us la palabra inventadaprolaag [1], que es una combinacin de probeer te verlagen (intentar decrementar). El valor del semforo es el nmero de unidades del recurso que estn disponibles (si slo hay un recurso, se utiliza un "semforo binario" cuyo valor inicial es 1). La verificacin y modificacin del valor, as como la posibilidad de irse a dormir (bloquerse) se realiza en conjunto, como una sola e indivisible accin atmica. El sistema operativo garantiza que al iniciar una operacin con un semforo, ningn otro proceso puede tener acceso al semforo hasta que la operacin termine o se bloquee. Esta atomicidad es absolutamente esencial para resolver los problemas de sincronizacin y evitar condiciones de competencia. Si hay n recursos, se inicializar el semforo al nmero n. As, cada proceso, al ir solicitando un recurso, verificar que el valor del semforo sea mayor de 0; si es as es que existen recursos libres, seguidamente acaparar el recurso y decrementar el valor del semforo. Cuando el semforo alcance el valor 0, significar que todos los recursos estn siendo utilizados, y los procesos que quieran solicitar un recurso debern esperar a que el semforo sea positivo, esto es: alguno de los procesos que estn usando los recursos habr terminado con l e incrementar el semforo con un signal o V(s).

Inicia se utiliza para inicializar el semforo antes de que se hagan peticiones sobre l, y toma por argumento a un entero. La operacin P cuando no hay un recurso disponible, detiene la ejecucin quedando en espera activa (o durmiendo) hasta que el valor del semforo sea positivo, en cuyo caso lo reclama inmediatamente decrementndolo. V es la operacin inversa: hace disponible un recurso

despus de que el proceso ha terminado de usarlo. Las operaciones P y V han de ser indivisibles (o atmicas), lo que quiere decir que cada una de las operaciones no debe ser interrumpida en medio de su ejecucin. La operacin V es denominada a veces subir el semforo (up) y la operacin P se conoce tambin como bajar el semforo (down), y tambin son llamadas signal y wait o soltar y tomar. Para evitar la espera activa, un semforo puede tener asociada una cola de procesos (normalmente una cola FIFO). Si un proceso efecta una operacin P en un semforo que tiene valor cero, el proceso es detenido y aadido a la cola del semforo. Cuando otro proceso incrementa el semforo mediante la operacin V y hay procesos en la cola asociada, se extrae uno de ellos (el primero que entr en una cola FIFO) y se reanuda su ejecucin.
[editar]Usos

Los semforos se emplean para permitir el acceso a diferentes partes de programas (llamados secciones crticas) donde se manipulan variables o recursos que deben ser accedidos de forma especial. Segn el valor con que son inicializados se permiten a ms o menos procesos utilizar el recurso de forma simultnea. Un tipo simple de semforo es el binario, que puede tomar solamente los valores 0 y 1. Se inicializan en 1 y son usados cuando slo un proceso puede acceder a un recurso a la vez. Son esencialmente lo mismo que los mutex. Cuando el recurso est disponible, un proceso accede y decrementa el valor del semforo con la operacin P. El valor queda entonces en 0, lo que hace que si otro proceso intenta decrementarlo tenga que esperar. Cuando el proceso que decrement el semforo realiza una operacin V, algn proceso que estaba esperando comienza a utilizar el recurso. Para hacer que dos procesos se ejecuten en una secuencia predeterminada puede usarse un semforo inicializado en 0. El proceso que debe ejecutar primero en la secuencia realiza la operacin V sobre el semforo antes del cdigo que debe ser ejecutado despus del otro proceso. ste ejecuta la operacin P. Si el segundo proceso en la secuencia es programado para ejecutar antes que el otro, al hacer P dormir hasta que el primer proceso de la secuencia pase por su operacin V. Este modo de uso se denomina sealacin (signaling), y se usa para que un proceso o hilo de ejecucin le haga saber a otro que algo ha sucedido.
[editar]Ejemplo

de uso

Los semforos pueden ser usados para diferentes propsitos, entre ellos:

Implementar cierres de exclusin mutua o locks Barreras

Permitir a un mximo de N threads (hilos) acceder a un recurso, inicializando el semforo en N Notificacin. Inicializando el semforo en 0 puede usarse para comunicacin entre threads sobre la disponibilidad de un recurso

En el siguiente ejemplo se crean y ejecutan n procesos que intentarn entrar en su seccin crtica cada vez que puedan, y lo lograrn siempre de a uno por vez, gracias al uso del semforo s inicializado en 1. El mismo tiene la misma funcin que un lock.

const int n entero*/ Inicia (s,1) void P (int i) {

/* nmero de procesos */

variable semaforo s; /* declaracin de la variable semforo de valor /* Inicializa un semforo con nombre s con valor 1 */

while (cierto) { P(s) antes de entrar en la seccin crtica, para restringir el uso de esta regin del cdigo*/ /* SECCIN CRTICA */ /* En semforos binarios, lo correcto es poner un P(s)

V(s)

/* Tras la seccin crtica, volvemos a poner el proceso pueda usarla */

semforo a 1 para que otro

/* RESTO DEL CDIGO */ } } int main() { Comenzar-procesos(P(1), P(2),...,P(n)); }

También podría gustarte