Baixe o app para aproveitar ainda mais
Prévia do material em texto
Comunicação entre Processos Sistemas Operacionais Slides do Prof. Otacílio José Pereira / Marcelo Fontes Santana Unidade 1 – Gerenciamento de Processos Sincronismo e Comunicação entre processos • Até então, vimos as os conceitos de unidades de execução – Processos e – Threads • Concorrência – Se existem mais de um processo ou de uma thread executando em uma máquina, temos Threads Concorrentes Exemplo 1 • Imagine o spool de impressão de uma máquina – Existe o processo do sistema operacional que executa verificando se há algo na fila para imprimir – Existem os processos, editores de texto ou planilhas, que por vezes submetem os trabalhos para a impressão – Desta forma • Existem processos independentes (gerenciador do spoll e o editor de texto) • Que executam independentes • E precisam de trocar informações entre si Sincronismo e Comunicação entre processos • O exemplo a seguir explica de maneira genérica o cenário do spool de impressão Produtor e Consumidor • Uma das formas de compreender a troca de informações entre processos é entender o cenário de Produto e Consumidor • Produtor – Parte da aplicação ou processo que gera os dados em uma área compartilhada • Consumidor – Parta da aplicação ou processo que utiliza os dados armazenados na área compartilhada Produtor e Consumidor • Pontos de Atenção – Algumas situações devem ser evitadas diante de um cenário Produtor e Consumidor – O produtor ao gerar os dados não pode sobrescrever algum dado que ainda não foi processado pelo consumidor – O consumidor não pode processar um dado que está sendo gerado pelo processo produtor – Em geral, os processo devem sincronizar suas ações para evitar este problema • O consumidor quando lê o dado, pode notificar o produtor para gerar o novo dado • O produtor quando terminar a geração dos dados sinaliza que o dado já pode ser lido Outros cenários de concorrência • Vamos agora explorar os conceitos de – Exclusão Mútua – Seção Crítica • Para isso, vale antes observarmos dois exemplos – Processador de email – Transação de saque em caixa eletrônico Problema no Acesso Concorrente • Problema – Problema clássico do saque em conta bancária – Imagine que um saque deve ser processado – O código do saque é • Leia Saldo Conta • Diminua o Valor do Saque • Salve Novo Saldo Conta Problema no Acesso Concorrente • Problema 2 – Imagine duas threads cada uma executando um saque • A conta está com saldo de 500 • Cada thread deve sacar 500 – A primeira executa primeira linha • Lê o saldo de 500 • Após isso ela deve parar pois chegou a vez de outro processo – A segunda realiza por completo • Lê também um saldo de 500 • Realiza o saque – A primeira retoma • Com o saldo lido de 500 • Também realiza o saque – Conclusão • Com 500 em saldo • Foi permitido sacar 1000 Exclusão Mútua • O problema é que as threads estão acessando livremente dados que são compartilhados • A forma de resolver o problema é – Enquanto uma thread estiver processando um valor compartilhado – Outras threads não podem realizar uma tarefa sobre estes valores • No exemplo anterior, – Enquanto um saque estiver ocorrendo – O outro saque fica esperando a finalização do primeiro saque – Com o primeiro saque realizado, o valor do saldo estará consistente Exclusão Mútua • No exemplo que demos, a solução é que cada thread tenha um acesso exclusivo ao dado a processar • Exclusão mútua – Mecanismo garante um acesso exclusivo de uma thread a uma informação – E portanto impede que outras thread utilizem esta informação sendo processada Seção crítica • A parte do código, ou o conjunto de instruções que manipula a informação compartilhada entre os processos é denominada de Seção Crítica • O que a exclusão mútua tem que garantir é que dois processos não podem estar executando sobre uma mesma seção crítica Primitivas de Exclusão Mútua • Para implementar a exclusão mútua dentro das seções críticas, é necessário empregarmos instruções especiais • Primitivas de exclusão mútua – São estas instruções especiais que “fecham” ou “abrem” o acesso a determinada informação – Essas instruções devem encapsular as regiões críticas para que haja a exclusão mútua – Em pseudocódigo, são basicamente duas operações: • entradaExclusãoMutua() • saidaExclusaoMutua() • desabilitarInterrupções() Primitivas de Exclusão Mútua • Exemplo no código 1 • EntradaExclusaoMutua() • LOAD mailCount • ADD 1 • STORE mailCount • SaidaExclusaoMutua() • Neste caso a variável mailacount não pode ser acessada por outras threads • Exemplo no código 2 • EntradaExclusaoMutua() • Leia Saldo Conta • Diminua o Valor do Saque • Salve Novo Saldo Conta • SaidaExclusaoMutua() • Neste caso o saldo não pode ser acessado por outras threads Implementação por Semáforos • Uma das formas de se implementar a exclusão mútua é o mecanismo de semáforo • Um semáforo é – Uma variável protegida – Só pode ser acessada por duas operações básicas • Esperar : Para entrar na seção crítica • Sinalizar : Para sair da seção crítica – Estas operações são indivisíveis Implementação por Semáforos • A variável é inicializada com 1 – S = 1 , isto é o Semáforo está aberto • A operação Esperar(S) executa o seguinte – Se S > 0 • S = S -1 – Senão • A thread fica numa fila de espera • Perceba que esta operação “Fecha o Semáforo” – S = 0 Implementação por Semáforos • Um código típico para o uso de semáforos é – SaldoOcupado = Semaforo – Esperar (SaldoOcupado) – Leia Saldo Conta – Diminua o Valor do Saque – Salve Novo Saldo Conta – Sinalizar (SaldoOcupado) • Quando mais de um processo tentar realizar saque, eles vão esperar no semáforo Problemas da Exclusão Mútua • Adiamento Indefinido – Uma thread sempre é adiada em detrimento de outra – Solução • Organizar a estratégia da fila • Deadlock – Um processo tenta acessar a seção crítica de outro processo e este tenta acessar a seção crítica do primeiro – Solução • Escolher um processo para finalizar Slide 1 Slide 2 Slide 3 Slide 4 Slide 5 Slide 6 Slide 7 Slide 8 Slide 9 Slide 10 Slide 11 Slide 12 Slide 13 Slide 14 Slide 15 Slide 16 Slide 17 Slide 18
Compartilhar