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