Escolar Documentos
Profissional Documentos
Cultura Documentos
7.6.8.8.1 Semáforos.....................................................................................2
7.6.8.8.2 Monitores .....................................................................................3
7.6.8.9 Troca de Mensagens........................................................................5
7.6.8.10 Deadlock........................................................................................7
7.6.8.10.1 Prevenção de Deadlock ..............................................................8
7.6.8.10.2 Detecção do Deadlock................................................................9
7.6.8.10.3 Correção de Deadlock ..............................................................10
8. Gerência de Processador................................................................................................... 10
8.1 Critérios de Escalonamento ........................................................................................ 11
8.1.1 Utilização da UCP............................................................................11
8.1.2 Throughput .......................................................................................11
8.1.3 Tempo de Turnaround......................................................................11
8.1.4 Tempo de resposta............................................................................11
8.2 Escalonamento Não-preenptivo...................................................................................... 12
8.2.1 Escalonamento First-In-First-Out (FIFO) ............................................................... 12
8.2.2. Escalonamento Shortest-Job-First (SJF) ................................................................ 13
8.2.3 Escalonamento Cooperativo .................................................................................... 14
8.3 Escalonamento Preemptivo ............................................................................................ 14
8.3.1 Escalonamento Circular........................................................................................... 14
8.3.2 Escalonamento por Prioridades ............................................................................... 15
8.3.3 Escalonamento por Múltiplas Filas ......................................................................... 16
8.3.3.1 Escalonamento por Múltiplas Filas com Realimentação ..............17
8.3.4 Escalonamento de Sistemas de Tempo Real ........................................................... 18
8.3.5 Escalonamento com Múltiplos Processadores......................................................... 18
7.6.8.8.1 Semáforos
Um semáforo é uma variável inteira, não negativa, que só pode ser manipulada por
duas instruções: DOWN e UP, também chamadas, originalmente, instruções P e V.
No caso da exclusão mutua, as instruções DOWN e UP funcionam como protocolos
de entrada e saída, respectivamente, para que um processo possa entrar e sair de usa região
crítica. O semáforo foi associado a um recurso compartilhado, indicando quando o recurso
está sendo acessado por um dos processos concorrentes. Se seu valor for maior que O,
nenhum processo está utilizando o recurso; caso contrário, o processo fica impedido.
Sempre que um processo deseja entrar em sua região crítica ele executa uma instrução
DOWN.
Isso quer dizer que o valor era 0, para que outro não entre nesta região é feito um
decremento de 1. Caso outro processo deseje executar sua região crítica e valor seja igual a
0, o processo ficará no estado de espera, em um fila associada ao semáforo.
O processo que está acessando sua região crítica, executa uma instrução UP,
incrementando o semáforo de 1 e liberando o acesso ao recurso.
Essas operações são indivisíveis; assim, é garantido que, se uma das operações for
iniciada, nenhum outro processo poderá ter acesso ao semáforo até o término dessa
operação. Normalmente as instruções DOWN e UP são implementadas como rotinas do
sistema (system calls), com o sistema desabilitando todas as interrupções para a execução
exclusiva das instruções.
Semáforos aplicados ao problema de exclusão mútua são chamados mutexes
(mutual exclusion semaphores) ou binários, (por apenas assumirem os valores) 0 e 1.
Além de permitirem a solução da exclusão mútua, os semáforos podem ser
utilizados para implementar a sincronização condicional. Em geral, se existe um processo
que deve ser modificado sobre a ocorrência de um evento e também existe outro capaz de
detectar sua ocorrência, podemos utilizar um semáforo associado ao evento esperado para
sincronizar ambos os processos.
Semáforos do tipo Vazio e Cheio são chamados de semáforos contadores, sendo
bastante úteis quando aplicados na alocação de recursos do mesmo tipo (pool). O semáforo
é inicializado com o número total do pool, e, sempre que um processo deseja um recurso,
executa um DOWN, subtraindo 1 do número de recursos disponíveis. Da mesma forma
sempre que libera um recurso para o pool, executa um UP. Se o semáforo contador ficar
igual a 0, isso significa que não existem mais recursos a serem utilizados, e o processo eu
solicitou o recurso permanece esperando, até que outro processo libere algum recurso para
o pool.
7.6.8.8.2 Monitores
O uso de semáforos exige do programador muito cuidado, pois qualquer engano
pode levar a problemas de sincronização imprevisíveis e difíceis de reproduzir, devido à
execução concorrente dos processos. Monitores são mecanismos de sincronização de alto
nível, que tentam tornar mais fáceis o desenvolvimento e a correção de programas
concorrentes.
O monitor é um conjunto de procedimentos, variáveis e estrutura de dados definidos
dentro de um módulo. Sua característica mais importante é a implementação automática da
exclusão mútua entre seus procedimentos, ou seja, somente um processo pode estar
executando um dos procedimentos do monitor em um determinado instante. Toda vez que
um processo chama um desses procedimentos, o monitor verifica se já existe outro processo
executando algum procedimento do monitor.
As variáveis globais do monitor são visíveis apenas a ele e a seus procedimentos. O
bloco de comandos do monitor é responsável por inicializar essas variáveis, sendo
executado apenas uma vez, na ativação do programa onde está declarado o monitor. A
estrutura de um monitor é mostrada a seguir, utilizando uma sintaxe Pascal não
convencional.
Toda implementação da exclusão mútua nos monitores é feita pelo compilador, e
não mais pelo programador, como no caso do uso de semáforos. Para isso, basta colocar
todas as regiões criticas em forma de procedimentos no monitor e o compilador se
encarregará de garantir a exclusão mútua desses procedimentos. Assim, o desenvolvimento
de programas concorrentes fica mais fácil e as chances de erro são menores.
O monitor não pode ser executado com uma sub-rotina. A comunicação do processo
com o monitor é feita unicamente através de chamadas a seus procedimentos e dos
parâmetros passados para eles.
A implementação da sincronização condicional não é tão simples quanto à da
exclusão mútua.
Para implementá-la, é necessário utilizar variáveis de condição e duas instruções
que operam sobre elas: WAIT e SIGNAL.
Uma variável de condição é uma estrutura de dados do tipo fila, onde os processos
esperam por algum evento. Sempre que o monitor descobre que alguma condição impede a
continuação da execução de um processo, ele realiza um WAIT, fazendo com que o
processo fique no estado de espera na fila associada a essa condição. Uma característica do
monitor é permitir que um ou mais processos estejam no estado de espera dentro do
monitor.
O processo bloqueado só poderá prosseguir sua execução quando um outro processo
executar um SIGNAL, sobre a mesma condição que o colocou no estado de espera. Nesse
caso, é possível que haja vários processos esperando em uma mesma fila. Um problema
decorrente desse mecanismo é a possibilidade de dois processos estarem executando
procedimentos diferentes dentro do monitor ao mesmo tempo. Para evitar esse problema,
deve-se sempre colocar o comando SIGNAL como sendo o último comando do
procedimento. Assim, o processo, após executar o SIGNAL, abandona o monitor
imediatamente.
Como os monitores são baseados em comandos de uma linguagem de programação,
o compilador da linguagem deve ser capaz de reconhecê-los e implementá-los. São raras as
linguagens que permitem a implementação de monitores, podendo ser citadas, entre elas, a
Concurrent Euclid e o Pascal Concorrente.
7.6.8.10 Deadlock
Isto ocorre quando se está esperando por um processo que nunca ocorrerá. Essa
situação é conseqüência, na maioria das vezes, do compartilhamento de recursos do sistema
entre vários processos, sendo que cada processo deve ter acesso ao recurso de forma
exclusiva (exclusão mútua).
Para que ocorram situações de diadlock em um sistema, são necessárias pelos menos quatro
condições:
1. Cada recurso só pode estar alocado a um único processo em um determinado
instante (exclusão mútua);
2. Um processo, além dos recursos já alocados, pode estar esperando por outros
recursos;
3. Um mecanismo não pode ser liberado de um processo só porque outros processos
desejam o mesmo recurso (não-preenpção);
4. Um processo pode ter de esperar por um recurso alocado a outro processo e vice
versa (espera circular).
O problema de diadlock existe em qualquer sistema operacional multiprogramável, no
entanto, as soluções implementadas devem considerar o tipo do sistema e o impacto em seu
desempenho.
8. Gerência de Processador
Todo sistema multiprogramável possui um critério para determinar qual a ordem na
escolha dos processos para execução entre os vários que concorrem pela utilização do
processador.
O procedimento de seleção é uma das principias funções realizadas por um sistema
operacional, sendo conhecido como escalonamento (scheduling). A parte do código do
sistema operacional responsável pelo escalonamento é chamado de escalonador (scheduler).
Os principais objetivos basicamente são:
9 • Manter a UCP ocupada a maior parte do tempo;
9 • Balancear a utilização do processador entre os diversos processos;
9 • Maximizar o throughput do sistema;
9 • Oferecer tempos de resposta razoáveis para os usuários interativos.
Os objetivos devem ser atendidos de forma que o sistema trate todos os processos
igualmente, evitando, assim, que um processo fique indefinidamente esperando pela
utilização do processador.
Para atender alguns desses objetivos muitas vezes conflitantes, os sistemas operacionais
devem levar em consideração características dos processos, como:
9 • Tipo Batch;
9 • Interativo;
9 • CPU-bound;
9 • I/O-bound.
Sistema de tempo real ou tempo compartilhado também são aspectos fundamentais para
a implementação de uma política adequada de escalonamento.
8.1.2 Throughput
Representa o número de processos (tarefas) executados em um determinado
intervalo de tempo.
A sua maximização é desejada na maioria dos sistemas.