Please enable JavaScript.
Coggle requires JavaScript to display documents.
Cap 10 : Coordenação entre Tarefas - Coggle Diagram
Cap 10 : Coordenação entre Tarefas
O problema da concorrência
Quando duas ou mais tarefas acessam simultaneamente um recurso compartilhado podem ocorrer problemas de consistência de dados ou estado do recurso
Ex: duas operações de depósito em um saldo bancário. Elas manipulam as mesma variáveis
Condições de disputa: erros ou inconsistências gerados por acessos concorrentes de dados compartilhados. Erros dinâmicos, não aparecem no código fonte, somente em algumas execuções
Condições de Bernestein
duas tarefas t1 e t2 podem ser executadas em paralelo quando
t1 não lê as variáveis escritas por t2
t2 não lê as variáveis escritas por t1
t1 e t2 não escrevem nas mesmas variáveis
condições de disputa só ocorrem quando há ao menos uma operação de escrita
Seções Críticas: trechos de código que acessam dados compartilhados onde podem ocorrer condições de disputa
Exclusão Mútua
Exclusão Mútua: Apenas uma tarefa pode estar em sua seção crítica por vez, excluindo o acesso das demais a essa região
Espera Limitada: uma tarefa que aguarda o acesso a uma seção crítica deve ter acesso em um tempo finito, não pode ocorrer inanição.
Definir os limites para a seção crítica (enter e leave)
Independência de outras tarefas: a decisão sobre o uso da seção crítica devem depender somente daquelas que querem fazer uso dela
Independência de fatores físicos: a solução deve ser puramente lógica e não depender de velocidade de execução etc.
Inibição de Interrupções
Uma tarefa impede todas as outras trocas de contexto quando entra na seção crítica
a preempção deixa de funcionar, caso a tarefa entre em um loop infinito o sistema todo é bloqueado. Uma tarefa pode travar o sistemas
dispositivos de entrada/saída deixam de ser atendidos ; perda de dados por rede por exemplo
a tarefa dentro da seção crítica não pode fazer operações de entrada/saída, estes dispositivos estão impedidos
só funciona em sistemas monoprocessados, em multicore pode ocorrer acesso simultâneo
A Solução Trivial
Usar uma variável busy para indicar se a seção crítica está ocupada
O problema é que o teste da variável e sua atribuição são feitos em momentos diferentes, assim caso ocorra uma troca de contexto nesse momento poderá haver uma condição de disputa envolvendo a vaiável busy
O teste contínuo da variável busy consome muito processador. Espera ocupada deve ser evitada por ser ineficiente
Alternância de uso
Variável turno que indica de quem é a vez de entrar na seção crítica. Deve ser ajustada cada vez que uma tarefa sai da seção para indicar a próxima que poderá usá-la
Garante a exclusão mútua e não depende de fatores externos, mas caso uma tarefa não deseje usar a seção todas as outras ficarão impedidas de acessá-la
O algoritmo de Peterson
Uma solução correta para o problema para o problema de exclusão mútua entre DUAS tarefas
Pode falhar em arquiteturas que permitam execução fora de ordem. Nesse caso é preciso incluir mais uma instrução
Existem generalizações para mais de duas tarefas
Operações Atômicas
Instruções em código de máquina que permitem testar e atribuir um valor a uma variável de forma atômica, indivisível
TSL: Test-and-SetLock em processadores antigos. Processadores modernos usam instruções RMW(Read-Modify-Write), como CAS e XCHG
Muito usadas no interior do sistema operacional, mas como se tratam de mecanismos de espera ocupada são inadequadas para construção de aplicações de usuário
Problemas
As soluções apresentadas até agora sofrem com alguns problemas
Ineficiência: as tarefas que aguardam o acesso a uma seção crítica ficam testando continuamente uma condição, consumindo tempo do processador sem necessidade. Seria correto suspender essas tarefas
Injustiça: não há garantia de ordem no acesso à seção crítica. Uma tarefa pode entrar e sair de seção várias vezes antes que outras consigam acessá-la
Dependência: Tarefas podem ser impedidas de acessar a seção crítica por tarefas que não tem interesse naquele momento
Por isso as soluções de espera ocupada são pouco usadas na construção de aplicações, seu maior uso se encontra no núcleo do SO e em sistemas de computação dedicados