Saltar ao contido

Semáforo (informática)

Na Galipedia, a Wikipedia en galego.
Semáforo
 Instancia de
 Subclase de
 Uso
Códigos e identificadores
Freebase/m/015xjd Editar o valor en Wikidata
OpenAlexC95203288 Editar o valor en Wikidata
Wikidata

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 2 Wybe Dijkstra, Edsger (setembro de 1965). "Cooperating sequential processes". Technological University, Eindhoven, The Netherlands.
  2. Stuart Tanenbaum, Andrew (2009). Sistemas Operativos Modernos. Pearson.