Saltar ao contido

Semáforo (informática)

Na Galipedia, a Wikipedia en galego.

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.[1]

Operacións

[editar | editar a fonte]

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

  • wait (P): Decrementa o valor do semáforo nunha unidade. Se o novo valor do semáforo é negativo, o proceso que execute a operación wait é bloqueado. De non ser así, continúa a súa execución con normalidade.
  • signal (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[1], 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

[editar | editar a fonte]

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.

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.[2]

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.

  1. 1,0 1,1 Wybe Dijkstra, Edsger (setembro de 1965). "Cooperating sequential processes". Technological University, Eindhoven, The Netherlands. 
  2. Stuart Tanenbaum, Andrew (2009). Sistemas Operativos Modernos. Pearson.