Faculdade Pernambucana FAPE Sistemas Operacionais Prof. Flávio Gonçalves da Rocha Comunicação entre Processos A solução de Peterson O algoritmo de Peterson fornece exclusão mútua Cada processo antes de entrar na memória compartilhada (região crítica) chama enter_region com seu próprio número como parâmetro (pode haver espera) Depois que terminou de trabalhar com as variáveis compartilhadas o processo chama leave_region para indicar que terminou Comunicação entre Processos A solução de Peterson para obter exclusão mútua Comunicação entre Processos A Instrução TSL Muitos computadores, especialmente aqueles projetados com múltiplos processadores em mente têm uma instrução TEST AND SET LOCK (TSL – Testa e Configura bloqueio) Para utilizar a instrução TSL é usada uma variável compartilhada chamada lock. Quando lock é 0 qualquer processo pode configurá-lo como 1 utilizando a instrução TSL e, então, ler ou gravar a memória compartilhada. Quando termina, o processo configura lock de volta para 0 utilizando uma instrução uma instrução MOVE comum. Comunicação entre Processos A Instrução TSL enter_region: tsl register,lock cmp register,#0 jne enter region ret leave_region: move lock, #0 ret | copia lock para o registrador e o configura como 1 | lock era zero? | se não era zero, o bloqueio estava configurado, então inicia um laço | retorna para aquele que fez a chamada; entrada na região crítica | armazena um 0 no bloqueio (lock) | retorna para aquele que fez a chamada Comunicação entre Processos Sleep e Wakeup Tanto a solução de Peterson como a solução que utiliza TSL são corretas mas têm o defeito de necessitarem de espera ativa. O processo espera em laço até que a entrada seja permitida (Desperdiça CPU e pode gerar o problema da inversão de prioridade) Algumas primitivas de comunicação interprocesso bloqueiam o processo quando ele não pode entrar na sua região crítica Uma das mais simples é o par SLEEP e WAKEUP Comunicação entre Processos Sleep e Wakeup SLEEP Chamada de sistema que causa o bloqueio do processo que fez a chamada WAKEUP Possui um parâmetro que indica qual processo deve ser acordado Comunicação entre Processos Sleep e Wakeup O Problema Consumidores dos Produtores e Também conhecido como o problema do buffer associado Dois processos compartilham um buffer de tamanho fixo. Um deles, o produtor, coloca as informações em um buffer e o outro, o consumidor, pega-as Problema surge quando o produtor quer colocar um novo item no buffer, mas este último já está cheio. Solução é fazer o produtor dormir até que o buffer tenha espaço Comunicação entre Processos Sleep e Wakeup O Problema Consumidores dos Produtores e De modo semelhante o consumidor deve dormir se o buffer estiver vazio até que o produtor coloque algo no buffer e o acorde. Essa solução pode levar a condição de corrida uma que vez que há uma variável que controla o nº de itens no buffer, a variável count (compartilhada). O produtor e o consumidor testam e manipulam count O problema é que numa condição de corrida, haverá a possibilidade de em um dado momento ambos os processos (produtor e consumidor) estarem dormindo Comunicação entre Processos O problema dos produtores e consumidores com uma condição de corrida fatal Comunicação entre Processos Sleep e Wakeup O Problema dos Produtores e Consumidores Um bit de espera por despertar pode ser utilizado mas, nos casos em que há três ou mais processos um bit torna-se insuficiente sendo necessário tantos outros de acordo com o nº de processos (o problema persiste então) Comunicação entre Processos Semáforos Em 1965 Dijkstra sugeriu utilizar uma variável inteira, chamada de Semáforo, para contar o número de wakeups salvos para uso futuro Semáforo igual a 0 indica que nenhum wakeup foi salvo Semáforo for igual a algum valor positivo se um ou mais wakeups estivessem pendentes Propôs duas operaçoes: DOWN e UP DOWN – verifica se o valor é maior que 0. Se for diminui o valor e simplesmente continua. Comunicação entre Processos Semáforos Se o valor for 0, o processo é colocado para dormir sem completar o DOWN, por enquanto Verificar o valor, alterá-lo e, possivelmente, ir dormir é tudo feito como uma única ação atômica. Ao iniciar uma operação de semáforo, nenhum outro processo pode acessar o semáforo até que a operação tenha-se completado ou tenha sido bloqueada. A atomicidade é essencial para resolver problemas de sincronização e evitar condições de corrida. Comunicação entre Processos Semáforos UP: incrementa o valor do semáforo endereçado Um up sobre um semáforo com processos dormindo resulta em um processo dormindo a menos A operação de incrementar o semáforo e acordar um processo também é atômica Semáforos que assumem somente os valores 0 (livre) e 1 (ocupado) são denominados semáforos binários ou mutex Comunicação entre Processos Semáforos O problema dos produtores e dos consumidores utilizando semáforos