Sistemas Operacionais FATEC-PB Professor: Gustavo Wagner [email protected] Pearson Education Sistemas Operacionais Modernos – 2ª Edição 1 Capítulo 2 Processos e Threads 2.1 Processos 2.2 Threads 2.3 Comunicação interprocesso 2.4 Problemas clássicos de IPC 2.5 Escalonamento Pearson Education Sistemas Operacionais Modernos – 2ª Edição 2 Semáforos • Dijkstra propôs, em 1965, usar uma variável inteira para contar o número de sinais de acordar para uso futuro; • A variável introduzida foi o semáforo; • Semáforo: 0: nenhum sinal foi salvo; maior que 0: quantidade de sinais pendentes; • Operações down e up (generalizações de sleep e wakeup); Pearson Education Sistemas Operacionais Modernos – 2ª Edição Semáforos • down: se for 0, o processo dorme; se for maior que 0, subtrai de um o valor da variável; • up: incrementa em 1 o valor da variável; – Essa operação não bloqueia nenhum processo; • Verificar o valor do semáforo, alterá-lo e possivelmente colocar o processo para dormir são ações atômicas; • Isso é necessário para resolver os problemas de sincronização e evitar condições de disputa; Pearson Education Sistemas Operacionais Modernos – 2ª Edição Semáforos • Usa-se a instrução TSL para garantir que múltiplas CPUs tenham acesso ao semáforo; • Como as operações sobre o semáforo duram apenas microsegundos, usar TSL não é um problema; Pearson Education Sistemas Operacionais Modernos – 2ª Edição Desafio • Qual o algoritmo para o problema do produtor-consumidor usando semáforos? Pearson Education Sistemas Operacionais Modernos – 2ª Edição Resolvendo produtor-consumidor com semáforos Pearson Education Sistemas Operacionais Modernos – 2ª Edição Usos distintos de semáforos • No caso do produtor-consumidor: full e empty são usados para sincronização; • O mutex (semáforo binário) é usado para exclusão mútua; Pearson Education Sistemas Operacionais Modernos – 2ª Edição Mutex • • • • Mutex = Mutual Exclusion; Semáforo binário: apenas 0 ou 1; Serve para exclusão mútua; Entendendo melhor interrupção de dispositivo: – Usa-se um mutex para o dispositivo, com valor inicialmente em 0; – O processo que deu um down no mutex dorme; – Quando a interrupção chega, dá-se um up no mutex; – O processo trata a resposta; Pearson Education Sistemas Operacionais Modernos – 2ª Edição Mutexes Implementação de mutex_lock e mutex_unlock Pearson Education Sistemas Operacionais Modernos – 2ª Edição Discussão sobre memória compartilhada • Solução de Peterson e algumas anteriores levam em consideração que os processos tenham memória compartilhada: buffer, turn; • Como é possível? • Para threads isso é fácil; • Para processos, há basicamente duas formas: – Armazenar essas variáveis no SO e acessar via System Call; – SO modernos (Unix, Windows) oferecem uma área de compartilhamento entre processos; – Em último caso, usa-se arquivo; Pearson Education Sistemas Operacionais Modernos – 2ª Edição Monitores • Usar semáforos é complexo, pois imagine se invertermos a ordem dos downs, no caso do produtor, e se o buffer estivesse cheio!! • Para facilitar, Hoare e Brinch propuseram uma unidade básica de sincronização de alto nível chamada monitor; • Monitor: coleção de procedimentos, variáveis e estrutura de dados agrupados num pacote; Pearson Education Sistemas Operacionais Modernos – 2ª Edição Monitores • Apenas um processo pode estar ativo num monitor em um determinado momento; • Monitor é uma construção de linguagem de programação; • Os compiladores usam semáforo binário/mutex para garantir exclusão mútua; Pearson Education Sistemas Operacionais Modernos – 2ª Edição Monitores • Garante exclusão mútua: nunca dois processos podem estar ao mesmo tempo no monitor; • Mas como garantir que um processo bloqueie se não puder continuar? – Usam-se variáveis condicionais: condition; • Um processo que deseja bloquear chama um wait sobre a variável condicional; • O processo que deseja acordar outro chama um signal; Pearson Education Sistemas Operacionais Modernos – 2ª Edição Monitores Exemplo de um monitor Pearson Education Sistemas Operacionais Modernos – 2ª Edição Monitores • Delineamento do problema do produtor-consumidor com monitores – somente um procedimento está ativo por vez no monitor – o buffer tem N lugares Pearson Education Sistemas Operacionais Modernos – 2ª Edição Monitores em java Solução para o problema do produtor-consumidor em Java Pearson Education Sistemas Operacionais Modernos – 2ª Edição Java • Desde sempre Java suportou monitores: usa-se synchronized nas assinaturas dos métodos ou em uma variável; • À partir de Java 1.5 tem-se semáforos, mutex, variáveis condicionais; Pearson Education Sistemas Operacionais Modernos – 2ª Edição