exercicio sistemas operacionais
Questão 1. Considere o algoritmo abaixo, que controla recursos de hardware. Este algoritmo possui um número DISPONÍVEL de recursos. Barreiras de entrada e de saída são construídas para evitar acessos indevidos. Reescreva a solução utilizando semáforo
// variável global
Inteiro DISPONÍVEL = 300
N=0;
S=2;
Programa Principal Literal ação = " " Faça enquanto VERDADEIRO ação = aguarde() se ação = "entrar" então entrar() senão sair() fim se fim enquanto
função entrar() se DISPONÍVEL 0 senão wait(s) início_região_crítica DISPONÍVEL = DISPONÍVEL - 1 fim_região_crítica signal(s) signal(n) levantar_barreira() fim se fim função
função sair() wait(s) wait(n) início_região_crítica DISPONÍVEL = DISPONÍVEL + 1 fim_região_crítica signal(s) levantar_barreira() fim função
Questão 2. Considere o seguinte código:
n : integer; s, delay : semaforo; // binário
produtor { consumidor { loop wait(delay); { loop { Produz; wait(s); wait(s); critico 1; critico 2; n = n + 1; n = n – 1; if (n = 1) then signal (delay); signal(s) signal(s); consuma; if (n = 0) then wait(delay); } }
} }
/// execução principal /// begin n = 0; s = 1; delay = 0; cobegin produtor; consumidor; coend end.
Discuta a correção da solução apresentada.
A solução anterior estava executando um wait(delay), que aguarda uma liberação do processo de produção, antes de liberar o signal(s) para o processo de produção executar. Isso gerava os dois processos ficando em espera, um dependendo do outro. O Famo deadlock.
Questão 3. Refaça o código do produtor-consumidor para um buffer limitado de tamanho N.
n, m, N : integer; s, delay, delay2 :