Você está na página 1de 44

Sistemas

Operacionais
Comunicãção entre
Processos
Comunicação Entre Processos
 Uma situação bastante comum no sistema operacional, é haver dois
ou mais processos precisando se comunicar para funcionar
corretamente
 Exemplo: processos que controlam a interface gráfica do
Windows precisam interagir com processos que controlam o
mouse e o teclado, além de trocar informações com os
processos de cada programa que está sendo executado, do
contrário o usuário não consegue trabalhar.

 Esta comunicação é chamada de IPC (Interprocess


Communication–Comunicação entre Processos) e tem como
objetivo promover a cooperação entre processos.

 Existem duas maneiras desta comunicação acontecer:


 Por meio do compartilhamento de recursos

 Por meio de troca de mensagens


Soluções para Exclusão Mútua:
Variáveis de Lock
 O sistema operacional usa uma variável especial
(chamada de variável lock) compartilhada para
sinalizar em que estado estão recurso que está
sendo disputado
 Ao desejar entrar em região crítica, cada processo
deve testar o valor da variável lock:
 Se lock= 0 (zero)
 O recurso está livre para uso
 Se lock= 1 (um)
 O recurso está ocupado e o processo deve aguardar

 Problemas:
 Desperdiça recursos, pois o processo que aguarda pode
ser rápido e mesmo assim aguardar muito tempo
 Existe o risco de acontecer uma condição de corrida na
própria variável lock
Soluções para Exclusão Mútua:
Alternância
 Semelhante à solução anterior, o sistema
operacional usa uma variável lock, mas o
conteúdo da variável indica de quem é a vez
de usar o recurso que está sendo disputado
 Problemas:
 O teste contínuo do valor da variável lock
desperdiça tempo de CPU
 Um processo fora da sua região crítica pode
continuar bloqueando outro (não é uma condição
desejável)
Soluções para Exclusão Mútua:
Dormir e Acordar
 A idéia é evitar a espera ocupada que causa
desperdício de CPU
 Para isso, os processos são bloqueados quando não
podem entrar na região crítica
 Os processos usam as primitivas (rotinas) sleepe
wakeup:
 Sleep(dormir)
 Bloqueia o processo e o coloca a espera de um sinal de
wakeup.
 Wakeup(acordar)
 Sinaliza o processo anteriormente bloqueado

 A partir do momento em que um processo entra em


região crítica, qualquer outro processo concorrente
é colocado para dormir e só é acordado quando o
recurso compartilhado está novamente liberado
Soluções para Exclusão Mútua:
Dormir e Acordar
 Problema do Produtor–Consumidor
 Considere a seguinte situação
 Uma área compartilhada (buffer) com um tamanho limitado
 Um processo que alimenta o buffer(produtor)
 Outro processo que usa o conteúdo desse buffer(consumidor)
 Quando o buffer está cheio
 O processo produtor não tem como continuar a alimentar o
buffer
 Para evitar o desperdício de CPU ao manter este processo
funcionando ele é colocado para dormir (sleep)
 Assim que o processo consumidor usa parte do conteúdo do
buffer , emite um wakeup para acordar o produtor
 Quando o buffer está vazio
 O processo consumidor não tem nada a fazer, por isso é
colocado para dormir (sleep)
 Assim que o processo produtor coloca algum conteúdo no buffer,
emite um wakeup para acordar o consumidor
Soluções para Exclusão Mútua:
Dormir e Acordar
 Problema do Produtor–Consumidor (cont.)
 Para saber se o buffer do exemplo anterior está cheio ou vazio, é
preciso testar o conteúdo de uma variável qualquer que indique isso
(um contador)
 Agora imagine a seguinte situação:
 buffer do exemplo está vazio, logo a variável deve ter um valor que
indique isso
 O consumidor testa o valor da variável e nota que o buffer está vazio,
mas antes de ir dormir, seu tempo de CPU acaba
 O produtor entra em execução logo em seguida, alimenta o buffer,
altera o valor da variável e envia o sinal de acordar para o
consumidor
 O consumidor volta a ser executado na CPU e retoma a tarefa em
que parou, ou seja, vai dormir
 O produtor, julgando que seu se sinal de acordar foi recebido (na
verdade, esse sinal se perdeu), continua a povoar o buffer até enchê-
lo, e aí vai dormir
 Resultado: tanto o produtor quanto o consumidor dormirão
eternamente
 O sinal de wakeup do produtor foi perdido (não teve efeito), pois o
consumidor ainda não estava logicamente adormecido.
Soluções para Exclusão Mútua:
Semáforos
 Problema do Produtor–Consumidor (cont.)
 Uma solução possível seria armazenar o sinal de wakeup
para uso posterior
 Melhor ainda: armazenar em um contador qualquer
quantos sinais de acordar que estão pendentes (anda não
foram atendidos)
 Semáforo
 É uma variável usada para controlar se existem sinais de
acordar pendentes
 O valor zero indica que nenhum sinal de acordar está
pendente
 Um valor positivo N indica o número de sinais pendentes
que devem ser processados
 Semáforos que assumem somente os valores 0 (livre) e 1
(ocupado) são denominados semáforos binários ou mutex
Sincronização e Comunicação entre
Processos

 Muitas vezes, em aplicações concorrentes e/ou em


aplicações paralelas, é necessário que processos se
comuniquem.

 Esta comunicação pode ser implementada através de


diversos mecanismos, como variáveis compartilhadas
na memória principal ou troca de mensagens.
Sincronização e Comunicação entre
Processos

 Muitas vezes, em aplicações concorrentes e/ou em


aplicações paralelas, é necessário que processos se
comuniquem.

 Esta comunicação pode ser implementada através de


diversos mecanismos, como variáveis compartilhadas
na memória principal ou troca de mensagens.
Sincronização e Comunicação entre
Processos
Sincronização e Comunicação entre
Processos

 Os mecanismos que garantem a comunicação entre


processos concorrentes e os acessos aos recursos
compartilhados são chamados mecanismos de
sincronização.

 No projeto de sistemas operacionais multiprogramáveis,


é fundamental a implementação destes mecanismos
para garantir a integridade e a confiabilidade na
execução de aplicações concorrentes.
Especificação de Concorrência em
Programas

 Existem várias notações utilizadas para especificar a


concorrência em programas, ou seja, as partes de um
programa que devem ser executadas concorrentemente.

 As técnicas mais recentes tentam expressar a


concorrência no código dos programas de uma forma
mais clara e estruturada. A primeira notação para a
especificação da concorrência em um programa foram
os comandos FORK e JOIN, introduzidos por
Conway(1963) e Dennis e Van Horn(1966).
Especificação de Concorrência em
Programas
Especificação de Concorrência em
Programas

 O programa A começa a ser executado e, ao encontrar


o comando FORK, faz com que seja criado outro
processo para a execução do programa B,
concorrentemente ao programa A.

 O comando JOIN permite que o programa A sincronize-


se com o B, ou seja, quando o programa A encontrar o
comando JOIN, só continuará a ser processado após o
término da execução do programa B.
Especificação de Concorrência em
Programas

 Uma das implementações mais claras e simples de


expressar a concorrência em um programa é a utilização
dos comandos PARBEGIN e PAREND (Dijkstra, 1965a),
que, posteriormente, foram chamados de COBEGIN e
COEND.

 O comando PARBEGIN especifica que a sequencia de


comandos seja executada concorrentemente em uma
ordem imprevisível, através da criação de um processo
para cada comando. O comando PAREND define um
ponto de sincronização, onde o processamento só
continuará sua execução quando todos os processos ou
threads criados já tiverem terminado sua execução.
Especificação de Concorrência em
Programas
Problemas de Compartilhamento de
Recursos

 O primeiro problema é analisado a partir de um


programa, por exemplo, Conta_Corrente, que atualiza o
saldo bancário de um cliente após um lançamento de
débito ou crédito no arquivo de contas correntes
Arq_contas. Neste arquivo são armazenados os saldos
de todos os correntistas do banco.

 O programa lê o registro do cliente no arquivo, lê o valor


a ser depositado ou retirado e, em seguida, atualiza o
saldo no arquivo de contas.
Especificação de Concorrência em
Programas

 Uma das implementações mais claras e simples de


expressar a concorrência em um programa é a utilização
dos comandos PARBEGIN e PAREND (Dijkstra, 1965a),
que, posteriormente, foram chamados de COBEGIN e
COEND.

 O comando PARBEGIN especifica que a sequencia de


comandos seja executada concorrentemente em uma
ordem imprevisível, através da criação de um processo
para cada comando. O comando PAREND define um
ponto de sincronização, onde o processamento só
continuará sua execução quando todos os processos ou
threads criados já tiverem terminado sua execução.
Especificação de Concorrência em
Programas
Especificação de Concorrência em
Programas

Considerando processos concorrentes pertencentes a dois


funcionários do banco que atualizam o saldo de um
mesmo cliente simultaneamente, teremos a seguinte
situação:

 - o processo do primeiro funcionário lê o registro do cliente e


soma ao campo Saldo o valor do lançamento do débito;

 - antes de gravar o novo saldo do arquivo, o processo do


segundo funcionário lê o registro do mesmo cliente, desta vez de
crédito e somará ao campo Saldo o valor creditado;

 - Independentemente de qual dos processos atualize o saldo


primeiro no arquivo, o dado gravado estará inconsistente.
Especificação de Concorrência em
Programas

Na segunda situação, dois processos concorrentes podem


tentar gravar, ao mesmo tempo, um determinado valor
em uma variável que esta na memória. Temos o
seguinte exemplo:
Especificação de Concorrência em
Programas

O Processo A soma 1 à variável X e o Processo B diminui


1 da mesma variável que está sendo compartilhada.
Supondo que o valor inicial da variável X seja o valor 2.

O correto seria que, ao final da execução dos Processos A


e B, o valor da variável X continuasse sendo 2, porém
isso nem sempre acontece.
Especificação de Concorrência em
Programas

Decompondo os comandos dos Processos A e B para uma


linguagem de baixo nível, como mostrado, temos que o
Processo A carrega o valor da variável X no registrador
Ra, enquanto que o processo B, concorrentemente
carrega o valor da mesma variável X em outro
registrador diferente, Rb. Logo depois, o Processo A
soma o valor 1 ao registro Ra, e o Processo B, subtrai o
valor 1, do registrador Rb.
Especificação de Concorrência em
Programas

Como dito anteriormente, o valor inicial da variável X é 2, e


o processo A, até o presente momento, tem o valor 3,
enquanto que no processo B, o valor é 1. O próximo
comando de ambos os processos é o de armazenar o
valor obtido na operação novamente na variável.

O que irá ocorrer é que o valor da variável X, ao final da


operação, deveria continuar sendo 2, mas na verdade,
esse valor será 3 ou 1, dependendo de qual processo
terminar por último e então, irá sobrescrever o valor da
variável X, incorretamente.
Semáforos

O conceito de semáforo foi proposto por Dijkstra em 1965,


sendo apresentado como um mecanismo de
sincronização que permitia implementar, de forma
simples, a exclusão mútua e sincronização condicional
entre processos. Atualmente, a maioria das linguagens
de programação disponibiliza rotinas para uso de
semáforos.

Um semáforo é uma variável inteira, não negativa, que só


pode ser manipulada por duas instruções: DOWN e UP.
As instruções DOWN e UP são indivisíveis, isto é, a
execução destas instruções não pode ser interrompida.
Escalonamento

 Quando um ou mais processos estão prontos para


serem executados, o sistema operacional deve decidir
qual deles vai ser executado primeiro.

 A parte do sistema operacional responsável por essa


decisão é chamada escalonador, e o algoritmo usado
para tal é chamado de algoritmo de escalonamento.
Critérios de Escalonamento
1. Justiça: fazer com que cada processo ganhe seu
tempo justo de CPU;
2. Eficiência: manter a CPU ocupada 100% do tempo (se
houver demanda);
3. Tempo de Reposta: minimizar o tempo de resposta
para os usuários interativos;
4. Tempo de Turnaround: minimizar o tempo que
usuários batch devem esperar pelo resultado;
5. Throughput: maximizar o número de jobs processados
por unidade de tempo.
Critérios de Escalonamento
Probelmas

 Uma complicação que os escalonadores devem levar


em consideração é que cada processo é único e
imprevisível.

Solução:

 Para que um processo não execute tempo demais,


praticamente todos os computadores possuem um
mecanismo de relógio (clock) que causa uma
interrupção periodicamente.
Escalonamento
 O que é “Escalonamento de Processos”?
 É a forma como os processos são distribuídos para execução nos
processadores, ou seja, de que forma os processos são ordenados em
na(s) fila(s) de execução
 Preempção
 É a mudança de processo que está controlando o processador
 Existem duas categorias de escalonamento:
 Escalonamento Não Preemptivo
 Seu funcionamento é mais simples
 O controle do processador permanece com um mesmo processo atéque este
termine
 Isso ocorre independente do uso que o processo faz da CPU
 Ocorre em sistemas que adotam o processamento em Batch (lote)
 Escalonamento Preemptivo
 Seu funcionamento é mais complexo
 O controle da CPU pode ser passado a outro processo em função de alguma
regra de funcionamento estabelecida (exemplo: fatia de tempo)
 Ocorre em sistemas que adotam Time Sharingou Tempo Real
Mudança de contexto
 Quando um escalonamento preemptivo decide mudar o processo que
está controlando a CPU, ocorre o que se chama de “Mudança de
Contexto”
 A mudança de contexto é o procedimento de salvar as informações do
processo atual (para que ele volte a ser executado a partir deste ponto
no futuro) e carregar as informações do novo processo que será
executado
 O que se chama aqui de “contexto”são todas as informações existentes em
cada PCB (Process Control Block)
 Tanto o PCB do antigo processo quanto o PCB do novo processo são
armazenados na tabela de processos, que está carregada na memória
principal
 A eficiência do escalonamento de um sistema operacional depende
muito do tamanho da fatia de tempo dedicada a cada processo
 Fatias de tempo muito pequenas obrigam o sistema operacional a executar
muitas mudanças de contexto
 Fatias de tempo muito grandes podem gerar um tempo de espera elevado
para os processos que estão aguardando
Escalonamento
Quantum
 “Quantum” é o nome que se dá a cada fatia de
tempo dedicada à execução de um determinado
processo
 Não inclui o tempo necessário para a mudança de
contexto
 A mudança de contexto propriamente dita ocorre
em duas etapas:
 TPC (Tempo de Preservação de Contexto): Tempo que
leva para o salvamento do PCB do processo anterior na
tabela de processos
 TRC (Tempo de Recuperação de Contexto ): Tempo que
leva para a recuperação do PCB do processo novo da
tabela de processos
 Podemos representar o uso de cada processador
ao longo do tempo da seguinte maneira:
Escalonamento
Quantum
Escalonamento
Algoritmos de Escalonamento
 Cada sistema operacional conta com um mecanismo especial
(na verdade um processo) que é responsável por ordenar a fila
de execução dos demais processos. Este mecanismo é
chamado de “Escalonador”
 Dependendo do propósito a que se dedica o sistema
operacional, do tipo de atividade do processo, da forma como
cada processo foi criado e de diversos fatores do momento, o
escalonador segue uma determinada estratégia para interferir na
ordem da fila de execução. Cada estratégia é chamada de
“Algoritmo de Escalonamento”
 Existem diversos algoritmos disponíveis. Eis alguns exemplos:
 FIFO
 Round Robin
 SJF
 MFQ
 Prioridade
Escalonamento - FIFO
 FIFO significa “First In First OUT”, ou seja, “o
primeiro a entrar é o primeiro a sair”
 Imita o comportamento de uma fila comum, onde o critério
para ser atendido é a ordem de chegada
 O processo que chega primeiro é atendido antes dos que
chegam depois
 O FIFO é um algoritmo não preemptivo, isto é, cada
processo mantém o controle da CPU até acabar de
executar, independente de qualquer evento
 Este algoritmo não favorece processo de curta duração,
pois se houver um processo longo na frente da fila, todos
os demais terão que aguardar seu término para serem
atendidos
 A fila não se altera em nenhuma circunstância
Escalonamento - FIFO
Escalonamento - Round Robin
 O algoritmo “Round Robin” também é chamado de
algoritmo “circular”, pois cada processo circula na
fila até estar concluído
 Cada novo processo criado é colocado no fim da fila, ou
seja, ele arruma os processos por ordem de chegada
 O Round Robin é um algoritmo preemptivo, isto é, cada
processo tem direito ao uso da CPU por uma determinada
fatia de tempo
 Ao terminar esta fatia de tempo, o processo é novamente
enviado para o fim da fila
 Se o processo mudar seu estado para “bloqueado”, ele sai
da fila até que volte a ficar em estado de “pronto”, e aí é
inserido no fim da fila novamente
 Este algoritmo faz uso de “temporizadores”(mecanismos
de controle de tempo) para administrar o uso da CPU por
cada processo
Escalonamento - Round Robin
Escalonamento - ShortestJobFirst

 SJF significa “ShortestJobFirst”, ou seja, “o menor


trabalho primeiro”
 É uma variação do algoritmo FIFO, onde a fila é
organizada em ordem crescente de tempo de CPU
necessário para executar cada processo, isto é, os
processos menores são colocados na frente da fila
 É um algoritmo não preemptivo
 Para esta estratégia funcionar, é preciso que cada
processo informe ao escalonador qual o tempo necessário
para sua execução. Esta informação é apenas uma
estimativa feita por quem submete o processo(geralmente
o usuário ou quem programou o processo)
 O funcionamento do SJF depende de estimativas que
geralmente não são precisas, e isso é um problema grave
para o bom desempenho do SO
Escalonamento - ShortestJobFirst
Escalonamento - MultilevelFeebackQueue

 MFQ significa “MultilevelFeebackQueue”, ou seja, “Filas em Múltiplos Níveis


Realimentadas”
 É um algoritmo preemptivo
 Existem diversas filas de execução, organizadas em ordem decrescente de
prioridade. A fila de menor prioridade (a última) funciona usando o algoritmo
“Round Robin”e as demais usam o algoritmo “FIFO”(ou melhor, uma versão
preemptiva do algoritmo FIFO, onde os processos executam usando fatias de
tempo)
 A sobrecarga de administração é maior, mas a eficiência compensa
 Funcionamento do algoritmo:
 Cada novo processo é colocado na primeira fila (fila nível 1 -prioridade mais alta)
e aguarda o controle do processador
 Se o processo precisar de I/O, seu estado muda para bloqueado saindo das filas
de execução, mas quando o I/O termina ele retorna para a o fim da mesma fila
em que estava antes
 Caso a fatia de tempo do processo acabe sem que o mesmo tenha finalizado,
ele é deslocado para o fim da fila de nível 2 (ou seja, perde prioridade)
 Isso acontece até que o processo chega na fila de menor prioridade (nesta fila,
não há rebaixamento)
 Cada fila só é atendida se não houver nenhum processo nas filas superiores (de
maior prioridade)
Escalonamento - MultilevelFeebackQueue
 O MFQ é um algoritmo adaptativo, pois
percebe o comportamento do processo e
coloca-o na fila adequada
 Processos curtos levam vantagem, pois
recebem tratamento prioritário e ficam nas
filas superiores
 Processos com I/O intenso se beneficiam,
pois todos permanecem na mesma fila
 Processos longos também saem ganhando
pois as fatias de tempo (quanta) das filas
inferiores são progressivamente maiores
Escalonamento - MultilevelFeebackQueue
Escalonamento - Com Prioridades
 Vários algoritmos assumem que todos os processos são de igual
importância, e por isso têm a mesma prioridade
 Certas aplicações demandam um algoritmo de escalonamento com
prioridades diferentes para cada processo. Por exemplo:
 Controle de processos industriais
 Sistemas multiusuários interativos
 Desta forma e possível tratar adequadamente situações de
emergência ou eventos que não possuem obrigatoriamente uma
mesma ordem para acontecer
 O princípio do escalonamento por prioridades é que cada processo
tem associada uma prioridade e processos com prioridades
superiores devem ser executados primeiro
 Para prevenir que processos de alta prioridade executem
indefinidamente, o escalonador pode diminuir a prioridade dos
processos com o aumento de seu respectivo tempo de execução.
Esta estratégia é chamada de “envelhecimento”
 As regras para estabelecimento de prioridades podem mudar de
acordo com cada SO

Você também pode gostar