Auxiliar 1
Auxiliar 1
Auxiliar 1
Conceito de Processo
Num ambiente monotarefa vimos que a CPU executa um programa seqüencialmente, utilizando os
recursos de hardware e software na ordem em que são solicitados e aguardando o término da
execução de um para começar o outro. Quando estudamos os sistemas batch, vimos que a CPU
executava um job também seqüencialmente, solicitando os recursos na ordem em que eram pedidos.
Já no ambiente multitarefa, entendemos que o que está executando no processador muda
constantemente. Isso ocorre para dar a impressão a cada usuário (no caso multiusuário) ou a cada
tarefa do mesmo usuário (monousuário) que a máquina está a disposição de somente aquele
usuário/tarefa. Nós vimos que esses “pedaços” de programas ou tarefas que ora estavam sendo
executados pela CPU, ora estavam fazendo um acesso de E/S, ora estavam aguardando para
execução na CPU, etc. na verdade ficavam “disputando” os recursos (CPU, E/S, memória) entre si.
Isso nos leva ao conceito de um processo esses “pedaços” de programas ou tarefas que estão
fazendo acesso concorrente aos recursos do sistema.
RESPONDA: 3.1) O que ocorre quando um programa deixa a CPU, de forma que ele possa
retornar no mesmo ponto e nas mesmas condições que saiu ?
O estado atual do programa na CPU tem que ser salvo para que o programa possa retornar e
continuar sua execução como se não tivesse sido interrompido. Isso inclui não só os registradores
(como já estudamos no mecanismo de interrupção) como também outros detalhes como, por
exemplo, quais eram os arquivos que estavam abertos. Podemos dizer que este estado completo do
que estava em execução define um ambiente de execução é o PROCESSO. Ou seja, processo é
o ambiente onde se executa um programa, a estrutura responsável pela manutenção de todas as
informações necessárias a execução de um programa.
Materialização do Processo
RESPONDA: 3.2) Você acha que a freqüente troca de contexto (troca de processos) na CPU
introduz algum overhead ?
O tempo gasto com a troca de contexto vai variar com as especificações do hardware. Basicamente:
tamanho da memória, número de registradores que devem ser copiados, existência ou não de
instruções especiais (exemplo: uma instrução simples para carregar ou salvar registradores; os
processadores RISC possuem essas instruções load e store), tamanho do disco (para swapping),
velocidade da CPU.
A troca de contexto pode produzir um gargalo (bottleneck) fazendo decair em muito a performance.
Atualmente há uma solução para esse problema: a utilização de threads. O uso de threads passa pela
programação, o que não é simples, e pelo suporte por parte do próprio sistema operacional, que deve
suportar sua criação e controle. A idéia principal é diminuir o tempo gasto na criação/eliminação de
um PCB para cada subprocesso criado. Sendo assim, subprocessos se diferenciam de threads pelo
espaço de endereçamento independente que possuem. Threads compartilham o mesmo espaço de
endereçamento de um processo, passando pelos mesmos estados de um processo.
Contexto de Hardware
É o contexto que é copiado para o hardware (CPU) para que a execução possa ocorrer. Basicamente
os registradores : PC (program counter, que contém o endereço da próxima instrução a ser
executada) , SP (stack pointer, o ponteiro de pilha, que é o registrador que contém o endereço de
memória do topo da pilha), a pilha toda (para que a CPU, ao completar uma função ou subrotina,
saiba para que endereço irá retornar), registrador de estado (PSW).
Contexto de Software
São as características que vão influir na execução. O contexto de software define basicamente 3
grupos de informações : identificação, cotas e privilégios.
Identificação – Cada processo ao ser criado recebe uma identificação, que é um número e,
normalmente, também um nome. Chamamos esse número de PID (Process IDentification =
identificação do processo). O processo pode receber também, de acordo com o S.O., um
número relacionado à identificação do usuário que o criou UID (User IDentification =
identificação do usuário) e uma identificação do grupo de usuários aos quais é permitido o
acesso a arquivos, processos, etc.: GID (Group identification = identificação do grupo).
Esses dois últimos estão ligados ao modelo de segurança implementado por alguns S.O. para
permitir acessos ou não. Por exemplo, um usuário não pode normalmente deletar os processos
de outros. O super-usuário pode deletar todos os processos do sistema.
Um processo pode criar um ou mais processos (estes são chamados de processos-filho = child
process). O processo filho tem um PPID (Parent Process IDentification = identificação do
processo-pai), para que o filho possa retornar ao pai. O PPID de um processo-filho é o UID
do processo-pai.
UNESA - Sistemas OperacionaisI 3
Cotas – Limites de cada recurso que pode ser utilizado pelo processo. Esses limites são
determinados para o processo no momento de sua criação. Alguns sistemas incluem também,
dinamicamente, porcentagem do recurso já utilizado ou que ainda pode ser utilizado.
Basicamente são: número máximo de arquivos abertos simultaneamente, tamanho máximo de
memória que o processo pode alocar, número máximo de operações de E/S pendentes, tamanho
máximo de buffers para o acesso de E/S, número máximo de subprocessos que podem ser
criados.
Privilégios – Definem o que um processo pode ou não fazer em relação ao sistema e aos
outros processos. Já vimos ( acima ) os privilégios associados à segurança. Existem outros
privilégios associados à operação e à gerência do sistema.
Espaço de Endereçamento
É a área da memória onde reside o processo. Quando um programa é colocado na memória principal,
para que a sua execução seja possível, temos que as instruções estão arrumadas em ordem de
execução em endereços adjacentes. Logo após ao bloco de instruções temos a seção de dados que
serão utilizados pelo programa. Da mesma forma um processo reside na memória principal com o
seu código, em endereços adjacentes, seguido de um bloco de dados.
Estados do processo
A política implementada, normalmente, é a de várias listas de acordo com o que o processo precisa
fazer. Os nomes aqui citados e a quantidade de estados que um processo pode ter vão diferir de um
SO para outro. Ao ser criado o processo vai para a lista de PRONTO (READY), que indica pronto
para começar a execução. Assim que houver oportunidade o SO vai selecioná-lo (escalonamento)
para ocupar a CPU. Normalmente usa-se a política de listas encadeadas, ou seja, ao colocar na lista o
SO já leva em conta as prioridades. Em cada lista o ponteiro de um processo aponta (indica) o
próximo processo da lista.
Quando estiver executando, esse processo pode: terminar, fazer uma requisição de I/O, ser
interrompido, ter sua fatia de tempo terminada, criar um novo processo. Enquanto está executando,
ou seja, ocupando a UCP, o processo está no estado EXECUÇÃO (RUNNING).
RESPONDA: 3.6) Numa máquina com um processador, quantos processos podem estar no estado
EXECUÇÃO simultaneamente? E num ambiente com múltiplos processadores?
Quando faz uma requisição de I/O o processo pode ter que esperar pela liberação de algum
dispositivo de I/O. Cada dispositivo tem a sua lista. Nesse caso o processo fica no estado de
ESPERA (WAIT). Se o recurso do sistema desejado não está disponível ainda, podemos ter uma
diferenciação do estado de ESPERA, chamado de estado BLOQUEADO. Um processo pode estar
no estado de ESPERA quando ele cria um processo-filho e tem que esperar pelo término do
processo-filho para continuar a sua execução. Pode também ocorrer que um processo não precise
esperar pelo término do processo-filho para voltar à sua execução, nesse caso os processos pai e filho
executam concorrentemente.
UNESA - Sistemas OperacionaisI 4
O término de um processo envolve uma chamada de sistema, que faz com que o SO retire o
processo da lista e desaloque o seu PCB. Se há processos-filho ainda não terminados, o SO “aborta”
esses processos-filho.
RESPONDA: 3.7) Quantos processos podem estar no estado PRONTO ? E no estado ESPERA ?
3.8) Em que estado deve estar um processo para “entrar” na CPU ? Por que motivo?
Mudanças de estado
Pelo que vimos acima, diversos eventos causam uma mudança de estado em um processo.
Chamamos de eventos voluntários aqueles gerados pelo próprio processo e de eventos
involuntários aqueles gerados pelo sistema operacional.
Existem basicamente quatro mudanças de estado do processo, conforme será visto abaixo.
Tipos de processo
Os processos podem ser classificados de acordo com o tipo de processamento que realizam, a saber:
CPU-bound (ligado à CPU) – passa a maior parte do tempo no estado de execução, ou seja,
utilizando o processador. Esse tipo de processo realiza poucas operações de E/S.
I/O-bound (ligado à E/S) – passa a maior parte do tempo no estado de espera, pois realiza um
elevado número de operações de E/S.
UNESA - Sistemas OperacionaisI 5
Parte II – Estrutura
Com isso, um sistema operacional fornece um ambiente para execução, melhor dizendo, fornece
serviços para os programas e também para os usuários desses programas.
System Calls
System Calls fornecem a interface entre os processos e o sistema operacional. Estas “chamadas”
estão geralmente disponíveis como instruções da linguagem Assembly, e são normalmente
encontrados nos manuais usados por programadores de linguagens Assembly. Alguns sistemas
permitem que as system calls sejam criadas diretamente a partir de um programa em linguagem de
alto nível (linguagem C, Pascal, FORTRAN).
Elas podem ser agrupadas, na maioria dos sistemas, em cinco categorias principais:
controle de processos (end, abort, load, execute, create, terminate, wait event, signal event,
set attributes);
manipulação de arquivos (create, delete, open, close, read, write, set attributes)
manipulação de dispositivos (request, release, read, write, logically attach or detach);
manutenção de informação (get and set time or date, get and set process or file);
comunicação (create and delete communication connection, send and receive messages)
UNESA - Sistemas OperacionaisI 6
A partir do momento que as “chamadas ao sistema” servem de interface entre os processos e o SO,
essas são o mecanismo de proteção ao núcleo do SO e também de acesso aos seus serviços, como se
fossem as portas de entrada para os processos.
Modos de acesso
Estruturas
Sistemas Monolíticos
Sistemas em Camadas
A modularização de um sistema
operacional pode ser feita de
diferentes formas; a mais utilizada é a
aproximação em camadas, que
consiste em dividir o sistema
operacional em um número de
camadas (níveis), hierarquicamente
dispostas, cada nível construído sobre
o nível imediatamente abaixo. O nível
mais baixo (nível 0) é o hardware e o
mais alto é a interface com o usuário.
Módulos de uma camada oferecem
funções aos módulos de camadas
superiores; cada camada é
implementada usando somente
aquelas operações fornecidas pelas
camadas de mais baixo nível, sendo
que a camada não necessita saber
como estas operações são
implementadas; ela necessita saber o
que estas operações fazem.
Sistemas Cliente-Servidor
Conceito de Escalonamento
EXECUÇÃO
(UCP)
ESCALONADOR
Processo
ESPERA
PRONTO
(E/S)
Processo Processo
Processo
Como já foi mostrado anteriormente, um bom sistema operacional multitarefa deve levar em conta os
critérios abaixo. Lembre-se que alguns podem ser mais “importantes” que outros, dependendo da
atividade que o sistema operacional desempenhará com suas aplicações:
- Utilização da CPU : o processador principal deve estar ocupado a maior parte do tempo
possível, a não ser que não haja o que executar mesmo;
- Tempo de turnaround : tempo decorrido desde a admissão do processo no sistema até o seu
término. Então, inclui tempo na fila de espera + tempo na fila de pronto + tempo de
execução;
ESCALONAMENTO
NÃO-PREEMPTIVO
COOPERATIVO : Processos PRONTOS todos em uma POR PRIORIDADES POR MÚLTIPLAS FILAS
fila. De tempos em tempos o processo que está em execução
verifica uma fila de mensagens e se houver algum processo
solicitando a UCP, então o que está em execução executa
DE SISTEMAS DE TEMPO REAL
um comando tipo WAIT e vai para o final da fila de
PRONTO,
liberando a UCP.
SJF – determinar quanto tempo de UCP cada processo necessita para terminar seu
processamento;
Implementação: UMA fila de PRONTO. Os processos entram na fila na ordem de chegada e sai
primeiro o que chegou primeiro (FIFO). É definida uma fatia de tempo (time-slice).
Quando termina a fatia de tempo, sem que o processo tenha terminado ou feito uma requisição ao
SO, é o SO quem retira o processo de execução. Chamamos este evento (que é involuntário) de
preempção por tempo.
Implementação: UMA fila de PRONTO. Cada processo tem, associada a ele, uma prioridade de
execução. Tal prioridade pode ser dada ao processo pelo usuário ou pelo SO; pode ser estática
(quando é sempre a mesma ao longo da vida do processo) ou pode ser dinâmica (quando o SO a
modifica durante a vida do processo, de acordo com o tipo de processamento e/ou carga do sistema).
Um clock interrompe o processador em determinados intervalos de tempo, para que seja executada a
rotina de escalonamento . Esta rotina arruma os processos na fila de acordo com suas prioridades.
Se na fila de PRONTO estiver um processo com prioridade maior do que a prioridade do processo
que estava em execução, este que estava em execução passa a ficar em estado de PRONTO e o outro
de maior prioridade é escalonado para execução. Chama-se preempção por prioridade o evento em
que o SO retira um processo que estava em execução para dar lugar a outro processo de maior
prioridade. Note que este evento é involuntário, ou seja, não depende do processo que está sendo
“preemptado”.
Implementação: VÁRIAS FILAS DE PRONTO, sendo que a cada uma está associada uma
prioridade. Cada processo é associado a UMA e SOMENTE UMA fila e nela PERMANECE durante
toda a sua vida no sistema.
O sistema SÓ PODE ESCALONAR PROCESSOS DE UMA DAS FILAS QUANDO TODAS AS
OUTRAS DE MAIOR PRIORIDADE ESTIVEREM VAZIAS.
Exemplo
Seja um sistema com três filas:
Maior prioridade
Fila de processos do sistema
(Escalonamento em prioridades)
Implementação: VÁRIAS FILAS DE PRONTO, sendo que a cada uma está associada uma
prioridade. O sistema SÓ PODE ESCALONAR PROCESSOS DE UMA DAS FILAS QUANDO
TODAS AS OUTRAS DE MAIOR PRIORIDADE ESTIVEREM VAZIAS.
O SO PODE MUDAR um processo DE FILA de acordo com as características do processo e/ou
carga do sistema. Chama-se este esquema de mecanismo adaptativo.
Quando o processo é criado, entra no final da fila de MAIOR prioridade. Quando um processo em
execução deixa a CPU seja por preempção por prioridade ou por uma requisição ao SO, ele é
reescalonado dentro da MESMA fila. Quando deixa a CPU por preempção por tempo, o processo é
redirecionado para uma fila de MENOR prioridade. Quanto maior for a prioridade de uma fila
menor será a fatia de tempo associada a esta fila.
Exercícios
4.1 Qual a parte do sistema operacional responsável pela escolha de processos no estado de pronto
que passarão para o estado de execução?
4.2 O que é escalonamento?
4.3 Justifique: um algoritmo de escalonamento busca otimizar a utilização da UCP e o throughput,
enquanto tenta diminuir os tempo de turnaround e de resposta?
4.4 O que é starvation? O escalonamento de processos pode levar um processo a sofrer starvation?
Explique?
4.5 Cite fatores que possam influenciar no tempo total de execução de processos.
4.6 O que é preempção? Diferencie escalonamento preemptivo de não-preemptivo.
4.7 Como funciona o escalonamento FIFO? (Lembre-se de uma fila de banco)
4.8 Sejam os processos abaixo:
Suponhamos que sejam necessárias 8 u.t. (oito unidades de tempo) para que se realize qualquer uma
das requisições de I/O e que nenhum processo fique em momento algum bloqueado. Vamos
desconsiderar o overhead de criação/deleção de processos e de troca de contexto. O tempo gasto no
escalonamento de processos por parte do S.O. é de 1 u.t. (uma unidade de tempo). Considere que os
processos A, B e C entraram no sistema nessa ordem (A, B e depois C), mas a diferença entre tais
instantes é tal que pode ser desconsiderada. Considere também que os processos foram criados no
instante inicial de funcionamento do sistema (0 u.t.). Faça o papel do sistema operacional e complete
os quadros abaixo:
Classifique cada sentença como Verdadeira (V) ou Falsa (F), justificando-as quando falsas:
Problemas de comunicação
A comunicação entre processos concorrentes deve ser tratada pelos sistemas operacionais. Os
mecanismos que garantem a comunicação entre processos concorrentes e o acesso a recursos
compartilhados são chamados mecanismos de sincronização;
Vejamos um exemplo onde pode ocorrer acesso concorrente a um arquivo em disco (memória
secundária):
A solução mais simples para evitar problemas de compartilhamento de recursos é impedir que dois
ou mais processos acessem este recurso no mesmo instante. Essa exclusividade de acesso é chamada
exclusão mútua, ou seja, enquanto um processo acessa determinado recurso, todos os outros que
queiram acessá-lo deverão esperar até o término deste acesso.
A exclusão mútua deve afetar os processos concorrentes apenas quando um deles estiver realizando
acesso ao recurso compartilhado.
A) SEMÁFOROS
Um semáforo é uma variável inteira, não negativa, que só pode ser manipulada por duas instruções:
DOWN e UP. No caso da exclusão mútua, essas instruções funcionam para que um processo possa
entrar e sair de sua região crítica, respectivamente.
O semáforo fica associado a um recurso compartilhado, indicando quando este recurso está sendo
acessado por um dos processos concorrentes.
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 a execução concorrente
dos processos.
B) MONITORES
Alocação de memória
B) Alocação particionada estática – para que a multiprogramação fosse eficiente, era necessário
que vários programas estivessem na memória principal ao mesmo tempo. Por esse motivo, a
memória foi dividida em pedaços de tamanho fixo, chamados partições. O tamanho das partições
era estabelecido na fase de inicialização do sistema, em função do tamanho dos programas que
iriam executar no sistema. Sempre que fosse necessária a alteração do tamanho de uma partição,
o sistema deveria ser desativado e reinicializado com a nova configuração.
Quando os compiladores e linkeditores geravam CÓDIGO ABSOLUTO, o código gerado
possuía endereços físicos de memória (observação: vamos trabalhar com endereços expressos em
decimal). O formato geral das instruções de máquina é:
endereço instrução
Para facilitar, vamos supor que cada instrução de alto nível gera 1 (uma) instrução de máquina.
Com código absoluto as instruções de máquina de um trecho do programa ficariam:
Este programa SÓ PODE SER carregado na memória nos endereços físicos 502 a 507.
0 Ler B, C e H
1 A=B+C
2 D=H–A
3 Se D < 0 então vá para 0
4 J=V*H
5 Escreve J
0 0+721=721 Ler B, C e H
1 1+721=722 A=B+C
2 2+721=723 D=H–A
3 3+721=724 Se D < 0 então vá para 0+721=721
4 4+721=725 J=V*H
5 5+721=726 Escreve J
Como os programas normalmente não preenchiam totalmente as partições onde eram carregados,
eles deixavam pedaços de memória que ficariam impedidos de ser utilizados por outros
programas (fragmentação). E mesmo que existissem duas ou mais partições adjacentes que,
somadas, totalizassem o tamanho do programa, ele ficaria aguardando uma única que o
acomodasse;
C) Alocação particionada dinâmica – Como foi visto no item anterior, havia a necessidade de
diminuir o problema da fragmentação, aumentado o compartilhamento da memória principal. Na
alocação particionada dinâmica foi eliminado o conceito de partições de tamanho fixo, de forma
que cada programa utilizasse o espaço de que necessitasse, passando esse pedaço a ser uma
partição. A fragmentação no entanto, começaria a ocorrer quando os programas fossem
terminando e deixando espaços cada vez menores na memória, não permitindo ingresso de novos
programas.
Existiam duas possíveis soluções para este problema: na primeira, apenas os espaços adjacentes
são reunidos, produzindo um único espaço de tamanho maior; a segunda maneira envolve a
relocação de todas as partições ocupadas, eliminando todos os espaços entre elas e criando uma
única área livre contígua (alocação dinâmica com relocação). Porém a complexidade do seu
UNESA - Sistemas OperacionaisI 19
algoritmo e o consumo de recursos do sistema, como processador e área em disco, podem tornar
essu esquema inviável;
Estratégias para escolha de partição
Na tentativa de evitar, ou mesmo reduzir, a fragmentação antes que ela ocorra, algumas estratégias
são implementadas pelos sistemas para determinar em qual partição livre um programa será
carregado para execução:
BEST-FIT – escolhe a partição em que o programa deixa o menor espaço sem utilização; a
lista de áreas livres está ordenada por tamanho; desvantagem: com a alocação de partições
que deixem as menores áreas livres, a tendência é que cada vez mais a memória fique com
pequenas áreas não contíguas, aumentando o problema da fragmentação;
FIRST-FIT – esse mecanismo escolhe a primeira partição livre, que tenha tamanho suficiente
para carregar o programa; a lista de áreas livres está ordenada por endereços crescentemente;
é mais rápida, consumindo menos recursos do sistema.
Swapping
É uma técnica utilizada para tentar solucionar o problema de falta de memória. Seja uma memória
com área livre para programas de usuário de 500Kb. Imagine que há 4 programas A, B, C e D, cada
um com 200Kb, que poderiam estar todos ativos se coubessem na memória. Então aloca-se os
programas A e B somente. Se o programa A tiver que aguardar por algum evento, podemos retirá-lo
da memória e levá-lo para o disco, enquanto aguarda pelo evento. Enquanto isso o programa C, por
exemplo, pode ir para a memória para que sua execução seja iniciada.
Memória Virtual
A utilização da memória virtual é uma outra técnica para tentar solucionar o problema de falta de
memória. Esta técnica consiste em: - utilizar os endereços virtuais
- o disco com continuação da memória principal
sem que o usuário perceba.
Se um programa de 200Kb só pode utilizar 100Kb da memória, porque não há mais área livre, os
outros 100Kb ficarão em disco. Somente quando os endereços virtuais que estão no disco forem
referenciados é que a 2a parte do programa vai para a memória.
Mapeamento
Paginação
Página 4 do
processo A
Página 10 do
Processo B
Página 1 do
processo A
Com isso não haverá espaços livres entre os espaços ocupados, isto é, fragmentação. As páginas são
levadas para a memória principal de acordo com a sua necessidade. Ao ser referenciado um endereço
qualquer de uma página, toda a página é colocada na memória.
Nesse esquema o endereço virtual é:
O bit de validade informa se a página está na memória (igual a 1) ou não (igual a 0).
Por exemplo: o endereço virtual 001 3 do processo A está no endereço real 7024+3=7027. Se um
endereço referenciado não está na memória principal a página é alocada e a tabela de páginas é
atualizada. Esse mecanismo de só levar para a memória principal as páginas que são necessárias
chama-se PAGINAÇÃO POR DEMANDA. E chama-se FALHA DE PÁGINA (page fault) o evento
de o processo precisar de 1 página que não está na memória.
WORKING SET de um processo é o conjunto de páginas referenciadas por ele durante um intervalo
de tempo. Uma segunda definição: o conjunto das páginas constantemente referenciadas pelo
processo, devendo permanecer na memória principal. Caso contrário, o processo poderá sofrer com a
UNESA - Sistemas OperacionaisI 21
elevada taxa de paginação (TRASHING) comprometendo seu desempenho. O working set do
processo deve ter um limite máximo de páginas permitidas; quanto maior a working set , menor a
chance de ocorrer FALHA DE PÁGINA.
A paginação envolve uma operação de E/S, então é aconselhável que haja uma política que diminua
a taxa de paginação. A escolha da página “certa” a ser retirada da memória principal para que outra
seja carregada em seu lugar é importante. A página que está sendo retirada não deverá ser usada
posteriormente, o que ocasionaria nova troca. As estratégias para retirar páginas de um processo da
memória (realocação de páginas) são:
Aleatória: retira uma página aleatoriamente; algoritmo fácil pouco overhead pouca
eficiência;
FIFO (First In First Out): a 1a página referenciada é a 1a página a sair; algoritmo simples
utilizando fila pouca eficiência;
LRU (Least Recently Used): retira a página menos recentemente utilizada, ou seja, a que está
há mais tempo sem ser referenciada;
NRU (Not Recently Used): parecida com a anterior, um flag de referência indica se a página
foi ou não utilizada. Inicialmente todas as páginas tem 0 (zero). Quando a página é utilizada,
seu flag=1. De tempos em tempos, todos os flags são zerados. Overhead menor que a
anterior, boa eficiência;
LFU (Least Frequently Used): retira a menos freqüentemente utilizada. Utiliza um contador
que recebe um acréscimo cada vez que a página for referenciada. Grande eficiência; overhead
razoável.
Para qualquer estratégia: ANTES DE RETIRAR UMA PÁGINA DA MEMÓRIA é preciso verificar
o seu bit de modificação. Se a página foi modificada tem que ser atualizada no disco.
O tamanho da página é determinado pelo SO de acordo com o hardware (geralmente entre 512bytes
e 64Kb). Se a página for . . . então . . .
MUITO PEQUENA: tabelas de mapeamento muito grandes grande overhead para percorrer
tabela muita paginação menor fragmentação;
MUITO GRANDE: memória ocupada sem utilização custo maior a cada swap in, swap out
maior fragmentação;
Segmentação
Com o uso da paginação tentou-se deixar na memória apenas as páginas mais utilizadas de cada
processo, ao invés de deixar residente o processo inteiro. Mas o sucesso dessa técnica vai depender
da estrutura do programa. Uma outra idéia é dividir o programa pela sua estrutura e não em tamanhos
fixos. Os blocos tem então tamanhos diferentes e são chamados segmentos. O endereço virtual é
composto pelo número do segmento e o deslocamento dentro do segmento. O endereço físico é
calculado a partir do endereço físico do segmento + o deslocamento dentro do segmento. E somente
os segmentos referenciados são alocados na memória principal.
A eficiência desta técnica vai depender da modularização da aplicação: módulos grandes (cada
módulo será um segmento) nos quais somente uma parte do código é referenciada vai retornar ao
problema de ocupação desnecessária na memória.
UNESA - Sistemas OperacionaisI 22
Exercícios
1. Qual a diferença da alocação particionada estática e dinâmica?
2. Como funciona a alocação dinâmica com relocação e quais suas desvantagens?
3. O que é e qual a importância da análise do working set dos programas?
4. Qual a relação entre working set e trashing?
5. O que é falha de página e quais as formas de se evitá-la?
6. Diferencie paginação de segmentação com relação aos seguintes aspectos:
a) lógica dos programas X divisão dos espaços de endereçamento
b) fragmentação (quando e como ocorre)
7. Working Set de um processo A tem seu tamanho limitado a quatro frames e encontra-se ocupado
conforme quadro abaixo:
8. O working set de um processo possui quatro frames. O momento da carga (em segundos), o
momento do último acesso (em segundos), o contador de referências e o bit de modificação
(M) para cada uma das páginas na memória são mostrados abaixo: