O bom desempenho de variadíssimas aplicações depende do recurso a actividades independentes, os processos. No entanto, porque apresentam uma grande autonomia, é necessário garantir uma boa sincronização de forma a que se consiga conduzir as suas actividades ao fim pretendido.
São 2 as razões que podem conduzir à sincronização explicita de processos:
cooperação | competição por um recurso |
A cooperação existente entre
processos
revela-se quando, para que um processo realize execute um dado excerto de
código, tenha de aguardar que um outro processo, termine alguma tarefa
primeiro.
É o caso de uma linha de montagem num ambiente fabril: para que o segundo funcionário possa executar o seu trabalho tem de esperar que o seu colega faça a parte que lhe compete.
Um dos mecanismos disponibilizados pelos sistemas operativos são os
signals.
Durante a execução de um programa, pode ser necessário, a mais do que
um processo, aceder a um mesmo recurso. No entanto, se esse acesso for em
simultâneo, tal concorrência, não sendo bem controlada, pode conduzir a
inconsistências.
Por exemplo, consideremos um processo P1 que acede ao disco para
leitura. Findo o seu tempo de CPU, ele suspende a sua actividade, dando lugar
a um outro processo, P2, que necessita de ir escrever noutra posição. Quando
a P1, volta a ser atribuído tempo de processador, este vai recomeçar a sua
leitura no local onde se encontra a cabeça. Dado que esta tinha sido
movimentada por P2, os dados que irão ser lidos, não serão os correctos.
Este situação só poderia ser resolvida se o disco fosse reservado para cada
processo até que este o libertasse finda a sua actuação.
Este cenário retrata um caso particular da Competição por um Recurso,
Exclusão Mútua
ou, simplesmente, Mutex, onde apenas se pode permitir o acesso individual ao
recurso em causa.
Para que a Competição por um Recurso decorra sem qualquer problema são, normalmente,
usados
semáforos
que permitem, ou não, o acesso de um ou mais processos à
secção crítica.