Tentativas de evitar o deadlock
Se o sistema for capaz de decidir se a alocação de determinado recurso é ou não segura, e só fazer a alocação quando ela for segura, teremos como evitar deadlocks.
Estados seguros e inseguros
Para escrever algoritmos que evitem deadlocks, precisamos usar informações como os Recursos existentes e os disponíveis, bem como as Matrizes de alocação corrente e a de Requisições.
Um estado é dito seguro se não provocar deadlock, e houver uma maneira de satisfazer todas as requisições pendentes partindo dos processos em execução.
Vamos exemplificar usando apenas um recurso. Na figura, temos um estado no qual A tem três instâncias de um recurso, mas pode eventualmente precisar de nove. No momento, B tem duas e pode precisar ao todo de quatro. De maneira similar, C tem duas, mas pode precisar adicionalmente de mais cinco. Existe um total de 10 instâncias deste recurso, estando sete alocadas e três livres.
O estado mostrado primeiramente (Figura a) é seguro, pois existe uma sequencia de alocações que permitem que todos os processos venham a terminar seus processamentos. Para tanto, o escalonador pode rodar B exclusivamente, até que ele precise de mais duas instâncias do recurso, levando ao estado da Figura b. Quando B termina, chegamos ao estado da Figura C. Então o escalonador pode rodar C, chegando ao estado da Figura d. Quando C termina, atingimos o estado ilustrado na Figura 3E. Agora A pode obter as seis instâncias adicionais do recurso, necessárias a que ele termine sua execução. Então o estado inicial é considerado seguro, pois o sistema, através de um escalonamento cuidadoso, pode evitar a ocorrência de deadlocks.
Se por acaso, A requisita e ganha outro recurso na Figura B. Podemos encontrar uma sequencia de alocações que funcione garantidamente. Não. Podemos então concluir que a requisição de A por um recurso adicional não deveria ser atendida naquele momento.
Um estado inseguro não leva necessariamente a um