fbpx
Wikipedia

Semáforo (informática)

Un semáforo es una variable especial (o tipo abstracto de datos) que constituye el método clásico para restringir o permitir el acceso a recursos compartidos (por ejemplo, un recurso de almacenamiento del sistema o variables del código fuente) en un entorno de multiprocesamiento (en el que se ejecutarán varios procesos concurrentemente). Fueron inventados por Edsger Dijkstra en 1965 y se usaron por primera vez en el sistema operativo THEOS[cita requerida].

Operaciones

Los semáforos sólo pueden ser manipulados usando las siguientes operaciones (éste es el código con espera activa):

Inicia(Semáforo s, Entero v) { s = v; } 

En el que se iniciará la variable semáforo s a un valor entero v.

P(Semáforo s) { if(s>0) s = s-1; else wait(); } 

La cual mantendrá en espera activa al regido por el semáforo si este tiene un valor inferior o igual al nulo.

V(Semáforo s) { if(!procesos_bloqueados) s = s+1; else signal(); } 

Estas instrucciones pueden modificarse para evitar la espera activa, haciendo que la operación P duerma al mismo proceso que la ejecuta si no puede decrementar el valor, mientras que la operación V despierta a un proceso que no es quien la ejecuta. En un pseudolenguaje más entendible, la operación P suele denominarse "wait" o "espera" y la operación V "signal" o "señal".

El porqué de los nombres de estas funciones, V y P, tiene su origen en el idioma neerlandés. "Verhogen" significa incrementar y "Proberen" probar, aunque Dijkstra usó la palabra inventada prolaag [1], que es una combinación de probeer te verlagen (intentar decrementar). El valor del semáforo es el número de unidades del recurso que están disponibles (si sólo hay un recurso, se utiliza un "semáforo binario" cuyo valor inicial es 1).

La verificación y modificación del valor, así como la posibilidad de irse a dormir (bloquearse) se realiza en conjunto, como una sola e indivisible acción atómica. El sistema operativo garantiza que al iniciar una operación con un semáforo, ningún otro proceso puede tener acceso al semáforo hasta que la operación termine o se bloquee. Esta atomicidad es absolutamente esencial para resolver los problemas de sincronización y evitar condiciones de competencia.

Si hay n recursos, se inicializará el semáforo al número n. Así, cada proceso, al ir solicitando un recurso, verificará que el valor del semáforo sea mayor de 0; si es así es que existen recursos libres, seguidamente acaparará el recurso y decrementará el valor del semáforo.

Cuando el semáforo alcance el valor 0, significará que todos los recursos están siendo utilizados, y los procesos que quieran solicitar un recurso deberán esperar a que el semáforo sea positivo, esto es: alguno de los procesos que están usando los recursos habrá terminado con él e incrementará el semáforo con un signal o V(s).

Inicia se utiliza para inicializar el semáforo antes de que se hagan peticiones sobre él, y toma por argumento a un entero. La operación P cuando no hay un recurso disponible, detiene la ejecución quedando en espera activa (o durmiendo) hasta que el valor del semáforo sea positivo, en cuyo caso lo reclama inmediatamente decrementándolo. V es la operación inversa: hace disponible un recurso después de que el proceso ha terminado de usarlo. Las operaciones P y V han de ser indivisibles (o atómicas), lo que quiere decir que cada una de las operaciones no debe ser interrumpida en medio de su ejecución.

La operación V es denominada a veces subir el semáforo (up) y la operación P se conoce también como bajar el semáforo (down), y también son llamadas signal y wait o soltar y tomar.

Para evitar la espera activa, un semáforo puede tener asociada una cola de procesos (normalmente una cola FIFO). Si un proceso efectúa una operación P en un semáforo que tiene valor cero, el proceso es detenido y añadido a la cola del semáforo. Cuando otro proceso incrementa el semáforo mediante la operación 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 ejecución.

Aplicaciones

Los semáforos se emplean para permitir el acceso a diferentes partes de programas (llamados secciones críticas) donde se manipulan variables o recursos que deben ser accedidos de forma especial. Según el valor con que son inicializados se permiten a más o menos procesos utilizar el recurso de forma simultánea.

Un tipo simple de semáforo es el binario, que puede tomar solamente los valores 0 y 1. Se inicializan en 1 y son usados cuando sólo 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 semáforo con la operación 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 semáforo realiza una operación V, algún proceso que estaba esperando comienza a utilizar el recurso.

Para hacer que dos procesos se ejecuten en una secuencia predeterminada puede usarse un semáforo inicializado en 0. El proceso que debe ejecutar primero en la secuencia realiza la operación V sobre el semáforo antes del código que debe ser ejecutado después del otro proceso. Este ejecuta la operación 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 operación V. Este modo de uso se denomina señalación (signaling), y se usa para que un proceso o hilo de ejecución le haga saber a otro que algo ha sucedido.

Ejemplo de uso

Los semáforos pueden ser usados para diferentes propósitos, entre ellos:

  • Implementar cierres de exclusión mutua o locks
  • Barreras
  • Permitir a un máximo de N threads (hilos) acceder a un recurso, inicializando el semáforo en N
  • Notificación. Inicializando el semáforo en 0 puede usarse para comunicación entre threads sobre la disponibilidad de un recurso

En el siguiente ejemplo se crean y ejecutan n procesos que intentarán entrar en su sección crítica cada vez que puedan, y lo lograrán siempre de a uno por vez, gracias al uso del semáforo s inicializado en 1. El mismo tiene la misma función que un lock.

const int n /* número de procesos */ variable semáforo s; /* declaración de la variable semáforo de valor entero*/ Inicia (s,1) /* Inicializa un semáforo de nombre s con valor 1 */ void P (int i) { while (cierto) { P(s) * En semáforos binarios, lo correcto es poner un P(s) antes de entrar en  la sección crítica, para restringir el uso de esta región del código */ /* SECCIÓN CRÍTICA */ V(s) /* Tras la sección crítica, volvemos a poner el semáforo a 1 para que otro  proceso pueda usarla */ /* RESTO DEL CÓDIGO */ } } int main() { Comenzar-procesos(P(1), P(2),...,P(n)); } 

Véase también

Enlaces externos

  • The Little Book of Semaphores by Allen B. Downey
  • Semáforos en C para linux
  •   Datos: Q221682

semáforo, informática, semáforo, variable, especial, tipo, abstracto, datos, constituye, método, clásico, para, restringir, permitir, acceso, recursos, compartidos, ejemplo, recurso, almacenamiento, sistema, variables, código, fuente, entorno, multiprocesamien. Un semaforo es una variable especial o tipo abstracto de datos que constituye el metodo clasico para restringir o permitir el acceso a recursos compartidos por ejemplo un recurso de almacenamiento del sistema o variables del codigo fuente en un entorno de multiprocesamiento en el que se ejecutaran varios procesos concurrentemente Fueron inventados por Edsger Dijkstra en 1965 y se usaron por primera vez en el sistema operativo THEOS cita requerida Indice 1 Operaciones 2 Aplicaciones 3 Ejemplo de uso 4 Vease tambien 5 Enlaces externosOperaciones EditarLos semaforos solo pueden ser manipulados usando las siguientes operaciones este es el codigo con espera activa Inicia Semaforo s Entero v s v En el que se iniciara la variable semaforo s a un valor entero v P Semaforo s if s gt 0 s s 1 else wait La cual mantendra en espera activa al regido por el semaforo si este tiene un valor inferior o igual al nulo V Semaforo s if procesos bloqueados s s 1 else signal Estas instrucciones pueden modificarse para evitar la espera activa haciendo que la operacion P duerma al mismo proceso que la ejecuta si no puede decrementar el valor mientras que la operacion V despierta a un proceso que no es quien la ejecuta En un pseudolenguaje mas entendible la operacion P suele denominarse wait o espera y la operacion V signal o senal El porque de los nombres de estas funciones V y P tiene su origen en el idioma neerlandes Verhogen significa incrementar y Proberen probar aunque Dijkstra uso la palabra inventada prolaag 1 que es una combinacion de probeer te verlagen intentar decrementar El valor del semaforo es el numero de unidades del recurso que estan disponibles si solo hay un recurso se utiliza un semaforo binario cuyo valor inicial es 1 La verificacion y modificacion del valor asi como la posibilidad de irse a dormir bloquearse se realiza en conjunto como una sola e indivisible accion atomica El sistema operativo garantiza que al iniciar una operacion con un semaforo ningun otro proceso puede tener acceso al semaforo hasta que la operacion termine o se bloquee Esta atomicidad es absolutamente esencial para resolver los problemas de sincronizacion y evitar condiciones de competencia Si hay n recursos se inicializara el semaforo al numero n Asi cada proceso al ir solicitando un recurso verificara que el valor del semaforo sea mayor de 0 si es asi es que existen recursos libres seguidamente acaparara el recurso y decrementara el valor del semaforo Cuando el semaforo alcance el valor 0 significara que todos los recursos estan siendo utilizados y los procesos que quieran solicitar un recurso deberan esperar a que el semaforo sea positivo esto es alguno de los procesos que estan usando los recursos habra terminado con el e incrementara el semaforo con un signal o V s Inicia se utiliza para inicializar el semaforo antes de que se hagan peticiones sobre el y toma por argumento a un entero La operacion P cuando no hay un recurso disponible detiene la ejecucion quedando en espera activa o durmiendo hasta que el valor del semaforo sea positivo en cuyo caso lo reclama inmediatamente decrementandolo V es la operacion inversa hace disponible un recurso despues de que el proceso ha terminado de usarlo Las operaciones P y V han de ser indivisibles o atomicas lo que quiere decir que cada una de las operaciones no debe ser interrumpida en medio de su ejecucion La operacion V es denominada a veces subir el semaforo up y la operacion P se conoce tambien como bajar el semaforo down y tambien son llamadas signal y wait o soltar y tomar Para evitar la espera activa un semaforo puede tener asociada una cola de procesos normalmente una cola FIFO Si un proceso efectua una operacion P en un semaforo que tiene valor cero el proceso es detenido y anadido a la cola del semaforo Cuando otro proceso incrementa el semaforo mediante la operacion V y hay procesos en la cola asociada se extrae uno de ellos el primero que entro en una cola FIFO y se reanuda su ejecucion Aplicaciones EditarLos semaforos se emplean para permitir el acceso a diferentes partes de programas llamados secciones criticas donde se manipulan variables o recursos que deben ser accedidos de forma especial Segun el valor con que son inicializados se permiten a mas o menos procesos utilizar el recurso de forma simultanea Un tipo simple de semaforo es el binario que puede tomar solamente los valores 0 y 1 Se inicializan en 1 y son usados cuando solo un proceso puede acceder a un recurso a la vez Son esencialmente lo mismo que los mutex Cuando el recurso esta disponible un proceso accede y decrementa el valor del semaforo con la operacion P El valor queda entonces en 0 lo que hace que si otro proceso intenta decrementarlo tenga que esperar Cuando el proceso que decremento el semaforo realiza una operacion V algun proceso que estaba esperando comienza a utilizar el recurso Para hacer que dos procesos se ejecuten en una secuencia predeterminada puede usarse un semaforo inicializado en 0 El proceso que debe ejecutar primero en la secuencia realiza la operacion V sobre el semaforo antes del codigo que debe ser ejecutado despues del otro proceso Este ejecuta la operacion P Si el segundo proceso en la secuencia es programado para ejecutar antes que el otro al hacer P dormira hasta que el primer proceso de la secuencia pase por su operacion V Este modo de uso se denomina senalacion signaling y se usa para que un proceso o hilo de ejecucion le haga saber a otro que algo ha sucedido Ejemplo de uso EditarLos semaforos pueden ser usados para diferentes propositos entre ellos Implementar cierres de exclusion mutua o locks Barreras Permitir a un maximo de N threads hilos acceder a un recurso inicializando el semaforo en N Notificacion Inicializando el semaforo en 0 puede usarse para comunicacion entre threads sobre la disponibilidad de un recursoEn el siguiente ejemplo se crean y ejecutan n procesos que intentaran entrar en su seccion critica cada vez que puedan y lo lograran siempre de a uno por vez gracias al uso del semaforo s inicializado en 1 El mismo tiene la misma funcion que un lock const int n numero de procesos variable semaforo s declaracion de la variable semaforo de valor entero Inicia s 1 Inicializa un semaforo de nombre s con valor 1 void P int i while cierto P s En semaforos binarios lo correcto es poner un P s antes de entrar en la seccion critica para restringir el uso de esta region del codigo SECCIoN CRITICA V s Tras la seccion critica volvemos a poner el semaforo a 1 para que otro proceso pueda usarla RESTO DEL CoDIGO int main Comenzar procesos P 1 P 2 P n Vease tambien EditarEl problema del barbero durmiente El problema de los filosofos Cierre de exclusion mutua Monitor concurrencia Enlaces externos EditarThe Little Book of Semaphores by Allen B Downey Semaforos en C para linux Datos Q221682Obtenido de https es wikipedia org w index php title Semaforo informatica amp oldid 132936446, wikipedia, wiki, leyendo, leer, libro, biblioteca,

español

, española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos