












Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Processos em um SO
Tipologia: Notas de estudo
1 / 20
Esta página não é visível na pré-visualização
Não perca as partes importantes!













Processos paralelos podem ser: Independentes: Atividade de um não depende/interfere na do outro Implementação simples Concorrentes ou Cooperantes: Atividade de um depende/interfere na atividade do outro É necessário algum mecanismo de comunicação, que em geral envolve acesso a variáveis compartilhadas O acesso simultâneo a uma mesma variável pode conduzir a resultados imprevisíveis (condição de corrida) Solução: Exclusão mútua a regiões crítica
Comunicação entre processos
Um processo pode ter uma ou mais regiões críticas e uma RC pode ter uma ou mais variáveis compartilhadas Exclusão mútua a RC é um problema difícil!!!
Comunicação entre processos
Condições para uma boa solução do problema de exclusão mútua: Dois processos não podem estar simultaneamente na sua região crítica Nenhuma suposição pode ser feita a respeito da velocidade relativa de processamento ou do número de CPUs Nenhum processo parado fora da região crítica pode bloquear outros processos Nenhum processo deve esperar indefinidamente para entrar em sua região crítica.
Comunicação entre processos
Variáveis de Travamento
Variável compartilhada que indica se a região está liberada ou não; Valor é inicialmente 0; Antes de entrar o processo verifica o valor; Se for 0 ele seta para 1 e entra; Se for 1, o processo espera; Existe algum problema nesta solução?
Estrita Alternância
Variável indica de quem é a vez de entrar na RC; Uso da espera ocupada, que deve ser evitada, em razão de consumir tempo de processador; O que acontece se um dos processos for muito mais rápido do que outro? Entrada estritamente alternada dos processos em suas regiões críticas.
Problema da Prioridade Invertida;
bloqueiam e acordam o processo respectivamente.
Primitivas SLEEP e WAKEUP:
Dois processos compartilham um buffer de tamanho fixo; O produtor coloca informações no buffer e o consumidor, retira; Caso o buffer esteja cheio, o produtor deve ser colocado para dormir; Se o buffer estiver vazio, o consumidor deve dormir, sendo acordado quando o produtor colocar algo no buffer; Pode levar a condições de corrida; Variável (count) usada para controlar número de itens no buffer; Número máximo de itens no buffer = N;
O Problema do Produtor-Consumidor:
Semáforos:
Se s > 0, faz s = s – 1 e quem chamou DOWN(s) entra na RC Se s = 0, RC está ocupada e quem chamou DOWN(s) é bloqueado, ficando numa fila associada ao semáforo ‘s’
faz s = s + 1; se houver processos bloqueados na fila associada a ‘s’, um deles é escolhido de forma justa e colocado no estado “pronto para rodar” para tentar DOWN(s) novamente.
Produtor
while true do Produz_item; down(empty); down(mutex); Coloca_mensagem; up(mutex); up(full); end;
Consumidor
while true do down(full); down(mutex); Remove_item; up(mutex); up(empty); Consome_item; end;
O Problema do Produtor-Consumidor:
Monitores (Hoare/1974, Hansen/1975)
Processos não podem ter acesso direto às estruturas de dados internas ao monitor. É uma construção de linguagem de programação e não uma chamada ao sistema.
Um processo executa sua RC através de uma chamada a um procedimento do monitor.
/* RC do Produtor */
procedure produz (mensagem); if Count = n then WAIT(full); enter_item; count = count + 1; if count ==1 then SIGNAL(empty); end; /* produz */
/*RC do Consumidor */
procedure consome (mensagem); if count = 0 then WAIT(empty); remove_item; count = count - 1; if count = N-1 then SIGNAL(full); end; */ consome */
Monitor ProdutorConsumidor
procedure produtor; while true do Produz mensagem; ProdutorConsumidor.produz (mensagem); end; end; /* produtor */
procedure consumidor; while true do ProdutorConsumidor.consome (mensagem); Consome mensagem; end; end; /* consumidor */
end; /* ProdutorConsumidor */