Algoritmo do banqueiro

O Algoritmo do banqueiro é um algoritmo de alocação de recursos com prevenção de impasses desenvolvido por Edsger Dijkstra que testa a segurança pela simulação da alocação do máximo pré-determinado possível de montantes de todos os recursos computacionais, e em seguida faz uma verificação de estados-seguros para testar a possibilidade de condições de impasse para todas as outras atividades pendentes, antes de decidir se a alocação deve prosseguir. O algoritmo foi desenvolvido no durante o projeto do sistema operacional THE e originalmente descrito (em Holandês) em EWD108. O nome é por analogia a maneira com que os banqueiros respondem por constrangimentos de liquidez. Algoritmo O algoritmo do banqueiro é executado pelo sistema operacional quando um processo de computação requisita recursos.. O algoritmo impede o impasse, ao negar ou adiar o pedido se ele determinar que aceitar o pedido pode colocar o sistema em um estado inseguro (onde um impasse poderia ocorrer). Quando um novo processo entra em um sistema, ele deve declarar o número máximo de instâncias de cada tipo de recurso que não pode exceder o número total de recursos no sistema.

Recursos
Para o algoritmo do banqueiro trabalhar, ele precisa saber três coisas:
• • •

Quanto de cada recurso cada processo poderia solicitar Quanto de cada recurso cada processo atualmente detém Quanto de cada recurso o sistema tem disponível

Recursos podem ser atribuídos a um processo somente se forem preenchidas as seguintes condições: 1.Pedido ⇐ máximo, senão ajuste a condição de erro definida como o processo ultrapassou a quantidade máxima feita por ele. 2.Pedido ⇐ disponível senão o processo tem que esperar até que mais recursos estejam disponíveis. Alguns dos recursos que são controlados em sistemas reais são memória, semáforos e interfaces de acesso. Exemplo Supondo que o sistema distingue quatro tipos de recursos, (A, B, C e D), o seguinte é um exemplo de como esses recursos poderiam ser distribuídos. Note que este exemplo mostra o sistema em um instante antes de um novo pedido de recursos chegar. Além disso, os tipos e número de recursos são abstraídos. Sistemas reais, por exemplo, lidariam com quantidades muito maiores de cada recurso.
Recursos do sistema disponíveis são: A B C D

ou quantos recursos ele terá solicitado até então. recursos atualmente disponíveis A) { while (P não vazio) { boolean achou = false for each (processo p in P) { Cp = atual alocação de recursos para o processo(p) Mp = requisito máximo de recursos para o processo(p) if (Mp − Cp ≤ A) { // p pode obter tudo de que necessita. o sistema assume que todos os processos acabarão por tentar adquirir o máximo de seus recursos previstos e encerrar logo depois. termina. // Suponha que ele faz isso.3 1 1 2 Processos (recursos atualmente alocados): A B C D P1 1 2 2 1 P2 1 0 3 3 P3 1 1 1 0 Processos (máximo de recursos): A B C D P1 3 3 2 2 P2 1 2 3 4 P3 1 1 5 0 Estados seguros e inseguros Um estado (como no exemplo acima) é considerada seguro se é possível para todos os processos concluir sua execução (terminar). Esta é uma suposição razoável na maioria dos casos uma vez que o sistema não está particularmente preocupado com o tempo que cada processo é executado (pelo menos não numa perspectiva de prevenção de deadlocks). Além disso. Qualquer estado onde tal conjunto não existe é definido como um estado inseguro. A = A + Cp remove_elemento_do_conjunto(p. Dada esta premissa. a aquisição de seus recursos máximos e depois o seu término (retornando os seus recursos para o sistema). tentando encontrar um conjunto hipotético de pedidos pelos processos que permitiriam a cada. P) achou = true } } if (not achou) { return INSEGURO } } return SEGURO } . Pseudocódigo function algoritmo_do_banqueiro(conjunto de processos P. Desde que o sistema não pode saber quando o processo será encerrado. se um processo termina sem adquirir o seu máximo de recursos. isto só torna mais fácil para o sistema. o algoritmo determina se um estado é seguro. e libera o que ele já tem.