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.[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.
Usos
[editar | editar a fonte]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.