Ir al contenido

Diferencia entre revisiones de «Semáforo (informática)»

De Wikipedia, la enciclopedia libre
Contenido eliminado Contenido añadido
Línea 1: Línea 1:
Un '''semáforo''' es una [[Variable (programación)|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 [[multiproceso|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]].
Un '''semáforo''' es una [[Variable (programación)|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 [[multiproceso|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]].


== Operaciones ==
== Facebook ==
JOAQUIN MOLINARI
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 éste 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 [[Idioma neerlandés|holandés]]. "Verhogen" significa incrementar y "Proberen" probar, aunque Dijkstra usó la palabra inventada ''prolaag'' [http://www.cs.utexas.edu/users/EWD/ewd00xx/EWD74.PDF], 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 (bloquerse) 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 [[Instrucción atómica|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 (estructura de datos)|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.


== Usos ==
== Usos ==

Revisión del 19:46 3 abr 2014

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.

Facebook

             JOAQUIN MOLINARI

Usos

Los semáforos rojo, amarillo, verde.

                                    VERDE: 
                                          PASE.
                                 AMARILLO:
                                          PASE, PERO CON CUIDADO, DIRECTAMENTE ESPERE A QUE LE DE DENUEVO EL VERDE.
                                     ROJO:
                                          NO!! PASE NI LOCO

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 semaforo 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