Baixe o app para aproveitar ainda mais
Prévia do material em texto
Arquitetura de Sistemas Arquitetura de Sistemas OperacionaisOperacionais Cap. 7 – Sincronização e Comunicação 1 Capítulo 7Capítulo 7 Sincronização e ComunicaçãoSincronização e Comunicação entre Processosentre Processos Sumário • Introdução • Aplicações concorrentes • Especificação de concorrência em programas • Problemas de compartilhamento de recursos • Exclusão mútua Cap. 7 – Sincronização e Comunicação 2 • Exclusão mútua • Sincronização condicional • Semáforos • Monitores • Troca de mensagens • Deadlock Introdução • Surgindo os sistemas multiprogramáveis, passou a ser possível uma aplicação ter trechos de códigos sendo executado de forma concorrente – aplicação concorrente; • A base é a execução cooperativa de processos ou threads em prol de um objetivo Cap. 7 – Sincronização e Comunicação 3 processos ou threads em prol de um objetivo comum; • Mesmo em sistemas monoprocessados é possível obter ganhos com aplicações concorrentes; • Ao sistema multiprocessados estende as vantagens do uso deste tipo de aplicação; Introdução • É natural o compartilhamento de recursos pelos processos de uma aplicação concorrente; • Este compartilhamento pode gerar situações indesejáveis; • Para evitar estas situações os Cap. 7 – Sincronização e Comunicação 4 • Para evitar estas situações os processos devem ter a sua execução sincronizadas, a partir de mecanismos oferecidos pelo S.O.; • Este capítulo descreve a sincronização e comunicação entre processos. Aplicações Concorrentes • Muitas vezes, os processos concorrentes devem comunicar entre si; • Esta comunicação pode ser implementada através de: Cap. 7 – Sincronização e Comunicação 5 implementada através de: – Memória compartilha; – Troca de mensagens. Aplicações Concorrentes • Na próxima figura: – Um processo que lê do buffer; – Outro processo de grava no buffer; • Condições: – O processo só lê se o buffer não tiver vazio; Cap. 7 – Sincronização e Comunicação 6 vazio; – O processo só grava se o buffer não tiver cheio; • Em ambos os casos, os processos deverão esperar o buffer estar pronto para a operação; Aplicações Concorrentes • Sincronização e comunicação entre processos Sincronização Cap. 7 – Sincronização e Comunicação 7 Processo gravador Processo leitor dado l e i t u r a gravação Buffer Aplicações Concorrentes • Os mecanismos que garantem a comunicação e o acesso aos recursos compartilhados são chamados de mecanismos de sincronização; • Nesta abordagem tanto subprocessos Cap. 7 – Sincronização e Comunicação 8 • Nesta abordagem tanto subprocessos como thread tem o mesmo significado que processos, para exemplicação das aplicações; Especificação de Concorrência em Programas • Existem várias notações para especificar a concorrência em programas (partes do programa que devam ser executadas concorrentemente); Cap. 7 – Sincronização e Comunicação 9 concorrentemente); • Conway(1963) e Dennis e Van Horm, criaram a primeira notação: – FORK – cria um outro processo; – JOIN – sincroniza com outro programa; Especificação de Concorrência em Programas PROGRAM A - - FORK B; - - JOIN B; PROGRAM B - - - END. • O programa A começa; • Encontra o comando FORK: – Começa o programa B em outro processo; • O programa A encontra o comando JOIN: – O programa A espera o término Cap. 7 – Sincronização e Comunicação 10 END.– O programa A espera o término do programa B; • Estes comandos são utilizados no Unix; Especificação de Concorrência em Programas • Dijkstra em 1965 propôs o PARABEGIN e o PARAEND, uma das implementações mais claras; • Foram chamadas, posteriormente, de COBEGIN e COEND; Cap. 7 – Sincronização e Comunicação 11 COBEGIN e COEND; • O comando PARABEGIN especifica uma seqüência de comandos seja executa de forma concorrente em uma ordem imprevisível, criando um processo para cada comando; Especificação de Concorrência em Programas • O comando PARAEND define um ponto de sincronização, onde o processamento só continua quando todos os processos tiverem terminados; Cap. 7 – Sincronização e Comunicação 12 terminados; • Os comandos podem ser simples, como atribuições ou chamadas a procedimentos; Especificação de Concorrência em Programas • Concorrência em programas Processo principal Cap. 7 – Sincronização e Comunicação 13 Processo principal Processo 1 Processo 2 Processo n PARBEGIN Comando_1; Comando_2; . . Comando_n; PAREND Especificação de Concorrência em Programas X := SQRT (1024) + (35.4 * 0.23) - (302 / 7) PROGRAM Expressao; VAR X, Temp1, Temp2, Temp3 : REAL; BEGIN PARBEGIN Cap. 7 – Sincronização e Comunicação 14 PARBEGIN Temp1 := SQRT (1024); Temp2 := 35.4 * 0.23; Temp3 := 302 / 7; PAREND; X := Temp1 + Temp2 - Temp3; WRITELN ('x = ', X); END. Especificação de Concorrência em Programas • O cálculo final de X, só pode ser efetuado após terem terminado o cálculo de Temp1, Temp2 e Temp3; Cap. 7 – Sincronização e Comunicação 15 Problema de Compartilhamento de Recursos • Veremos algumas problemas de compartilhamento de recursos: – Compartilhamento de um arquivo em disco; – Compartilhamento de uma variável na Cap. 7 – Sincronização e Comunicação 16 – Compartilhamento de uma variável na memória principal; Problema de Compartilhamento de Recursos • Arquivo em disco: – Atualização de um saldo bancário; – Lançamento de um débito/crédito; – Em um arquivo são armazenados todos os saldos dos clientes de um banco; Cap. 7 – Sincronização e Comunicação 17 saldos dos clientes de um banco; – O programa (próxima transparência): •Lê o saldo de um cliente; •Lê o valor da operação; •Atualiza o saldo; •Grava o saldo. Problema de Compartilhamento de Recursos PROGRAM Conta_Corrente; . . READ (Arq_Contas, Reg_Cliente); READLN (Valor_Dep_Ret); Reg_Cliente.Saldo := Cap. 7 – Sincronização e Comunicação 18 Reg_Cliente.Saldo := Reg_Cliente.Saldo + Valor_Dep_Ret; WRITE (Arq_Contas, Reg_Cliente); . . END. Problema de Compartilhamento de Recursos • Considerando dois funcionários do banco atualizando o mesmo cliente; Certo 1.100 Caixa Comando Arquivo Valor Memória 1 Lê Saldo 1.000 * 1.000 1 Lê valor 1.000 -200 1.000 Cap. 7 – Sincronização e Comunicação 19 1 Lê valor 1.000 -200 1.000 1 Atualiza 1.000 -200 800 2 Lê saldo 1.000 * 1.000 2 Lê valor 1.000 +300 1.000 2 Atualiza 1.000 +300 1.300 1 Grava 800 -200 800 2 Grava 1.300 +300 1.300 Problema de Compartilhamento de Recursos • Variável compartilhada: – Dois processos (A e B) executam um comando de atribuição; •Processo A soma 1 à X; •Processo B diminui 1 de X; Cap. 7 – Sincronização e Comunicação 20 •Processo B diminui 1 de X; – Se X, inicialmente, é igual a 2 e de se esperar que o resultado, após a execução dos processos continue igual a 2; Problema de Compartilhamento de Recursos • Linguagem de alto nível Processo A Processo B X := X + 1; X := X - 1; Cap. 7 – Sincronização e Comunicação 21 • Linguagem de baixo nível Processo A Processo B LOAD x,Ra LOAD x,Rb ADD 1,Ra SUB 1,Rb STORE Ra,x STORE Rb,x Problema de Compartilhamento de Recursos Processo Comando X Ra Rb A LOAD X, Ra 2 2 * A ADD 1, Ra 2 3 * Cap. 7 – Sincronização e Comunicação 22 B LOAD X, Rb 2 * 2 B ADD 1, Rb 2 * 1 A STORE Ra, X 3 3 * B STORE Rb, X 1 * 1 Problema de Compartilhamento de Recursos • Analisando os exemplos conclui-se que em qualquer situação, onde dois ou mais processos compartilhamum mesmo recurso, devem existir mecanismos de controle para evitar Cap. 7 – Sincronização e Comunicação 23 mecanismos de controle para evitar estes tipos de problemas, conhecidos como race conditions (condições de corrida); Exclusão Mútua • Solução é impedir que dois ou mais processos acessem o mesmo recurso simultaneamente; • Portanto, quando um processo estiver acessando um recurso, os demais Cap. 7 – Sincronização e Comunicação 24 acessando um recurso, os demais processos que queiram acessar este recurso deverão esperar pelo término da utilização deste recurso; • Esta idéia é chama de exclusão mútua (mutual exclusion); Exclusão Mútua • A exclusão mútua deve afetar apenas os processos concorrentes somente quando um deles tiver fazendo acesso ao recurso compartilhado; • A parte do código onde se acessa o recurso compartilhado é chamada de Cap. 7 – Sincronização e Comunicação 25 recurso compartilhado é chamada de região crítica (critical region); • Para evitar os problemas causados pelo compartilhamento basta evitar que dois processos entrem na sua região crítica simultaneamente; Exclusão Mútua Cap. 7 – Sincronização e Comunicação 26 Exclusão Mútua • Os mecanismos que implementam a exclusão mútua utilizam protocolos de acesso à região crítica; • Quando um processo desejar executar instruções de sua região crítica, deverá executar um protocolo de entrada na região Cap. 7 – Sincronização e Comunicação 27 executar um protocolo de entrada na região crítica obrigatoriamente; • Da mesma forma quando sair da região crítica deverá executar um protocolo de saída; • Estes protocolos garantem a exclusão mútua da região crítica; Exclusão Mútua BEGIN . . Entra_Regiao_Critica; (* protocolo de entrada *) Regiao_Critica; Sai_Regiao_Critica; (* protocolo de saída) . . Cap. 7 – Sincronização e Comunicação 28 . END. Exclusão Mútua • Para o programa de Conta_Corrente: – Recurso compartilhado • Arquivo de contas correntes; – Solução • Sempre que o Processo A for atualizar o saldo, antes de ler o acesso exclusivo ao arquivo deve Cap. 7 – Sincronização e Comunicação 29 antes de ler o acesso exclusivo ao arquivo deve ser garantido protocolo de entrada; • Se conseguir o acesso, significa que outro processo não esta utilizando o recurso, podendo assim atualizar o saldo • Quando gravar o saldo atualizado o Processo A libera o recurso – saída da região crítica – permitindo assim que outro processo utiliza o recurso (arquivo de conta corrente); Exclusão Mútua • Para garantir a implementação da exclusão mútua os processos envolvidos devem fazer acesso os recursos de forma compartilhada; • Existem diversas soluções para este Cap. 7 – Sincronização e Comunicação 30 • Existem diversas soluções para este propósito, mas deve-se evitar duas situações: – Espera indefinida (starvation starvation); – Um processo fora da sua região crítica impede que outros processos utilizem o recurso compartilhado; Exclusão Mútua • Espera indefinida (starvation) – Ocorre quando um processo nunca consegue executar a sua região crítica (utilizar o recurso compartilhado); – Quando um recurso é liberado o S.O. Possui um critério para selecionar o Cap. 7 – Sincronização e Comunicação 31 Possui um critério para selecionar o próximo processo que terá acesso ao recurso; – Dependendo do processo de escolha o starvation pode ocorrer; Exclusão Mútua • Espera indefinida (starvation) – Escolha aleatória: não está garantindo que em algum momento um processo terá acesso ao recurso pois a escola é aleatória; – Por prioridade: a baixa prioridade de um Cap. 7 – Sincronização e Comunicação 32 – Por prioridade: a baixa prioridade de um processo em relação aos outros pode impedir o acesso ao recurso; – Uma solução simples: criação de filas de pedidos para cada recurso, usando FIFO. Exclusão Mútua • Um processo fora da sua região crítica impede que outros processos utilizem o recurso compartilhado; • Neste caso o recurso estaria livre porém alocado a um processo; Cap. 7 – Sincronização e Comunicação 33 porém alocado a um processo; • Assim todos os processos que utilizam este recurso estariam impedidos de entrar nas suas regiões críticas; Exclusão Mútua • Soluções de hardware: – Desabilitação de interrupções; – Instrução test-and-set. • Soluções de software – Primeiro algoritmo; – Segundo algoritmo; Cap. 7 – Sincronização e Comunicação 34 – Segundo algoritmo; – Terceiro algoritmo; – Quarto algoritmo; – Algoritmo de Dekker; – Algoritmo de Peterson; – Algoritmo para exclusão mútua entre N processos. Exclusão Mútua • Desabilitação de interrupções – Solução mais simples; – É desabilitado todas as interrupções antes de entrar na região crítica; – É habilitado todas as interrupções após Cap. 7 – Sincronização e Comunicação 35 – É habilitado todas as interrupções após deixar a região crítica; – Como a mudança de contexto só pode ser executada através de interrupções, fica garantindo, assim, o acesso exclusivo; Exclusão Mútua • Desabilitação de interrupções BEGIN . Desabilita_Interrupcoes; Cap. 7 – Sincronização e Comunicação 36 Desabilita_Interrupcoes; Regiao_Critica; Habilita_Interrupcoes; . END. Exclusão Mútua • Desabilitação de interrupções • Limitações: – A multiprogramação pode ficar seriamente comprometida, já a concorrência tem como base o uso de interrupções; – Se o processo “esquecer” de habilitar as Cap. 7 – Sincronização e Comunicação 37 – Se o processo “esquecer” de habilitar as interrupções, o sistema ficaria seriamente comprometido; – Em sistemas multiprocessados esta solução torna-se ineficiente devido ao tempo de propagação de um processador para os outros da desabilitação/abilitação das interrupções; Exclusão Mútua • Desabilitação de interrupções • Limitações: – Não esquecer que o mecanismo de clock é implementado com o uso de interrupções; – A seção crítica pode executar E/S que Cap. 7 – Sincronização e Comunicação 38 – A seção crítica pode executar E/S que dependam de interrupções; – Apesar das limitações, esta solução pode ser útil quando se deseja que partes do núcleo do S.O. sem interrupções, garantindo que não haverão problemas de inconsistências nas estruturas de dados; Exclusão Mútua • Instrução test-and-set – Instrução que: •Le uma variável; •Armazena o conteúdo em outro local; •Atribui um novo valor a mesma variável; Cap. 7 – Sincronização e Comunicação 39 •Atribui um novo valor a mesma variável; •É executada sem interrupção, ou seja, é uma instrução indivisível; – Desta forma, é garantindo que dois processos não acessem uma variável compartilhada ao mesmo tempo – permite implementar a exclusão mútua; Exclusão Mútua • Instrução test-and-set – Test-and-Set (X,Y): • O valor lógico de Y é copiado para X; • Y recebe o valor lógico verdadeiro. – Para coordenar o acesso concorrente, é utilizado uma variável lógica global chamada de bloqueio: Cap. 7 – Sincronização e Comunicação 40 uma variável lógica global chamada de bloqueio: • Quando bloqueio for falso qualquer processo poderá alterar o seu valor para verdadeiro e ter acesso ao recurso de forma exclusiva; • Quando terminar de usar o recurso, o processo retorna o valor falso para o bloqueio, liberando o acesso ao recurso. Exclusão Mútua Program Test_and_Set var Bloqueio: boolean; Procedure Processo_A; var P_A : boolean; // pode A begin repeat P_A:= true; Procedure Processo_B; var P_B : boolean; // pode B begin repeat P_B:= true; while (P_B) do Test_and_Set(P_B, Bloqueio); Regiao_Critica_B; Cap. 7 – Sincronização e Comunicação 41 P_A:= true; while (P_A) do Test_and_Set (P_A, Bloqueio); Regiao_Critica_A; Bloqueio:= false; until true; end; Regiao_Critica_B; Bloqueio:= false; until true; end; begin Bloqueio := false; PARBEGIN Processo_A; Processo_B; PARAEND End. Exclusão Mútua Processo A Processo B P_A P_B Bloqueio repeat repeat * * F P_A:= T P_B:= T T T F while (P_A) Test_and_set T F T Test_and_Set Regiao_Critica_B T F T Cap. 7 – Sincronização e Comunicação 42 T F T while (P_A) Bloqueio:= F T F F Test_and_set P_B:= T F T T Regiao_Critica_A while (P_B) F T T Exclusão Mútua • Instrução test-and-set – Esta solução apresenta algumas vantagens: •Simplicidade de implementação •Uso em arquitetura com múltiplos Cap. 7 – Sincronização e Comunicação 43 •Uso em arquitetura com múltiplos processadores; – Principal desvantagem: •Possibilidade de starvation, pois a escolha do processo para acesso ao recurso é aleatória. Exclusão Mútua • Soluções de software – Algoritmo 1 • Uma solução para dois processos; • Onde a alternância na execução das seções críticas; • Cada procedimento (A e B) é representado por Cap. 7 – Sincronização e Comunicação 44 • Cada procedimento (A e B) é representado por um loop infinito, onde o recurso é acessado; • É formado por protocolo de entrada, seção crítica e um protocolo de saída; • A região crítica é representada por uma rotina onde o acesso realmente ocorre; • Após a seção crítica as rotinas executam procedimentos individuais. Exclusão Mútua • Algoritmo 1 – É utilizada uma variável de bloqueio indicando qual processo poderá acessar a região crítica; – Inicialmente possui o valor A indicando que o processo A terá acesso; Cap. 7 – Sincronização e Comunicação 45 que o processo A terá acesso; – O processo só terá acesso a região crítica, quando o processo A atribuir a variável de bloqueio o valor ‘B’; – Assim fica garantindo a exclusão mútua dos processos. Exclusão Mútua program Algoritmo 1; var Vez : char; procedure Proc_A begin repeat while (vez = ‘B’) do ; /nada Regiao_Critica_A; Vez := ‘B’; procedure Proc_B begin repeat while (vez = ‘A’) do ; /nada Regiao_Critica_B; Vez := ‘A’; Processa_B; until false; end; Cap. 7 – Sincronização e Comunicação 46 Vez := ‘B’; Processa_A; until false; end; begin Vez := ‘A’; PARBEGIN Proc_A; Proc_B; PAREND; end. Exclusão Mútua Proc_A Proc_B Vez while (Vez = ‘B’) while (Vez = ‘A’) A Regiao_Critica_A while (Vez = ‘A’) A Vez:= ‘B’ while (Vez = ‘A’) B Cap. 7 – Sincronização e Comunicação 47 Vez:= ‘B’ while (Vez = ‘A’) B Processa_A Regiao_Critica_B B Processa_A Vez:= ‘A’ A Processa_A Processa_B A Processa_A while (Vez = ‘A’) A Exclusão Mútua • Algoritmo 1 – Problema 1: • O acesso ao recurso só pode ser efetuado por dois processos e sempre de maneira alternada; • O processo que utiliza o recurso mais vezes que o outro, permanecerá mais vezes bloqueado; Cap. 7 – Sincronização e Comunicação 48 o outro, permanecerá mais vezes bloqueado; • Por exemplo, de Proc_A ficar muito tempo no Processa_A, é possível que Proc_B queria usar o recurso e não o consiga, mesmo Proc_A não necessite do recurso. • Caso um processo tenha o loop mais rápido que o outro, a possibilidade de usar o recurso fica limitado ao processo de velocidade menor. Exclusão Mútua • Algoritmo 1 – Problema 2: •Se houver um problema com um processo de forma que o valor da variável de bloqueio não seja alterado, o outro processo permanecerá Cap. 7 – Sincronização e Comunicação 49 outro processo permanecerá indefinidamente bloqueado. Exclusão Mútua • Algoritmo 2 – O problema principal do algoritmo 1 é que ambos processos trabalham com a mesma variável global, que indica qual processo terá acesso a região crítica; – Para resolver este problema o algoritmo 2 Cap. 7 – Sincronização e Comunicação 50 – Para resolver este problema o algoritmo 2 introduz uma variável para cada processo (CA e CB), que indica se o processo está na região crítica; – Assim antes de um processo entrar na sua região crítica, testa se o outro processo está usando o recurso; Exclusão Mútua program Algoritmo 2; var CA : boolean; CB : boolean; procedure Proc_A begin repeat procedure Proc_B begin repeat while (CA) do ; /nada CB := true; Regiao_Critica_B; CB:= false; Processa_B; Cap. 7 – Sincronização e Comunicação 51 repeat while (CB) do ; /nada CA := true; Regiao_Critica_A; CA:= false; Processa_A; until false; end; Processa_B; until false; end; begin CA:= false; CB:= false; PARBEGIN Proc_A; Proc_B; PAREND; end. • Algoritmo 2 – Neste caso o uso do recurso não é realizado, necessariamente, alternado; – Caso um processo tenha um problema fora da região crítica não bloqueia o outro processo; Exclusão Mútua Cap. 7 – Sincronização e Comunicação 52 processo; – Mas se um processo tiver um problema na região crítica ou antes de alterar o valor da variável, bloqueará, indefinidamente, o outro processo; – Mas, o mais grave é que este algoritmo nem sempre garante a exclusão mútua; Exclusão Mútua Proc_A Proc_B CA CB while(CB) while(CA) F F Cap. 7 – Sincronização e Comunicação 53 while(CB) while(CA) F F CA:= true CB:= true T T Regiao_Critica_A Regiao_Critica_B T T Exclusão Mútua • Algoritmo 3 – Este algoritmo tenta solucionar o problema do algoritmo 2, colocando a instrução de atribuição de CA e CB antes do loop de teste; – Este algoritmo garante a exclusão mútua, Cap. 7 – Sincronização e Comunicação 54 – Este algoritmo garante a exclusão mútua, mas introduz a possibilidade do bloqueio indefinido de ambos os processos; Exclusão Mútua program Algoritmo 3; var CA : boolean; CB : boolean; procedure Proc_A begin repeat procedure Proc_B begin repeat CB := true; while (CA) do ; /nada Regiao_Critica_B; CB:= false; Processa_B; Cap. 7 – Sincronização e Comunicação 55 repeat CA := true; while (CB) do ; /nada Regiao_Critica_A; CA:= false; Processa_A; until false; end; Processa_B; until false; end; begin CA:= false; CB:= false; PARBEGIN Proc_A; Proc_B; PAREND; end. Exclusão Mútua Proc_A Proc_B CA CB CA:= true CB:= true T T Cap. 7 – Sincronização e Comunicação 56 CA:= true CB:= true T T while(CB) while(CA) T T Exclusão Mútua • Algoritmo 4 – No algoritmo 3, cada processo altera o estado da sua variável desconhecendo o estado do outro processo – este é o problema; – Altera o algoritmo 3 de forma que altera o Cap. 7 – Sincronização e Comunicação 57 – Altera o algoritmo 3 de forma que altera o estado o estado da variável antes de entrar a região crítica (como no algoritmo 3), porém existe a possibilidade de reverter esta alteração; Exclusão Mútua program Algoritmo 4; var CA : boolean; CB : boolean; procedure Proc_A begin repeat CA := true; while (CB) do begin procedure Proc_B begin repeat CB := true; while (CA) do begin CB:= false; {pequeno intervalo de tempo aleatório} CB := true; end; Regiao_Critica_B; Cap. 7 – Sincronização e Comunicação 58 begin CA:= false; {pequeno intervalo de tempo aleatório} CA := true; end; Regiao_Critica_A; CA:= false; Processa_A; until false; end; Regiao_Critica_B; CB:= false; Processa_B; until false; end; begin CA:= false; CB:= false; PARBEGIN Proc_A; Proc_B; PAREND; end. • Algoritmo 4 – Esta solução garante exclusão mútua e não gera bloqueio simultâneo dos processos; – Mas, no casodos tempos aleatórios serem próximos e a concorrência gerar uma Exclusão Mútua Cap. 7 – Sincronização e Comunicação 59 próximos e a concorrência gerar uma situação onde os processos alterem as variáveis CA e CB para falso antes do término do loop, nenhum dos processos conseguirá executar a sua região crítica, mesmo não sendo permanente, esta situação pode gerar problemas Exclusão Mútua • Algoritmo de Dekker – Primeira solução de software que garantiu a exclusão mútua entre dois processos sem problemas foi proposto por T. Dekker; – Este algoritmo possui uma lógica bastante complexa; Cap. 7 – Sincronização e Comunicação 60 complexa; – Ver no livro texto as referencias; Exclusão Mútua • Algoritmo de Peterson – Facilmente generalizada para N processos; – Similar ao algoritmo 3, além das variáveis de condição (CA e CB), introduz a variável Vez para gerar os conflitos gerados pela concorrência; – Antes de acessar a região crítica, o processo Cap. 7 – Sincronização e Comunicação 61 – Antes de acessar a região crítica, o processo sinaliza este desejo (variável de condição), porém o processo cede o uso do recurso (variável Vez); – O processo executa o while (protocolo de entrada); – Assim além de garantir a exclusão mútua, o bloqueio indefinido nunca ocorrerá, pelo uso da variável Vez; Exclusão Mútua program Algoritmo_Peterson; var CA : boolean; CB : boolean; Vez : char; procedure Proc_A begin repeat CA := true; procedure Proc_B begin repeat CA := true; Vez := ‘A’; while (CA and Vez = ‘A’) do ; /nada Regiao_Critica_B; CB:= false; Processa_B; Cap. 7 – Sincronização e Comunicação 62 CA := true; Vez := ‘B’; while (CB and Vez = ‘B’) do ; /nada Regiao_Critica_A; CA:= false; Processa_A; until false; end; Processa_B; until false; end; begin CA:= false; CB:= false; PARBEGIN Proc_A; Proc_B; PAREND; end. • Algoritmo para exclusão mútua para N processos: – O algoritmo de Peterson foi generalizado para N processos, Hofri (1990); – O algoritmo do Padeiro (bakey Algorithm) proposto por Lamport(1974); – Problema espera ocupada (busy wait), este caso, quando um processo não consegue entrar em sua Exclusão Mútua Cap. 7 – Sincronização e Comunicação 63 quando um processo não consegue entrar em sua região crítica, este processo permanece em loop testando uma condição, consumino recurso do processador; – A solução para este problema foi a introdução de mecanismo de sincronismo que permitem colocar um processo em estado de espera, quando estiver esperando para entrar na região crítica. (semáforos e monitores) Sincronização Condicional • Sincronização condicional é quando o acesso a um recurso compartilhado exige uma sincronização entre os processos; • Exemplo clássico é a comunicação entre dois processos através de Cap. 7 – Sincronização e Comunicação 64 entre dois processos através de operações de gravação e leitura em um buffers; • Os processos devem estar sincronizados para que um processo não tente ler um buffer vazio nem gravar em um buffer cheio; Sincronização Condicional • Este problema é conhecido como problema do produtor/consumidor ou do buffer limitado; • No algoritmo na próximo slide, o recurso compartilhado é um buffer, definido como tamanho TamBuf, sendo o acesso controlado pela variável Cont; Cap. 7 – Sincronização e Comunicação 65 pela variável Cont; • Cont: – Igual a zero: significa que o buffer está vazio, e o processo Consumidor deve esperar; – Igual a TamBuf: significa que o buffer está cheio, e o processo Produtor deve esperar; • O algoritmo resolve a questão da sincronização condicional, mas apresenta o problema da espera ocupada; Sincronização Condicional PROGRAM Produtor_Consumidor_1; CONST TamBuf = ( *Tamanho *); TYPE Tipo_Dado = (* Tipo *); VAR Buffer : ARRAY [1..TamBuf] OF Tipo_Dado; Dado : Tipo_Dado; Cont : 0..TamBuf; BEGIN Cont := 0; PARBEGIN PROCEDURE Produtor; BEGIN REPEAT Produz_Dado (Dado); WHILE (Cont = TamBuf) DO (*nada*); Grava_Buffer(Dado, Cont); UNTIL False; END; PROCEDURE Consumidor; BEGIN Cap. 7 – Sincronização e Comunicação 66 PARBEGIN Produtor; Consumidor; PAREND; END. BEGIN REPEAT WHILE (Cont = 0) DO (*nada*); Le_Buffer (Dado); Consome_Dado(Dado, Cont); UNTIL False; END; Semáforos • Proposto por E. W. Dijkstra em 1965; • Mecanismo de sincronização que permite implementar a exclusão mútua e a sincronização entre processos de forma simples; • Tornou-se um dos principais Cap. 7 – Sincronização e Comunicação 67 • Tornou-se um dos principais mecanismos utilizados em projeto de S.O. e aplicações concorrentes; • A maioria das linguagens de programação disponibiliza rotinas para utilizá-los; Semáforos • Semáforos são: – Uma variável inteira não negativa; – Manipulados através das seguintes operações indivisíveis: •UP (Proberen – teste): incrementa o Cap. 7 – Sincronização e Comunicação 68 •UP (Proberen – teste): incrementa o valor da variável; •DOWN (Verhigen – incremento): decrementa o valor da variável; Semáforos • Semáforos são: – A variável não pode ser negativa, assim um DOWN em um semáforo com valor zero, faz o processo entrar no estado de espera; – Normalmente implementada em hardware; Cap. 7 – Sincronização e Comunicação 69 – Normalmente implementada em hardware; Semáforos • Os semáforos podem ser: – Binários (mutexes): só podem assumir os valores zero e um; – Contadores: podem assumir qualquer valor inteiro positivo e zero; Cap. 7 – Sincronização e Comunicação 70 Semáforos • Exclusão mútua: – Pode ser implementada com o uso de semáforos binários associado aos recursos compartilhados; – Principal vantagem: não ocorre a espera ocupada; Cap. 7 – Sincronização e Comunicação 71 ocupada; – As instruções DOWN e UP funcionam como protocolo de entrada e saída; – Quando o valor é um, indica que o recurso está disponível, e se for zero significa que algum processo está utilizando o recurso; Semáforos • Exclusão mútua: – Quando for entrar na região crítica, o processo executa um DOWN; – Se o semáforo for igual a um, este valor é decrementado e o processo entra na região crítica; Cap. 7 – Sincronização e Comunicação 72 região crítica; – Se o valor for zero, então o processo impedido de entrar na seção crítica, e seu estado passa a ser de espera, liberando o processador. Semáforos • Exclusão mútua: – O processo ao sair da região crítica, deve liberar o recurso compartilhado, para tanto, basta executar a instrução UP; – Caso existam vários processos esperando a liberação do recurso, o S.O. selecionará Cap. 7 – Sincronização e Comunicação 73 a liberação do recurso, o S.O. selecionará um, mudando seu estado de espera para pronto – próximo slide; – Não existe a espera ocupada; Semáforos • Semáforo binário na exclusão mútua Processo deseja entrar na região crítica DO Cap. 7 – Sincronização e Comunicação 74 Fila de espera de processos Processo acessa a região crítica DOW N (S = 0)D O W N ( S> 0 ) UP (S) - processo sai da região crítica Libera processo da fila de espera Semáforos TYPE Semaforo =record Valor : integer; Fila_espera: (*lista dos processos em espera*) end; Procedure DOWN (VAR S: Semaforo); begin if (S = 0) then Coloca_Processo_na_Fila_de_Espera Cap. 7 – Sincronização e Comunicação 75 if (S = 0) then Coloca_Processo_na_Fila_de_Espera else S = S – 1; End; Procedure UP (VAR S: Semaforo); begin S = S + 1; If (Processo_Esperando) then Retira_da_Fila_de_Espera. End; Semáforos Program Semaforo_1Var S : Semaforo = 1; Procedure Proc_A; begin repeat Procedure Proc_B; begin repeat DOWN(S); Região_Critica_B; UP (S); until false; Cap. 7 – Sincronização e Comunicação 76 repeat DOWN(S); Região_Critica_A; UP (S); until false; end; until false; end; begin PARABEGIN Proc_A; Proc_B; PARAEND; End. Semáforos Proc_A Proc_B S Pendente Repeat Repeat 1 * Down(s) Repeat 0 * Cap. 7 – Sincronização e Comunicação 77 Down(s) Repeat 0 * Regiao_Critica_A Down(s) 0 Proc_B Up(s) Down(s) 1 Proc_B repeat Regiao_Critica_B 0 * Semáforos • Sincronização condicional: – Pode-se implementar a sincronização condicional; – Exemplo: solicitação de E/S, o processo que solicita a E/S executa um DOWN e fica em estado de espera até a operação de Cap. 7 – Sincronização e Comunicação 78 em estado de espera até a operação de E/S ser completada; – Quando a operação de E/S finaliza a rotina de tratamento de interrupção excuta um UP, liberando o processo do estado de espera; Semáforos Program Semaforo_2; var Evento: Semaforo := 0; Procedure Solicita_Leitura; begin DOWN(Evento) Begin PARABEGIN Solicita_leitura; Le_Dados; PARAEND; End; Cap. 7 – Sincronização e Comunicação 79 DOWN(Evento) End; Procedure Le_Dados; Begin UP(Evento) End; •Algoritmo para sincronização condicional: Semáforos • O problema do produtor/consumidor pode ser resolvido com o uso de semáforos; • Para tanto: – Usa buffer de duas posições; Cap. 7 – Sincronização e Comunicação 80 – Usa buffer de duas posições; – Um semáforo binário para garantir a exclusão mútua; – Dois semáforos contadores (Vazio e Cheio) para a sincronização condicional; Semáforos Program Produtor_consumidor_2 Const TB = 2; TYPE TDado = (*qualquer*) VAR Vazio: semaforo := TB; Cheio: semaforo := 0; Mutex: semaforo := 1; Buffer: array[1..TB] of TDado; Dado_1: TDado; Dado_2: TDado; Procedure consumidor; begin repeat Down(Cheio); Down(Mutex); Le_Buffer(Dado_2, buffer); Up(Mutex); Up(Vazio); until false; End; Cap. 7 – Sincronização e Comunicação 81 Procedure Produtor begin repeat Produz_Dado (Dado_1); Down (Vazio); Down (Mutex); Grava_Buffer(Dado_1, Buffer); Up(Mutex); Up(Cheio); until false; end; begin parabegin Produtor; Consumidor; paraend; end. Semáforos Produtor Consumidor Vazio Cheio Mutex Pendente * * 2 0 1 * * Down(Cheio) 2 0 1 Con Down(Vazio) Down(Cheio) 1 0 1 Con Down(Mutex) Down(Cheio) 1 0 0 Con Grava_Buffer Down(Cheio) 1 0 0 Con UP(Mutex) Down(Cheio) 1 0 1 Con Cap. 7 – Sincronização e Comunicação 82 UP(Mutex) Down(Cheio) 1 0 1 Con Up(Cheio) Down(Cheio) 1 1 1 * Up(Cheio) Down(Cheio) 1 0 1 * Up(Cheio) Donw(Mutex) 1 0 0 * Up(Cheio) Le_Dados 1 0 0 * Up(Cheio) Up(Mutex) 1 0 1 * Up(Cheio) UP(Vazio) 2 0 1 * Semáforos • Semáforos contadores são úteis quando existem processos concorrentes alocando recursos do mesmo tipo (pool de recursos); • O semáforo começa com número total de recursos do pool; • Quando necessitar de recurso executa um Cap. 7 – Sincronização e Comunicação 83 • Quando necessitar de recurso executa um DOWN; • Quando liberar o recurso executa um UP; • Caso o semáforo contador seja zero, o processo que executar um DOWN ficará em estado de espera. Semáforos • Problemas – Problema dos filósofos; – Problema do barbeiro; Cap. 7 – Sincronização e Comunicação 84 Monitores • Monitores são mecanismos de sincronização de alto nível que tornam mais simples o desenvolvimento de aplicações concorrentes; • Proposto por Binch Hansen, 1972 e Cap. 7 – Sincronização e Comunicação 85 • Proposto por Binch Hansen, 1972 e desenvolvido por C.A.R. Hoare em 1974; • Mecanismo de sincronização estruturado, diferente de semáforos, considerados não-estruturados; Monitores • Diferentemente dos semáforos, os monitores são implementados pelo compilador, menos sujeito a erros; • Inicialmente implementado em poucas linguagens (Concurrent Pascal, Modula- Cap. 7 – Sincronização e Comunicação 86 linguagens (Concurrent Pascal, Modula- 2, Modula-3) • Atualmente, a maioria das linguagens disponibiliza este recurso; Monitores • O monitor é formado por procedimentos e variáveis encapsulado dentro de um módulo; • Sua principal característica é a implementação da exclusão mútua entre os procedimentos declarados; Cap. 7 – Sincronização e Comunicação 87 entre os procedimentos declarados; • Toda vez que é chamado um dos procedimentos, o monitor verifica se outro procedimento esta sendo executado, em caso afirmativo, o procedimento que quer ser executado fica em espera; Monitores • Toda inicialização de variáveis é realizada por um bloco de comandos, sendo executada apenas uma vez, na ativação do programa; • Um monitor é definido especificando: Cap. 7 – Sincronização e Comunicação 88 • Um monitor é definido especificando: – Um nome; – Declarando: • variáveis locais; •Procedimentos; •Código de inicialização; Monitores • Estrutura do monitor Declaração de variáveis globais Procedimentos Proc. 1 Cap. 7 – Sincronização e Comunicação 89 Fila de entrada Inicialização de variáveis Proc. 1 Proc. 2 Proc. n M o n i t o r Monitores Monitor Exclusao_Mutua; (* variáveis locais *) procedure Regiao_Critica_1; begin : End; Procedure Regiao_Critica_2; Begin Cap. 7 – Sincronização e Comunicação 90 Begin : end; Procedure Regiao_Critica_3; begin : end; begin (* código de inicialização *) end. Monitores • Exclusão mútua – A implementação mútua utilizando monitores não é realizada diretamente pelo programador; – As regiões críticas são definidas como procedimentos no monitor e o compilador Cap. 7 – Sincronização e Comunicação 91 procedimentos no monitor e o compilador garante a exclusão mútua; – A comunicação do procedimento e monitor é executada através de chamada a procedimentos e dos parâmetros passados; – A seguir, um exemplo, onde processos somam e subtraem um concorrentemente; Monitores program monitor_1 Monitor Rgião_Critica; var X : integer; procedure Soma; begin X := X + 1; begin PARABEGIN Regiao_Critica.Soma; Regiao_Critica.Susbtrai; PARAEND; end; Cap. 7 – Sincronização e Comunicação 92 X := X + 1; end; Procudure Subtrai; begin X := X – 1; end; begin X:= 0; end; Monitores • Sincronização condicional: – A sincronização condicional pode ser implementada utilizando-se de monitores através de variáveis especiais de condição; – É possível associar a execução de um Cap. 7 – Sincronização e Comunicação 93 – É possível associar a execução de um procedimento que faz parte do monitor a uma determinada condição, garantindo a sincronização condicional; – Esta variáveis são manipuladas através de duas instruções: •WAIT; •SIGNAL; Monitores • Sincronização condicional: – WAIT coloca o processo no estado de espera, até que outro processo envie um SIGNAL, informado que a condição de espera foi satisfeita; – Caso se execute um SIGNAL sem que um processo esteja aguardando, nenhum efeito terá; Cap. 7 – Sincronização e Comunicação 94 – É possível ter vários processos com sua execução suspensa, assim, o monitor organiza filas associadas as condições de sincronização; – O SIGNAL libera apenas um único processo da fila de espera da condição associada; – Um processo pode executar um procedimento no monitor, mesmo quando um ou mais processos estão na fila de espera; Monitores • Estrutura do monitor com variáveis de condição Declaração devariáveis globais Procedimentos Proc. 1 Condição C1 Cap. 7 – Sincronização e Comunicação 95 Fila de entrada Inicialização de variáveis Proc. 1 Proc. 2 Proc. n M o n i t o r Filas de espera Condição C2 Condição Cn Monitores • Sincronização condicional: – Uma solução para o problema do produtor/consumidor usando-se monitor é apresentado no próximo slide; – O monitor condicional é estruturado com duas variáveis especiais de condição (cheio Cap. 7 – Sincronização e Comunicação 96 duas variáveis especiais de condição (cheio e vazio) e dois procedimentos (produz e consome) Monitores Monitor Condicional; Var Cheio : (* variável especial de condição *) Vazio : (* variável especial de condição *) procedure Produz; begin if (Cont = TamBuf) then WAIT (cheio); : if (Cont = 1) then SIGNAL (vazio); Cap. 7 – Sincronização e Comunicação 97 if (Cont = 1) then SIGNAL (vazio); end; procedure Consume; begin if (Cont = 0) then WAIT (vazio); : if (Cont = Tambuf - 1) then SIGNAL (cheio); end; begin end; Monitores • Sempre que o produtor desejar gravar um dado, deve chamar o procedimento Produz, que testa se existe posições vagas no buffer, se não tiver, deve executar um WAIT em cheio, suspendendo a execução até que um outro processo execute um SIGNAL em cheio; Cap. 7 – Sincronização e Comunicação 98 cheio; • No caso do consumidor, deve executar o procedimento Consume sempre que desejar ler um dado do buffer, caso o buffer esteja vazio deve suspender a sua execução efetuando um WAIT no vazio e esperar um SIGNAL no vazio para continuar; Monitores • No próximo slide uma solução completa para o problema Produtor/Consumidor utilizando-se de monitor condicional; • Os procedimentos Produz_Dado e Consome_Dado servem para entrada e Cap. 7 – Sincronização e Comunicação 99 Consome_Dado servem para entrada e saída de dados; • Os procedimentos Grava_Dado e Le_Dado são responsáveis pela transferência e recuperação do dado no buffer; Monitores Program Pro_Con_3; Const TamBuf = (* tamanho do buffer *) Dado : array[1..TamBuf] of (*tipo dado *) Monitor Condicional; Var Cheio : (* variável especial de condição *) Vazio : (* variável especial de condição *) Cont : integer; procedure Produz; begin if (Cont = TamBuf) then WAIT (cheio); procedure Produtor begin repeat Produz_Dado (Dado); Condicional.Produz; until false; end; Procedure Consumidor; begin repeat Condicional.Consome; Consome_Dado (Dado); Cap. 7 – Sincronização e Comunicação 100 if (Cont = TamBuf) then WAIT (cheio); Grava_Dado (Dado, buffer); Cont = Cont + 1; if (Cont = 1) then SIGNAL (vazio); end; procedure Consume; begin if (Cont = 0) then WAIT (vazio); Le_Dado (Dado, buffer); Cont = Cont - 1; if (Cont = Tambuf-1) then SIGNAL (cheio); end; begin Cont := 0; end; Consome_Dado (Dado); until false; end; begin PARABEGIN Produtor; Consumidor; PARAEND; end. Troca de Mensagens • Troca de mensagens é um mecanismo de comunicação e sincronização entre processos; • O S.O. possui um subsistema de troca de mensagens, sem que haja necessidade do uso de variáveis Cap. 7 – Sincronização e Comunicação 101 necessidade do uso de variáveis compartilhadas; • Para a comunicação entre processos deve existir um canal de comunicação, este podendo ser um buffer ou um linke de comunicação; Troca de Mensagens • Os processos cooperativos trocam mensagens através de duas rotinas: – SEND(receptor, mensagem); •Envia uma mensagem para um processo receptor; Cap. 7 – Sincronização e Comunicação 102 receptor; – RECEIVE (transmissor, mensagem); •Recebe a mensagem enviada por um processo transmissor; Troca de Mensagens • Transmissão de mensagem Processo transmissor Processo receptor Cap. 7 – Sincronização e Comunicação 103 SEND RECEIVE Canal de comunicação Troca de Mensagens • Este mecanismo exige que os processos envolvidos tenham suas execuções sincronizadas; • Isto é necessário, já que a mensagem só pode ser tratada após o seu Cap. 7 – Sincronização e Comunicação 104 só pode ser tratada após o seu recebimento; • Ou que o envio de uma mensagem pode ser condição para a continuação da execução do processo; Troca de Mensagens • a troca de mensagens pode ser implementada de duas formas: – Comunicação direta; – Comunicação indireta; Cap. 7 – Sincronização e Comunicação 105 Troca de Mensagens • Comunicação direta – Exige ao enviar ou receber uma mensagem o processo enderece explicitamente o nome do processo receptor ou transmissor; – Só permite a troca de mensagens entre Cap. 7 – Sincronização e Comunicação 106 – Só permite a troca de mensagens entre dois processos; – O principal problema é a necessidade de especificação do nome dos processos envolvidos; – Se mudar a identificação dos processos deve-se alterar o código do programa; Troca de Mensagens • Comunicação direta Processo A Processo B Cap. 7 – Sincronização e Comunicação 107 Troca de Mensagens • Comunicação indireta; – Utiliza-se uma área compartilhada, onde as mensagens pode ser escritas e lidas; – Esse tipo de buffer é conhecido como mailbox ou port; Cap. 7 – Sincronização e Comunicação 108 – Suas características (identificação, capacidade, etc.) são definidas no momento a criação; – Vários processos podem estar associado a um mailbox, e as rotinas SEND e RECEIVE passam o nome do mailboxes e não mais o nome dos processos; Troca de Mensagens • Comunicação indireta Processo A Processo B Cap. 7 – Sincronização e Comunicação 109 Mailbox ou Port Troca de Mensagens • Independente do mecanismo de comunicação utilizado, os processos envolvidos devem ter suas execuções sincronizadas em função do fluxo de mensagens; Cap. 7 – Sincronização e Comunicação 110 mensagens; – Um processo não pode tratar de uma mensagem que não recebeu; – Um processo não pode receber a mesma mensagem mais de uma vez; Troca de Mensagens • Esquemas para implementar o sincronismo: – Manter o processo transmissor esperando até a confirmação de leitura; • Um processo ao tentar receber uma mensagem ainda não enviada, deve permanecer esperando até que o processo transmissor faça o envio; Cap. 7 – Sincronização e Comunicação 111 • Este esquema implementa uma comunicação síncrona, conhecida como rendezvous; • O problema é que a execução dos processos fica limitado ao tempo de processamento da mensagens; – Uma variação mais eficiente de rendezvous, é não bloquear o processo transmissor; Troca de Mensagens • Esquemas para implementar o sincronismo: – No terceiro esquema é implementado uma forma assíncrona de comunicação; • O processo transmissor e receptor não permanecem esperado o envio e recebimento da mensagem; Cap. 7 – Sincronização e Comunicação 112 • Além dos buffers para armazenar as mensagens devem haver mecanismos para permitir ao processo identificar se uma mensagem já foi enviada ou recebida; • A grande vantagem é aumentar a eficiência de aplicações concorrentes; Troca de Mensagens Program Prod_Con_4 procedure Produtor; Var msg : Tipo_Msg; begin repeat procedure Consumidor; Var msg : Tipo_Msg; begin repeat RECEIVE(Msg); Consome_Mensagem(Msg); until false; Cap. 7 – Sincronização e Comunicação 113 Produz_Mensagem(Msg ); SEND(Msg); until false; end; until false; end; begin PARABEGIN Produtor; Consumidor; PARAEND; End. Deadlock • Deadlock é a situação em que um processo aguarda por um recurso que nunca estará disponível; • Normalmente,conseqüência de compartilhamento de recursos em processos concorrentes onde a Cap. 7 – Sincronização e Comunicação 114 processos concorrentes onde a exclusão mútua é exigida; • Torna-se mais freqüente e crítico com a evolução dos S.O. implementado o paralelismo e alocação dinâmica de recursos; Deadlock • Próxima figura exemplo de deadlock conhecido como espera circular; • Cada processo espera que outro processo libere o recurso alocado; Cap. 7 – Sincronização e Comunicação 115 Deadlock • Espera circular Processo A Processo A solicita o Recurso 2 Recurso 1 alocado ao Processo A Cap. 7 – Sincronização e Comunicação 116 Recurso 2 Recurso 1 Processo B Recurso 2 alocado ao Processo B Processo B solicita o Recurso 1 Deadlock • Condições necessárias – Exclusão mútua; • cada recurso só pode estar alocado a um único processo; – Espera por recurso; • Um processo pode estar esperando por outros recursos Cap. 7 – Sincronização e Comunicação 117 recursos – Não-preempção; • Um recurso não pode ser liberado de um processo, só porque outros processos desejam o mesmo recurso; – Espera circular; • Um processo pode ter de esperar por um recurso alocado a outro processo e vice-versa; Deadlock • Deadlock existe em qualquer sistema multiprogramável; • As solução implementas devem considerar o tipo do sistema e o impacto em seu desempenho; Cap. 7 – Sincronização e Comunicação 118 impacto em seu desempenho; – usina nuclear x folha de pagamento Deadlock • Prevenção – Para evitar o deadlock evitar que uma das condições citadas não ocorra; – Ausência da primeira condição (exclusão mútua), a falta da exclusão mútua gerará várias inconsistências já mencionadas; Cap. 7 – Sincronização e Comunicação 119 várias inconsistências já mencionadas; Deadlock • Ausência da segunda condição (espera por recurso): – Processos que já possuam recursos garantidos não devem requisitar novos recursos; – Uma forma é pré-alocar todos os recursos Cap. 7 – Sincronização e Comunicação 120 – Uma forma é pré-alocar todos os recursos necessários a um processo; – Esta solução pode gerar um grande desperdício de recursos; – É difícil determinar o número de recursos que um processo utiliza; – O mais grave é a possibilidade sofrer starvation; Deadlock • Ausência da terceira condição (não- preempção): – Pode ser evita se permitir que um recurso seja retirado do processo no caso de outro precisar; Cap. 7 – Sincronização e Comunicação 121 – A liberação de recursos já garantidos pode ocasionar sérios problemas, podendo até impedir a continuidade do processo; – Pode ocorre starvation; Deadlock • Ausência da quarta condição (espera circular); – Forçar que o processo só tenha um recurso por vez; – Esta condição restringiria muito o grau de Cap. 7 – Sincronização e Comunicação 122 – Esta condição restringiria muito o grau de compartilhamento e o processamento de programas; Deadlock • A prevenção de Deadlock (evitando uma das quatro condições) é bastante limitada e não é utilizada na prática; • É possível evitar o deadlock, mesmo com as quatro condições presentes; • A solução mais conhecida é o Algoritmo do Cap. 7 – Sincronização e Comunicação 123 • A solução mais conhecida é o Algoritmo do Banqueiro (Bank’s Algorithm) proposto por Dijkstra(1965); • Basicamente, este algoritmo exige que os processos informem o número máximo de cada tipo de recurso necessário a sua execução; Deadlock • Com estas informações, é possível definir o estado de alocação de cada recurso, que é a relação entre o número de recursos alocados e disponíveis e o número máximo de Cap. 7 – Sincronização e Comunicação 124 disponíveis e o número máximo de processos que necessitam desses recursos. • Com estas informações, o S.O. pode alocar os recursos evitando o deadlock (Tanenbaum 2001); Deadlock • Este algoritmo possui várias limitações, a maior é a necessidade de um número fixo de processos ativos e de recursos disponíveis; Cap. 7 – Sincronização e Comunicação 125 Deadlock • Detecção do deadlock – É necessário mecanismos de detecção de deadlock, onde não existam prevenção de deadlock; – Esta detecção identifica a existência de deadlock e quais os recursos e processos envolvidos neste problema; Cap. 7 – Sincronização e Comunicação 126 problema; – Para tanto é necessário ao S.O. manter estruturas de dados para identificar cada recurso do sistema, o processo que o está alocando e os processos que estão a espera para usar o recurso; – Geralmente os algoritmos que verificam a espera circular percorrem esta estrutura sempre que um processo solicita um recurso; Deadlock • Detecção do deadlock – Dependendo do S.O. o ciclo de busca de deadlock pode variar; – Em sistema de tempo compartilhado o tempo de busca pode ser maior, sem comprometer-lo; Cap. 7 – Sincronização e Comunicação 127 comprometer-lo; – Sistemas de tempo real devem constantemente verificar, porém a maior segurança leva a um maior overhead; Deadlock • Correção – Uma solução bastante utilizada é eliminar um ou mais processos envolvidos no deadlock desalocando recursos, quebrando assim a espera circular; – A eliminação de processos não é simples, Cap. 7 – Sincronização e Comunicação 128 – A eliminação de processos não é simples, dependendo do tipo de recurso envolvido; •Por exemplo: impressão e gravação em disco; – Os processos eliminados não tem como ser recuperados, mas os outros processos envolvidos no deadlock continuarão; Deadlock • Correção – A escolha do processo, normalmente, é feita de forma aleatória, ou com base em algum tipo de prioridade; – Este esquema pode consumir tempo considerável do processador, aumentando overhead; Cap. 7 – Sincronização e Comunicação 129 – Uma solução menos drástica envolve a liberação de alguns recursos até que o ciclo termine; – Para esta solução ser eficiente, é necessário que o sistema pode suspender um processo, liberar seus recursos e após a solução, possa retornar ã execução, sem perder o processamento já realizado; Deadlock • Correção – Este mecanismo é conhecido com rollback: •Além do overhead; •É muito difícil de ser implementado; •É bastante dependente da aplicação; Cap. 7 – Sincronização e Comunicação 130 •É bastante dependente da aplicação; Arquitetura de Sistemas Arquitetura de Sistemas OperacionaisOperacionais Cap. 8 – Gerência do Processador 1 Capítulo 8Capítulo 8 Gerência do ProcessadorGerência do Processador Sumário • Introdução • Funções Básicas • Critérios de escalonamento • Escalonamentos não-preemptivos e preemptivos Cap. 8 – Gerência do Processador 2 • Escalonamento FIFO • Escalonamento SJF • Escalonamento cooperativo • Escalonamento circular • Escalonamento por prioridades • Escalonamento circular com prioridades Sumário • Escalonamento por múltiplas filas • Escalonamento por múltiplas filas com realimentação • Política de Escalonamento em Sistemas de Tempo Compartilhado • Política de Escalonamento em Sistemas de Cap. 8 – Gerência do Processador 3 • Política de Escalonamento em Sistemas de Tempo Real Introdução • Surgimento de sistemas multiprogramavéis, a gerencia do processador passou a ser uma das principais atividades do S.O.; • Como podem existir diversos processos no estado de pronto deve-se estabelecer um critério para a escolha do processo que Cap. 8 – Gerência do Processador 4 critério para a escolha do processo que passará ao estado de execução; • Os critérios da escolha do processocompõem a política de escalonamento, que é a base da gerencia do processador no S.O.; Introdução • Escalonamento Estado de Execução Escal Cap. 8 – Gerência do Processador 5 Estado de Espera Estado de Pronto scalo na m ento Funções Básicas • A política de escalonamento possui diversas funções básicas: – Manter a UCP ocupada a maior parte do tempo; – Balancear o uso da UCP entre processos; – Privilegiar a execução de aplicações críticas; – Maximizar o throughput; Cap. 8 – Gerência do Processador 6 – Maximizar o throughput; – Oferecer tempos de resposta razoáveis para usuários interativos; • Cada SO possui uma política de escalonamento adequada ao seu propósito; Funções Básicas • O escalonador (scheduler) é a rotina do SO responsável pela implementação dos critérios da política de escalonamento; • Já o dispatcher é a rotina responsável pela troca de contexto dos processos; • O tempo gasto na troca de processos é Cap. 8 – Gerência do Processador 7 • O tempo gasto na troca de processos é chamado de latência do dispatcher; • O escalonamento é realizado com base em: – Processos, ambientes que implementam processos – Threads, ambientes que implementam threads, neste caso: • Processos – unidades de alocação de recursos; • Threads – unidades de escalonamento; Critérios de Escalonamento • As características do SO determinam quais são as principais características do escalonador; • Os principais critérios a serem considerados em uma política de Cap. 8 – Gerência do Processador 8 considerados em uma política de escalonamento são: Critérios de Escalonamento • Utilização do processador; – É desejável que um processador permaneça ocupado a maior parte do tempo; • 30% - baixa utilização • 90% - alta utilização, sistema carregado • Throughput; Cap. 8 – Gerência do Processador 9 • Throughput; – Representa o número de processos executados em um intervalo de tempo; – A sua maximização é desejada na maioria dos casos; • Tempo de Processador / Tempo de UCP – É o tempo que um processo leva no estado execução; – As políticas de escalonamento não influenciam; – Este tempo é função do código e dos dados de entrada; Critérios de Escalonamento • Tempo de Espera – É o tempo total que um processo permanece na fila de pronto; – A sua redução é desejada pela maioria das políticas de escalonamento; • Tempo de Turnaround; – É o tempo que um processo leva da sua criação até o seu término; Cap. 8 – Gerência do Processador 10 – É o tempo que um processo leva da sua criação até o seu término; – As políticas de escalonamento buscam minimizá- lo; • Tempo de Resposta; – É o tempo decorrido entre uma requisição e o instante que a resposta é dada; – Normalmente este tempo é limitado pela velocidade dos dispositivos de E/S; Critérios de Escalonamento • De forma geral se busca: – Otimizar a utilização do processador; – Otimizar o throughput; – Diminuir os tempos: •Turnaround; Cap. 8 – Gerência do Processador 11 •Turnaround; •Espera; •Resposta; • Estas funções podem ser conflitantes; • O tipo de S.O. determina a importância dos critérios; Escalonamentos Não-Preemptivo e Preemptivo • Preempção – possibilidade do SO interromper um processo em execução e substituí-lo por outro; • Para implementar a preempção o SO são mais complexos, porém, permitem Cap. 8 – Gerência do Processador 12 são mais complexos, porém, permitem políticas de escalonamento mais flexivéis; • O escalonamento pode ser: • Não-preemptivo; • Preemptivo. Escalonamentos Não-Preemptivo e Preemptivo • Não-preemptivo; – Primeiro tipo de escalonamento implementado; – Predomínio do processamento batch; – Um evento externo pode ocasionar a perda Cap. 8 – Gerência do Processador 13 – Um evento externo pode ocasionar a perda do processador ; – O processo só sai do estado de execução quando termina, ou executa instruções que alterem o seu estado para espera Escalonamentos Não-Preemptivo e Preemptivo • Preemptivo. – O sistema pode interronper um processo em execução e mudar seu estado para pronto; – É possível ao sistema priorizar a execução de processos, como nas aplicações de Cap. 8 – Gerência do Processador 14 de processos, como nas aplicações de tempo real; – Permite compartilhar o processador de uma maneira mais uniforme, por exemplo determinar uma fatia de tempo para ser usado pelo processo; Escalonamento FIFO • Escalonamento First-In-First-Out, também conhecido como first-come-first-served (FCFS scheduling); • O primeiro processo que chegar ao estado pronto é o selecionado para a execução; • É bastante simples de se implementar, Cap. 8 – Gerência do Processador 15 • É bastante simples de se implementar, necessitando apenas de uma fila; • Nesta fila os processos que passam para o estado pronto entram no final da fila; • O processo que vai ser executado é o que está no início da fila; Escalonamento FIFO UCP Estado de Criação Fila dos processos no estado de Pronto Estado de Término Cap. 8 – Gerência do Processador 16 Estado de Espera Escalonamento FIFO • No próximo slide um exemplo de escalonamento FIFO; • Três processos: – A 10 u.t. – B 5 u.t. – C 4 u.t. Cap. 8 – Gerência do Processador 17 – C 4 u.t. • Duas situações na fila de pronto: – A, B, C • Tempo médio de espera é (0+10+14)/3=8 u.t.; – B, C, A • Tempo médio de espera é (7+0+4)/3=3,7 u.t.; Escalonamento FIFO • Exemplo Processo A Processo B Processo C Cap. 8 – Gerência do Processador 18 10 14 17 Processo A Processo B Processo C 4 7 17 u.t. u.t. Processo Tempo de processador (u.t.) A B C 10 4 3 Escalonamento FIFO • Deficiências: – Impossibilidade de prever quando um processo terá sua execução iniciada, já dependente do tempo de execução dos processos que estão antes na fila; – Os processos CPU-bound levam vantagem Cap. 8 – Gerência do Processador 19 – Os processos CPU-bound levam vantagem em relação aos processos I/O bound. Se os processos I/O bound forem mais importantes não a como privilegiá-los; – Este escalonamento é do tipo não- preemptivo; Escalonamento FIFO – Inicialmente usado em sistemas monoprogramavéis com processamento em batch; – Ineficiente, se for aplicado na forma original em sistemas interativos de tempo compartilhado; Cap. 8 – Gerência do Processador 20 compartilhado; – Atualmente, sistemas de tempo compartilhado utilizam deste escalonamento com variações, permitindo sua implementação parcial. Escalonamento SJF • Escalonamento shortest-job-first (SJF), também conhecido como shortest-process- next (SPN scheduling); • O algoaritmo escolhe o processo que tiver o menor tempo de processador a ser executado; Cap. 8 – Gerência do Processador 21 executado; • O processo, na fila de pronto, que necessitar de menor tempo para terminar será selecionado; • Exemplo no próximo slide: – C, B, A • Tempo médio de espera é (7+3+0)/3=3,3 u.t.; Escalonamento SJF • Escalonamento Shortest-Job-First Processo A Cap. 8 – Gerência do Processador 22 Processo B Processo C 3 7 17 u.t. Escalonamento SJF • Implementação usada nos primeiros S.O. com processamento exclusivamente batch; • Para cada processo é associado um tempo de processador; • Como não é possível precisar este tempo, é utilizado uma estimativa; Cap. 8 – Gerência do Processador 23 utilizado uma estimativa; • Esta estimativa é obtida de uma análise estatística das execuções passadas; • Caso o tempo informado fosse muito inferior ao real, o S.O. poderia interromper aexecução do processo; Escalonamento SJF • O principal problema é estimar este tempo para os processos interativos; • Uma forma de implementá-lo em ambientes interativos é considerar o comportamento do processo neste ambiente; – Executar poucas instruções e executar uma operação de E/S. Cap. 8 – Gerência do Processador 24 operação de E/S. – Neste caso utiliza-se o tempo de CPU que será utilizado da próxima vez e não o tempo total de processamento até o término. – Mas é difícil ao S.O. calcular o tempo acima; – Mas pode-se utilizar o seu comportamento no passado, o tempo pode ser estimado como a média exponencial dos tempos passados: Escalonamento SJF • Onde – tn = tempo mais recente – δn = valor historio – α = alterando o valor da constante α (0 < ( ) nnn t δααδ −+=+ 11 Cap. 8 – Gerência do Processador 25 – α = alterando o valor da constante α (0 < α < 1) é possível ponderar a importância do passado Escalonamento SJF • Inicialmente, o SJF é não-preemptivo; • A vantagem em relação ao FIFO esta na redução de tempo médio de turnaround; • Mas pode haver starvation para processos com tempo de processador muito longo ou do tipo CPU-bound; Cap. 8 – Gerência do Processador 26 do tipo CPU-bound; • Uma implementação preemptiva é a shortest remain time (SRT sheduling) – Toda vez que um processo em estado pronto tiver um tempo de processador estimado menor que o processo em execução, substituí o processo que está em execução – O risco de starvation permanece. Escalonamento Cooperativo • O escalonamento cooperativo é uma implementação que busca aumentar o grau de multiprogramação em políticas de escalonamento que não possuem preempção; • Nesta implementação, o processo em Cap. 8 – Gerência do Processador 27 • Nesta implementação, o processo em execução, voluntariamente, libera o processo, retornando-o a fila de pronto; • A liberação do processo é uma tarefa executada, exclusivamente, pelo processo em execução, que de forma cooperativa libera o processador para outro processo; Escalonamento Cooperativo • O processo em execução verifica a fila de mensagens para determinar se existem processos na fila de pronto; • Como a interrupção não é responsabilidade do S.O., algumas situações indesejadas podem ocorrer: Cap. 8 – Gerência do Processador 28 – Se um processo não verificar a fila de mensagem, gerará sérios problemas para a multiprogramação cooperativa, já que um programa poderá permanecer por um longo período de tempo alocando o processador. • As primeiras versões do Windows usavam este escalonamento, sendo conhecido multitarefa cooperativa. Escalonamento Circular • O escalonamento circular (round robin sheduling) é preemptivo; • Projetado especialmente para sistemas de tempo compartilhado; • Semelhante ao FIFO, porém cada processo possui um tempo limite para o uso do Cap. 8 – Gerência do Processador 29 possui um tempo limite para o uso do processador; • Este tempo é denominado fatia de tempo (time-slice) ou quantum; • Preempção por tempo é nome mecanismo que interrponde o processo em execução quando a sua fatia de tempo expira; Escalonamento Circular • O próximo slide ilustra o escalonamento circular , onde a fila de processos de pronto é tratada como uma fila circular; • O escalonamento é realizado alocando a CPU ao primeiro processo da fila de pronto; • O processo permanece em execução até: Cap. 8 – Gerência do Processador 30 • O processo permanece em execução até: – Termine o seu processamento; – Voluntariamente passe para o estado de espera; – Que a sua fatia de tempo espire, neste caso, sofrendo preempção pelo S.O.; • Um novo processo é escolhido com base na política FIFO; Escalonamento Circular UCP Estado de Criação Fila dos processos no estado de Pronto Estado de Término Cap. 8 – Gerência do Processador 31 Preempção por tempo Estado de Espera Escalonamento Circular • O próximo slide ilustra o escalonamento circular dos processos A, B, C com a fatia de tempo igual 2 u.t.; • Não esta considerado o tempo de Cap. 8 – Gerência do Processador 32 • Não esta considerado o tempo de latência do dispatcher; Escalonamento Circular • Exemplo Processo A Processo B Cap. 8 – Gerência do Processador 33 Processo B Processo C 2 4 17 u.t.6 8 10 11 Escalonamento Circular • O valor da fatia de tempo depende do S.O., normalmente varia entre 10 e 100 milissegundos; • Este valor afeta diretamente o desempenho: Cap. 8 – Gerência do Processador 34 desempenho: – Valor muito alto, tenderá ter o mesmo comportamento da política FIFO; – Valor muito baixo, haverá muitas preempções, prejudicando o desempenho e afetando o turnaround dos processos Escalonamento Circular • A principal vantagem do escalonamento circular é não permitir que um processo monopolize a CPU; • Este tipo de escalonamento é adequado aos sistemas de tempo Cap. 8 – Gerência do Processador 35 adequado aos sistemas de tempo compartilhado, onde existam muitos processos interativos; Escalonamento Circular • Um problema nesta política é que processos CPU-bound são beneficiados em relação aos I/O-bound quando ao uso de processador; • Os CPU-bound tendem a usar toda a fatia de tempo e os I/O-bound tem Cap. 8 – Gerência do Processador 36 fatia de tempo e os I/O-bound tem maior probabilidade de passar para o estado de espera antes de sofre a preempção; • Estas características levam a um balanceamento desigual no uso do processador; Escalonamento Circular • Um refinamento para reduzir este problema é o escalonamento circular virtual, próximo slide; • Neste esquema os processos que saem do estado de espera vão para uma fila de pronto auxiliar, que possui uma prioridade maior que a fila de pronto; • O escalonador só seleciona um processo da lista de pronto de a lista de pronto auxiliar estiver vazia; • Quando um processo é buscado da lista auxiliar seu Cap. 8 – Gerência do Processador 37 • Quando um processo é buscado da lista auxiliar seu tempo de execução é calculado como o tempo da fatia de tempo menos o tempo de processador utilizado na última execução; • Estudos comprovam o balanceando mais equilibrado no uso do processador, apesar da maior complexidade para implementar Escalonamento Circular • Escalonamento circular virtual Preempção por tempo UCP Estado de Criação Fila dos processos no estado de Pronto Estado de Término Cap. 8 – Gerência do Processador 38 Preempção por tempo Estado de Espera Fila auxiliar Escalonamento por Prioridades • É um escalonamento do tipo preemptivo que considera um valor chamado de prioridade de execução; • O processo com maior prioridade na fila de pronto é sempre selecionado para a execução; Cap. 8 – Gerência do Processador 39 para a execução; • Processos com a mesma prioridade são selecionados utilizando-se do FIFO; • Não existe o conceito de fatia de tempo, portanto não existe preempção por tempo; Escalonamento por Prioridades • A perda do uso do processador ocorre: – Forma voluntária; – Quando um processo de maior prioridade passa para o estado de pronto; • Preempção por prioridade é o mecanismo do S.O. que interrompe o processo em execução, salva seu contexto, coloca-o no Cap. 8 – Gerência do Processador 40 execução, salva seu contexto, coloca-o no estado de pronto e escalona o processo de maior prioridade; • Esta preempção é implementada através de interrupção de clock, permitindo, assim, a rotina de escalonamento reavalie as prioridades dos processos no estado de pronto; Escalonamentopor Prioridades • O próximo slide exibe o escalonamento por prioridades; • Para cada prioridade existe uma fila de estado pronto que é tratada como uma fila circular; • O escalonamento é realizado alocando o Cap. 8 – Gerência do Processador 41 • O escalonamento é realizado alocando o processador ao primeiro processo da fila de maior prioridade; • O processo perderá o processador: – Se terminar o processamento; – Voluntariamente passar para o estado de espera; – Se sofrer um preempção por prioridade. Escalonamento por Prioridades Estado de Término Filas dos processos no estado de Pronto Prioridade P1 Prioridade P2 Estado de Criação Cap. 8 – Gerência do Processador 42 UCP Término Prioridade Pn Criação Estado de Espera Preempção por prioridade Escalonamento por Prioridades • Exemplo, onde 5 é o valor de maior prioridade Processo A Processo B Processo Tempo de processador (u.t.) A 10 Prioridade 2 Cap. 8 – Gerência do Processador 43 Processo B Processo C 3 13 17 u.t. A B C 10 4 3 2 1 3 Escalonamento por Prioridades • Este escalonamento também pode ser implementado de forma não-preemptiva; • Assim, os processos que passam para o estado de pronto com prioridade maior que o processo em execução, não geram preempção por prioridade, são apenas Cap. 8 – Gerência do Processador 44 preempção por prioridade, são apenas colocados no início da fila de pronto; • Cada S.O.implementa a sua faixa de valores para a prioridade, que podem ser: – Valores maiores, maior prioridade; – Valores menores, maior prioridade; Escalonamento por Prioridades • Open VMS, a prioridade varia de 0 a 31, onde 31 é a maior prioridade; • No IBM-AIX, a prioridade vária de 0 a 127, onde zero é a maior prioridade; • A prioridade de execução é uma característica do contexto de software e pode Cap. 8 – Gerência do Processador 45 característica do contexto de software e pode ser: – Estática, seu valor não é alterado durante a execução do programa; – Dinâmica, seu valor pode ser ajustado de acordo com o S.O., permitindo ajustar o critério de escalonamento de função do comportamento de cada processo no sistema; Escalonamento por Prioridades • Um dos principais problema deste escalonamento é o starvation; – Processos de baixa prioridade podem não ser escalonados; – Uma solução para este problema é Cap. 8 – Gerência do Processador 46 – Uma solução para este problema é incrementar gradualmente a prioridade de processos que permanecem muito tempo na fila de pronto, esta técnica é chamada de aging; Escalonamento por Prioridades • Usando este escalonamento é possível diferenciar os processos por critérios de importância; • Este tipo de escalonamento é bastante útil em sistemas de tempo real e nas Cap. 8 – Gerência do Processador 47 útil em sistemas de tempo real e nas aplicações de controle de processos e também em sistemas de tempo compartilhado, quando se precisa priorizar o escalonamento de determinados processos; Escalonamento Circular com Prioridades • Este escalonamento implementa o conceito de fatia de tempo e de prioridade de execução associada a cada processo; • Um processo permanece em estado de Cap. 8 – Gerência do Processador 48 • Um processo permanece em estado de execução: – Até o fim do seu processamento; – Voluntariamente passa ao estado de espera; – Preempção por tempo; – Preempção por prioridade; Escalonamento Circular com Prioridades Estado de Término Fila dos processos no estado de Pronto Prioridade P1 Prioridade P2 Estado de Criação Cap. 8 – Gerência do Processador 49 UCP Término Prioridade Pn Criação Estado de Espera Preempção por tempo ou prioridade Escalonamento Circular com Prioridades • A principal vantagem é permitir o melhor balanceamento, e priorizar os processos; • É utilizando, amplamente, em sistemas de tempo compartilhado; Cap. 8 – Gerência do Processador 50 de tempo compartilhado; Escalonamento por Múltiplas Filas • No escalonamento por múltiplas filas (multilevel queue scheduling) existem diversas filas de processo no estado de pronto, cada uma com sua prioridade; • Os processos são associados as filas Cap. 8 – Gerência do Processador 51 • Os processos são associados as filas em função de características, como: – Importância da aplicação; – Tipo de processamento; – Área de memória necessária; Escalonamento por Múltiplas Filas • Como os processos possuem características diferentes é pouco provável que um único mecanismo de escalonamento seja adequado para todos; • A sua principal vantagem é a possibilidade da convivência de mecanismos de Cap. 8 – Gerência do Processador 52 convivência de mecanismos de escalonamento distintos em um único S.O.; • Cada fila possui um escalonador próprio, permitindo, por exemplo, que alguns processos sejam escalonados pelo FIFO e outros pelo circular; Escalonamento por Múltiplas Filas • Este mecanismo, o processo não possui prioridade, ficando esta característica associada a fila; • O processo em execução sofre preempção caso outro processo entre em uma fila de maior prioridade; Cap. 8 – Gerência do Processador 53 maior prioridade; • Só se pode escalonar um processo de uma determina fila caso as filas de maior prioridade estejam vazias; • Uma boa prática é classificar os processos em função do tipo de processamento; Escalonamento por Múltiplas Filas • Para exemplificar – próximo slide: – Processos divididos em três grupos, listados pela ordem de prioridade: •Sistema – maior prioridade, escalonador baseado em prioridades; Cap. 8 – Gerência do Processador 54 • Interativo – prioridade intermediária, escalonamento circular; •Bath – menor prioridade, escalonamento circurlar (o mesmo do interativo, porém de menor prioridade); Escalonamento por Múltiplas Filas Fila de processos do sistema Fila de processos interativos Maior prioridade Cap. 8 – Gerência do Processador 55 UCP Fila de processos batch Menor prioridade Escalonamento por Múltiplas Filas • Uma desvantagem com este escalonamento, é que se o processo mudar o seu comportamento não pode mudar de fila; • A associação do processo com a fila é Cap. 8 – Gerência do Processador 56 • A associação do processo com a fila é executada na criação do processo, permanecendo até o término do seu processamento; Escalonamento por Múltiplas Filas com Realimentação • No escalonamento por múltiplas filas com realimentação (multilevel feedback queues scheduling) é semelhante ao escalonamento por múltiplas filas, porém os processos podem mudar de fila durante o Cap. 8 – Gerência do Processador 57 podem mudar de fila durante o processamento; • Sua grande vantagem é permitir ao S.O. identificar o comportamento do processo e redirecioná-lo a fila mais adequada (considerando a prioridade e tipo de escalandor); Escalonamento por Múltiplas Filas com Realimentação • Este escalonamento permite que os processos sejam redirecionados entre diversas filas, permitindo ao S.O. implementar um mecanismo de ajuste dinâmico denominado mecanismo Cap. 8 – Gerência do Processador 58 dinâmico denominado mecanismo adaptativo; • Os processos não são previamente associados a fila de pronto, mas direcionados para as filas existentes com base no seu comportamento; Escalonamento por Múltiplas Filas com Realimentação • Um mecanismo FIFO adaptado com fatia de tempo é usado com escalonador em todas as filas, com exceção da fila de menor prioridade, que utiliza o escalonador
Compartilhar