Baixe o app para aproveitar ainda mais
Prévia do material em texto
SISTEMAS OPERACIONAIS Izabelly Soares de Morais Alocação de recursos e deadlocks Objetivos de aprendizagem Ao final deste texto, você deve apresentar os seguintes aprendizados: � Identificar os princípios de alocação de recursos e deadlock. � Reconhecer técnicas de prevenção ao deadlock. � Identificar técnicas de recuperação do deadlock. Introdução Vamos analisar nossas necessidades atuais e verificar quais atividades de seu cotidiano dependem de um recurso computacional? Aposto que quase todas, já que, hoje em dia, mal conseguimos decorar nosso próprio número telefônico. Neste capítulo, você vai lidar com alguns contextos voltados para a alocação de recursos pelos processos que executamos ao utilizarmos as funcionalidades oferecidas pelo sistema operacional que utilizamos. Você vai conhecer também os principais conceitos que tratam de um evento que pode ou não ocorrer — dependendo da demanda de acesso aos recursos — e que pode paralisar um computador: o deadlock. Além dos motivos que podem ocasionar este fator, você vai aprender sobre prevenção e recuperação de um deadlock. Alocação de recursos e deadlock Conforme Silberschatz, Galvin e Gagne (2015), talvez a melhor ilustração de um deadlock possa ser extraída de uma lei outorgada pela legislatura do Kansas, no início do século XX. Ela dizia, em parte: “Quando dois trens se aproximam um do outro em um cruzamento, ambos devem parar completamente e nenhum dos dois deve ser posto em marcha novamente até que o outro tenha partido.” O relato anterior se refere ao momento em que os processos solicitam, quase simultaneamente, acesso ao mais variado tipo de recursos. Complementando a analogia, imagine que você está no trânsito, em horário de pico, num momento em que todos estão tentando se locomover por um único caminho. Aqui, caracteriza-se, claramente, um congestionamento no trânsito. Ainda sob a ótica de Silberschatz, Galvin e Gagne (2015), um processo deve solicitar um recurso antes de usá-lo e deve liberar o recurso após. O processo pode solicitar tantos recursos quantos precisar para executar sua tarefa. É claro que o número de recursos solicitados não pode exceder o número total de recursos disponíveis no sistema. Em outras palavras, um processo não pode solicitar três impressoras, se o sistema tem apenas duas. Sob condições normais de operação, um processo pode utilizar um recurso obedecendo somente à seguinte sequência: 1. Solicitação — o processo solicita o recurso. Se a solicitação não puder ser atendida imediatamente (por exemplo, se o recurso estiver sendo usado por outro processo), o processo solicitante deve esperar até que possa adquirir o recurso. 2. Uso — o processo pode operar sobre o recurso (por exemplo, se o recurso for uma impressora, o processo pode imprimir na impressora). 3. Liberação — o processo libera o recurso. Deadlock é a situação em que um processo aguarda por um recurso que nunca estará disponível ou um evento que não ocorrerá. Essa situação é consequência, na maioria das vezes, do compartilhamento de recursos, como dispositivos, arquivos e registros, entre processos concorrentes em que a exclusão mútua é exigida. O problema do deadlock torna-se cada vez mais frequente e crítico na medida em que os sistemas operacionais evoluem no sentido de implementar o paralelismo de forma intensiva e permitir a alocação dinâmica de um número ainda maior de recursos (MACHADO; MAIA, 2013, p. 119). Na Figura 1, a seguir, o autor retrata bem a situação em que ocorre um deadlock. Alocação de recursos e deadlocks2 Figura 1. Espera circular. Fonte: Machado e Maia (2013, p.119). Ainda conforme Machado e Maia (2013, p. 119), a figura acima, ilustra graficamente o problema do deadlock entre os processos PA e PB, quando utilizam os recursos R1 e R2. Inicialmente, PA obtêm acesso exclusivo de R1, da mesma forma que PB obtêm de R2. Durante o processamento, PA necessita de R2 para poder prosseguir. Como R2 está alocado a PB, PA ficará aguardando que o recurso seja liberado. Em seguida, PB necessita utilizar R1 e, da mesma forma, ficará aguardando até que PA o libere. Como cada processo está esperando que o outro libere o recurso alocado, é estabelecida uma condição conhecida como espera circular, caracterizando uma situação de deadlock. O exemplo retratado na Figura 1 traz uma demonstração bem simples de uma deadlock. Sabemos, porém, que os sistemas operacionais estão a cada dia mais complexos, disponibilizando mais funcionalidades aos usuários. Dessa forma, é natural que, em ambientes de multiprogramação, diversos processos sejam executados quase que simultaneamente e que suas funcionalidades acabem necessitando, consequentemente, de muito mais recursos. 3Alocação de recursos e deadlocks A situação denominada de deadlock tem início quando um processo ne- cessita de um recurso e realiza sua solicitação. Caso os recursos estejam disponíveis, o processo irá entrar em estado denominado de espera. Nesse estado, geralmente aguarda que ocorra algo como, por exemplo, o recebimento de um sinal, ou a finalização de um evento de entrada e saída. Nem sempre, porém, o processo consegue voltar ao estado anterior, ou seja, ao que ele estava antes de entrar em espera, já que os recursos que ele havia solicitado se encontram reservados para outros processos que também estavam em espera. Para que ocorra a situação de deadlock, quatro condições são necessárias simultaneamente (COFFMAN; ELPHICK; SHOSHANI, 1971 apud MA- CHADO; MAIA, 2013, p. 120), como observa-se a seguir. 1. Exclusão mútua — cada recurso só pode estar alocado a um único processo em um determinado instante. 2. Espera por recurso — um processo, além dos recursos já alocados, pode estar esperando por outros recursos. 3. Não preempção — recursos concedidos previamente a um processo não podem ser tomados à força desse processo, eles devem ser explicitamente liberados pelo processo que os retém. 4. Espera circular — um processo pode ter de esperar por um recurso alocado a outro processo, e vice-versa. Técnicas para prevenção de deadlock Anteriormente, listamos as quatro condições para que o deadlock ocorra. Como prevenção, devemos ter em mente que, caso alguma destas quatro condições não ocorra, também o deadlock não ocorre. Portanto, de acordo com Silbers- chatz, Galvin e Gagne (2015), algumas situações em relação a cada condição citada anteriormente, previnem que haja o deadlock, como listamos abaixo: � Exclusão mútua — a condição de exclusão mútua deve estar presente para que o deadlock aconteça. Isto é, pelo menos um recurso deve ser não compartilhável. Recursos compartilháveis, por outro lado, não requerem acesso mutuamente exclusivo e, portanto, não podem estar envolvidos em um deadlock. Machado e Maia (2013, p. 120) comple- mentam as ideias de Silberschatz, Galvin e Gagne (2015) relatando que a ausência da primeira condição (exclusão mútua) certamente acaba com o problema do deadlock, pois nenhum processo terá que esperar Alocação de recursos e deadlocks4 para ter acesso a um recurso, mesmo que já esteja sendo utilizado por outro processo. � Retenção e espera — para assegurar que a condição de retenção e espera nunca ocorra no sistema, devemos garantir que, sempre que um processo solicitar um recurso, ele não esteja retendo qualquer outro recurso. Um protocolo que podemos usar requer que cada processo solicite e receba todos os seus recursos antes de começar a ser executado. Podemos implementar essa providência requerendo que as chamadas de sistema que solicitem recursos para um processo precedam todas as outras chamadas de sistema. � Inexistência de preempção — se um processo está retendo alguns re- cursos e solicita outro recurso que não possa ser alocado imediatamente a ele (isto é, o processo deve esperar), então todos os recursos que o processo esteja retendo no momento sofrem preempção. � Espera circular — a quarta e última condição para a ocorrênciade deadlocks é a condição de espera circular. Uma forma de assegurar que essa condição jamais ocorra é impor uma ordem absoluta a todos os tipos de recursos e requerer que cada processo solicite recursos em uma ordem de enumeração crescente. Um método alternativo para impedir deadlocks é requerer informações adicionais sobre como os recursos devem ser solicitados. Por exemplo, em um sistema com um drive de fita e uma impressora, o sistema pode precisar saber que o processo P solicitará primeiro o drive de fita e depois a impressora, antes de liberar os dois recursos, en- quanto o processo Q solicitará primeiro a impressora e então o drive de fita. Com esse conhecimento da sequência completa de solicitações e liberações de cada processo, o sistema pode decidir, para cada solicitação, se o processo deve ou não esperar para que seja evitado um possível deadlock no futuro. Cada solicitação requer que, ao tomar essa decisão, o sistema considere os recursos correntemente disponíveis, os recursos correntemente alocados a cada processo e as futuras solicitações e liberações de cada processo (SILBERSCHATZ; GALVIN; GAGNE, 2015). Podemos acrescentar que existem algumas situações em que o deadlock pode ser evitado. Claro que nem sempre é possível definir com certeza como os processos e seus respectivos recursos serão administrados pelo sistema 5Alocação de recursos e deadlocks operacional, pois existem contextos em que, embora existam padrões esperados de comportamento, estes nem sempre se cumprem. Um estado é seguro se o sistema pode alocar recursos a cada processo (até o seu máximo) em alguma ordem e continuar evitando um deadlock. Mais formalmente, um sistema está em um estado seguro somente se existe uma sequência segura. Um estado seguro não é um estado de deadlock. Inversa- mente, o estado de deadlock é um estado inseguro. Nem todos os estados inseguros são deadlocks. Um estado inseguro pode levar a um deadlock. Enquanto o estado for seguro, o sistema operacional poderá evitar estados inseguros (e deadlocks). Em um estado inseguro, o sistema operacional não pode impedir que os processos solicitem recursos de tal modo que ocorra um deadlock. O comportamento dos processos controla os estados inseguros (SILBERSCHATZ; GALVIN; GAGNE, 2015). Outra possível alternativa retratada pelos autores se refere à alocação de recursos. Podemos contar com um sistema de alocação de recursos com apenas uma instância de cada tipo de recurso. Dessa forma, a alocação de recursos não estaria apta a gerar um deadlock. Algumas outras possíveis soluções podem ser citadas, como a utilização de algoritmo do grafo de alocação de recursos, e nesse contexto, verificar se estss algoritmos trazem a possibilidade de serem aplicáveis em um sistema de alocação de recursos com diversas instâncias referentes a cada tipo de recurso. O algoritmo do grafo de alocação de recursos não é aplicável a um sistema de alocação de recursos com múltiplas instâncias de cada tipo de recurso. O algoritmo do banqueiro possui este nome porque poderia ser usado em um sistema bancário para assegurar que o banco nunca alocasse seu dinheiro disponível de tal modo que não pudesse mais satisfazer as necessidades de todos os seus clientes. Quando um novo processo entra no sistema, ele deve declarar o número máximo de instâncias de cada tipo de recurso de que ele pode precisar. Esse número não pode exceder o número total de recursos no sistema. Quando um usuário solicita um conjunto de recursos, o sistema deve determinar se a alocação desses recursos o deixará em um estado seguro. Se deixar, os recursos serão alocados. Caso contrário, o processo deve esperar até que algum outro processo libere recursos suficientes (SILBERSCHATZ; GALVIN; GAGNE, 2015). Alocação de recursos e deadlocks6 Técnicas para recuperação de deadlock Após a ocorrência do deadlock, o sistema operacional deve possuir meios para se recuperar. Um dos passos que podem ser executados é quebrar a espera circular, já que ela ocorre devido à espera pela liberação dos recursos por parte dos processos. Conforme Machado e Maia (2013, p. 121), a eliminação dos processos envolvidos no deadlock e, consequentemente, a liberação de seus recursos podem não ser simples, dependendo do tipo do recurso envolvido. Se um processo estiver atualizando um arquivo ou imprimindo uma listagem, o sistema deve garantir que esses recursos sejam liberados sem problemas. Os processos eliminados não têm como ser recuperados, porém outros processos, que antes estavam em deadlock, poderão prosseguir a execução. A escolha do processo a ser eliminado é feita, normalmente, de forma aleatória ou, então, com base em algum tipo de prioridade. Este esquema, porém, pode consumir considerável tempo do processador, ou seja, gerar elevado overhead. Complementando as ideias de Machado e Maia (2013), Silberschatz, Galvin e Gagne (2015) afirmam que, quando um algoritmo de detecção determina que existe um deadlock, várias alternativas estão disponíveis. Uma possi- bilidade é informar ao operador que ocorreu um deadlock e deixá-lo lidar com o problema manualmente. Outra possibilidade é permitir que o sistema se recupere do deadlock automaticamente. Há duas opções para a interrupção de um deadlock. Uma é simplesmente abortar um ou mais processos para romper a espera circular. A outra é provocar a preempção de alguns recursos de um ou mais dos processos em deadlock. Para isso, são listadas algumas particularidades referentes a essas duas possibilidades: � Encerramento de processos — para eliminar deadlocks abortando um processo, usamos um entre dois métodos. Nos dois métodos, o sistema reclama todos os recursos alocados aos processos encerrados. ■ Abortar todos os processos em deadlock — esse método claramente romperá o ciclo do deadlock, mas a um alto custo. Os processos em deadlock podem ter sido executados por muito tempo e os resultados dessas computações parciais devem ser descartados e provavelmente terão que ser refeitos posteriormente. ■ Abortar um processo de cada vez até que o ciclo do deadlock seja eliminado — esse método incorre em overhead considerável, já que após cada processo ser abortado, um algoritmo de detecção 7Alocação de recursos e deadlocks de deadlocks deve ser invocado para determinar se algum outro processo ainda está em deadlock. � Preempção de recursos — para eliminar deadlocks usando a preempção de recursos, provocamos a preempção sucessiva de alguns recursos dos processos e damos esses recursos a outros processos até que o ciclo do deadlock seja rompido. Se a preempção for necessária para lidarmos com os deadlocks, então três questões devem ser abordadas: 1. Seleção de uma vítima — Que recursos e que processos devem sofrer preempção? Como no encerramento de processos, devemos determinar a ordem da preempção para minimizar o custo. Fatores de custo po- dem incluir parâmetros como o número de recursos que um processo em deadlock está retendo e quanto tempo o processo levou para ser executado até o momento. 2. Reversão — Se provocarmos a preempção de um recurso de um pro- cesso, o que deve ser feito com esse processo? É claro que ele não pode continuar a ser executado normalmente, pois algum recurso necessário está faltando. Devemos reverter o processo para algum estado seguro e reiniciá-lo a partir desse estado. Já que, em geral, é difícil determinar o que é um estado seguro, a solução mais simples é uma reversão total: abortar o processo e então reiniciá-lo. Embora seja mais eficaz reverter o processo somente até onde for necessário para interromper o deadlock, esse método requer que o sistema mantenha mais informações sobre o estado de todos os processos em execução. 3. Inanição — Como assegurar que a inanição não ocorrerá? Isto é, como podemos garantir que os recursos interceptados não serão sempre do mesmo processo? Em um sistema em que a seleção da vítima é baseada principalmente em fatores decusto, pode ocorrer que o mesmo processo seja sempre selecionado como vítima. Como resultado, esse processo nunca completará sua tarefa, uma situação de inanição que deve ser resolvida em qualquer sistema. É claro que devemos assegurar que um processo possa ser selecionado como vítima apenas um número finito (pequeno) de vezes. A solução mais comum é incluir o número de reversões no fator de custo. Alocação de recursos e deadlocks8 Sistemas operacionais como Linux, Windows e Mac OS X irão: � Prevenir a ocorrência de deadlocks no interior do próprio SO. � Ignorar sua ocorrência em processos de usuários, e deixar que eles resolvam, manualmente, o problema (muito provavelmente encerrando um dos processos envolvidos). MACHADO, F. B.; MAIA, L. P. Arquitetura de sistemas operacionais. 5. ed. Rio de Janeiro: LTC, 2013. SILBERSCHATZ, A.; GALVIN, P. B.; GAGNE, G. Fundamentos de sistemas operacionais. 9. ed. Rio de Janeiro: LTC, 2015. Leituras recomendadas DELGADO, J.; RIBEIRO, C. Arquitetura de computadores. 5. ed. Rio de Janeiro: LTC, 2017. PAIXÃO, R. R. Arquitetura de computadores – PCs. São Paulo: Érica, 2014. STALLINGS, W. Arquitetura e organização de computadores. 8. ed. São Paulo: Pearson, 2009. TANEMBAUM, A. Organização estruturada de computadores. 6. ed. São Paulo: Pearson, 2013. 9Alocação de recursos e deadlocks Conteúdo:
Compartilhar