Baixe o app para aproveitar ainda mais
Prévia do material em texto
Sistemas Operacionais Prof. Fernando Eryck 2012.2 Redes de Computadores SUMÁRIO � Sincronização de Processos Comunicação Interprocessos �Processos precisam se comunicar com outros processos � Quando há a necessidade de comunicação entre processos, ocorre a comunicação interprocessos (interprocess communication – IPC)– IPC) � Processos concorrentes: �Acessam informações em comum �Dados compartilhados �Na memória principal �Em um arquivo de dados, etc. �Não é possível determinar a ordem em que os eventos vão ocorrer Comunicação Interprocessos �Alguma forma de sincronização entre processos é necessária �Garantir a sequência adequada para a execução dos eventos � Um processo espera para adquirir o recurso compartilhado (Wait) �O processo quando termina de usar o recurso compartilhado emite um �O processo quando termina de usar o recurso compartilhado emite um sinal (signal) Sincronização e comunicação entre processos Comunicação Interprocessos �Os mecanismos que garantem a comunicação entre processos concorrentes e o acesso a recursos compartilhados são chamados de mecanismos de sincronização. �Problemas de Compartilhamento de RecursosProblemas de Compartilhamento de Recursos � Exemplos: Venda de passagem Spool de Impressão Dois processos querem ter acesso simultaneamente à memória compartilhada Comunicação Interprocessos �Problemas de Compartilhamento de Recursos (cont.) � Exemplos: Venda de passagem Dois processos (sistemas) querem ter acesso simultaneamente a um único processo (passagem)compartilhado Comunicação Interprocessos – Condições de Disputa �Condições de disputa ou de corrida - são situações onde 2 ou mais processos estão acessando dados compartilhados, e o resultado final do processamento depende de quem é executado primeiro. �Como evitar as Condições de Disputa? É preciso de um mecanismo que evite que dois ou mais processos leiam e É preciso de um mecanismo que evite que dois ou mais processos leiam e escrevam a mesma variável/arquivo simultaneamente Comunicação Interprocessos – Regiões Críticas �Exclusão Mútua - é o modo de evitar que dois ou mais processos tenham acesso simultaneamente a alguma região crítica (variável ou um arquivo compartilhado) que já estiver em uso por um processo � impede que dois ou mais processos acessem um mesmo recurso ao mesmo tempo; �Enquanto um processo acessar um recurso, os outros processos devem esperar até que o primeiro processo termine o acesso. Comunicação Interprocessos – Regiões Críticas �Regiões Críticas – Nome dado a parte do código do programa onde é feito o acesso ao recurso compartilhado � Quatro condições necessárias para prover exclusão mútua: � Nunca dois processos podem estar simultaneamente em uma região crítica; � Nenhuma afirmação pode ser feita sobre velocidade ou número de CPUs; � Nenhum processo executando fora de sua região crítica pode bloquear outros processos; � Nenhum processo deve esperar eternamente para entrar em sua região crítica; Comunicação Interprocessos – Regiões Críticas Exclusão mútua usando regiões críticas Problemas de Sincronização � Velocidades muito diferentes dos processos: �Podem causar problema de solução de sincronização entre processos. �Ex: Problema processo produtor / consumidor. � Starvation (Indefinitely Postponed): �Um processo nunca consegue executar sua região crítica e acessar o recurso compartilhado. �Outros processos são sempre prioritários. �Processos são selecionados de forma aleatória � Há possibilidade de um processo nunca ser escolhido �Solução: � Criação de filas de pedidos � Primeiro a entrar é o primeiro a sair (FIFO) Soluções para Exclusão Mútua com espera ociosa � Desabilitação das interrupções: � Cada processo deve inibir as interrupções logo após entrar em uma região crítica, habilitando-as imediatamente antes de sair dela.imediatamente antes de sair dela. � Evita Interrupções de relógios � Problema �Multiprogramação pode ficar comprometida � Processos poderia desabilitar as interrupções e não habilitá-las posteriormente. � Ineficiente para sistemas multiprocessados, devido ao tempo de propagação de sinalização para habilitar ou desabilitar as interrupções Soluções para Exclusão Mútua com espera ociosa � Instrução Test-and-Set � Para coordenar o acesso concorrente a um recurso, utiliza-se uma variável lógica global, Lock (Bloqueio). � Se a variável Bloqueio for falsa, qualquer processo � Se a variável Bloqueio for falsa, qualquer processo poderá alterar seu valor para verdadeiro através da instrução test-and-set acessando o recurso de forma exclusiva � Lock=0 (processo pode alterar para 1 e entra na região crítica) � Lock=1 (processo está impedido de entrar na região crítica) Soluções para Exclusão Mútua com espera ociosa � Instrução Test-and-Set (cont.) � Problema � Processo P1 lê o valor de lock e ela está igual a 0 e a seguir ele é interrompido, antes de alterar seu a seguir ele é interrompido, antes de alterar seu valor para 1. � Processo P2 lê o valor de lock=0 e muda para 1, podendo entrar em sua região crítica. P2 é interrompido e a execução volta pra P1. � P1 atribui lock=1 e entra em sua região crítica � P1 e P2 estão na mesma região crítica. Soluções para Exclusão Mútua com espera ociosa � Instrução Test-and-Set (cont.) � Problema (cont.) � Starvation Soluções para Exclusão Mútua com espera ociosa � Alternância obrigatória � Uma variável, no código abaixo, representada por vez, estabelece de quem é a vez de entrar na região crítica. � Inicialmente vez=0 e o processo P0 inicia a execução e entra na região crítica.entra na região crítica. � O processo P1 tenta entrar na região crítica e verifica que vez=0 ficando bloqueado � P1 verifica constantemente o valor da variável compartilhada aguardando ela passar para 1 (um) para com isso ganhar o acesso a região crítica � Este tempo e processamento gasto por P1 testando continuamente o valor da variável vez é chamado de espera ociosa (busy waiting). � Espera ociosa deve ser evitada pois gasta tempo de CPU Soluções para Exclusão Mútua com espera ociosa � Alternância obrigatória � Na espera ociosa toda vez que um processo não consegue entrar em sua região crítica, por já existir outro processo acessando o recurso, o processo permanece em looping, até que lhe seja permitido. � Ao sair da RC o processo 0 altera o valor da variável vez para 1 e libera o acesso a RC para o processo 1. while (TRUE) { while (vez != 0) /* espera */ regiao_critica (); vez = 1; regiao_nao_critica (); } (a) Processo 0 while (TRUE) { while (vez != 1) /* espera */ regiao_critica (); vez = 0; regiao_nao_critica (); } (b) Processo 1 Soluções para Exclusão Mútua com espera ociosa � Alternância obrigatória � Problema � Um processo pode ser impedido de entrar na Região Crítica mesmo com o outro estando fora da Região CríticaCrítica � Violação da condição 3 = Nenhum processo executando fora de sua região crítica pode bloquear outros processos Soluções para Exclusão Mútua com espera ociosa � Solução de Peterson � Em 1981, G.L. Peterson, descobriu uma técnica de se obter a exclusão mútua sem a obrigatoriedade da alternância. � Funcionamento: � Antes de entrar em sua região crítica cada processo � Antes de entrar em sua região crítica cada processo deve chamar enter_region, com seu número de processo, 0 ou 1, como parâmetro. � Imagine que o processo 0 chame a função enter_region para manifestar seu interesse em entrar na RC, alterando interested[process] =TRUE e coloca a váriável turn=0.� Nesse instante o outro processo P1 não está interessado em entrar em sua região crítica, portanto, o procedimento retorna imediatamente. Soluções para Exclusão Mútua com espera ociosa � Solução de Peterson � Caso P1 chame enter_region ele ficará bloqueado até que interested [0]=FALSE. � Tal situação acontecerá somente quando P0 chamar a função leave_region.função leave_region. � Problema � Espera Ocupada # include “prototypes.h” # define FALSE 0 # define TRUE 1 # define N 2 int turn; int interested[N]; void enter_region (int process) { { int other; other = 1 – process; interested [process] = TRUE; /*MOSTRA INTERESSE PELA RC*/ turn = process; while (turn == process && interested[other] == TRUE) } void leave_region (int process) { interested[process] = FALSE; /*SAÍDA DA RC*/ Soluções para Exclusão Mútua com espera ociosa � Bloqueio e Desbloqueio de Processos: SLEEP/WAKEUP � A solução de Peterson é correta, mas apresenta o defeito de precisar da espera ociosa. � Implementação: quando um processo não pode entrar na região crítica ele é posto para executar um loop até que seja região crítica ele é posto para executar um loop até que seja permitido entrar na região. � Algumas primitivas que bloqueiam o processo em vez de gastar tempo CPU são conhecidas como: SLEEP/WAKEUP � SLEEP: é uma chamada ao sistema que bloqueia o processo que chamou = suspende a execução do processo até que outro processo o desperte �WAKEUP: utiliza o parâmetro ID do processo a ser despertado Soluções para Exclusão Mútua com espera ociosa � Problema do Produtor-Consumidor ou do Buffer Limitado � Exemplo para ilustrar a primitivas SLEEP/WAKEUP � Nesta situação dois processos compartilham um buffer comum e de tamanho fixo. � Um deles, o produtor, põe informação dentro do buffer, e o � Um deles, o produtor, põe informação dentro do buffer, e o outro, consumidor retira. � Problema � Origina quando o produtor quer colocar um novo item no buffer, mas ele está cheio. � Solução � Colocar o produtor para dormir e só despertá-lo quando o consumidor remover um ou mais itens. Soluções para Exclusão Mútua com espera ociosa � Problema do Produtor-Consumidor ou do Buffer Limitado � Solução(cont.) � Da mesma maneira, se o consumidor quiser remover um item do buffer e perceber que o mesmo está vazio, ele dormirá até que o produtor coloque algo no buffer e ele dormirá até que o produtor coloque algo no buffer e o desperte. Soluções para Exclusão Mútua com espera ociosa # define N 100 int count = 0; void producer(void) { int item; void consumer(void) { int item; while (TRUE){ if (count == 0) sleep (); int item; while (TRUE){ item = produce_item( ); if (count == N) sleep(); insert_item(item); count = count + 1; if (count == 1) wakeup(consumer); /*Buffer estava vazio? Se sim, consumidor esta dormindo*/ } } while (TRUE){ if (count == 0) sleep (); item = remove_item( ); count = count - 1; if (count == N -1) wakeup (producer); /*Buffer estava cheio? Se sim, logo produtor esta dormindo*/ consume_item (item); } } Soluções de Software para Exclusão Mútua �Semáforos (Counting Semaphores); �Semáforos Binários (Mutual Exclusion Semaphores); �Mutex; �Monitores�Monitores �Deadlocks
Compartilhar