Semáforo (informática)

En informática, un semáforo é unha variable especial protexida que ten como función o control de acceso a recursos compartidos nun ambiente multitarefa. Os semáforos foron inventados por Edsger Dijkstra no ano 1965.

 Operacións 
As dúas operacións básicas que se realizan con semáforos son as seguintes:

  (P): Decrementa o valor do semáforo nunha unidade. Se o novo valor do semáforo é negativo, o proceso que execute a operación  é bloqueado. De non ser así, continúa a súa execución con normalidade.
  (V): Incrementa o valor do semáforo nunha unidade. Tras o aumento, se o valor previo do semáforo era negativo (i.e., hai procesos esperando para usar o recurso), desbloquéase a un deles.

Estas dúas operacións deben ser atómicas ou indivisibles, é dicir, mentres un proceso estea executando unha destas dúas operacións, ningún outro proceso pode executar outra operación sobre o mesmo semáforo, tendo que esperar a que o primeiro proceso acabe a súa operación sobre o semáforo. A condición de atomicidade evita condicións de carreira entre os procesos.

No seu traballo orixinal, Dijkstra usou as letras P e V para denominar as operacións, primeiras letras das palabras neerlandesas proberen (probar) e verhogen (incrementar). En textos sobre computación, é frecuente atopar as denominacións down e up, respectivamente. En Enxeñaría do Software, os termos máis empregados son wait e signal. 

 Algoritmos 
As operacións wait e signal impleméntanse como segue.
 P(semaphore S): //wait
     repeat:
         [if S ≥ 0:
         S ← S--
         break]

 V(semaphore S): //signal
     [S++]
Esta implementación sinxela inclúe espera activa: se o valor do semáforo é menor ou igual ca 0, o proceso que executa a operación P consome CPU ata que se consuma o seu quantum. Para evitala, pode facerse que o proceso que realice a operación P se bloquee se non se pode decrementar o valor, e que o proceso que execute a operación V esperte a un dos procesos que estean esperando.

 Usos 
Os semáforos empréganse para xestionar o acceso as seccións críticas dos programas, é dicir, rexións de código que deben ser accedidas polos procesos segundo certa orde e lóxica. Un exemplo típico (abordado por Dijkstra no seu traballo) é o problema do produtor-consumidor.

Cando un semáforo se inicializa a 1, garante que un único proceso execute certa porción de código, é dicir, actúa como un semáforo binario ou mutex.

 Notas 

Categoría:Informática