Buscar

SOII_Aula002_13112012

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 15 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 15 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 15 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Continue navegando


Prévia do material em texto

SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio – 2012/2 Página 1 
 
Como conseguir executar um processo em um endereço qualquer de memória? 
 
1) Correção de endereços em tempo de carga 
2) Registrador de base 
3) Uso de endereçamento relativo a instancia atual 
4) Segmentação 
5) Paginação 
 
O USO DE ENDEREÇO RELATIVO 
 
A função usa o endereço a partir do endereço de memória e usa-se o endereço a partir da função 
em execução. Então os dois endereços neste caso é positivo a alguma coisa ou negativo a alguma 
coisa. Esta alguma coisa é a função que está em execução no momento. 
 
A INTEL tem Registrador de base e Endereçamento relativo a instancia atual. Ela tem estes tipos 
de endereçamento somente para alguns tipos de instruções. 
 
Antes de entrar no tema da aula de hoje, precisamos saber O que a memória contém? O que é 
armazenado na memória? 
 
A memória possui dois tipos de coisas: Código executável que está na memória e Variáveis 
Globais, Locais e Dinâmicas. 
 
A CPU só executa coisas que estão na memória. 
 
Cada processo tem códigos executáveis e variáveis. Esta é a divisão básica. 
 
ÁREAS DE MEMÓRIA DE UM PROCESSO 
 
As variáveis mudam de valor. Não existem processos que não usem variáveis. Embora o código 
executável não tenha muita diferença entre eles. 
 
As variáveis possuem uma divisão importante dentro delas. Existem diversas formas de se usar 
uma variável em um programa de linguagem de auto nível como Delfi ou C. As formas de se 
usar a variável determina como elas serão armazenadas dentro da área de código do processo. 
 
Existem três formas de se armazenar a variável dentro da área de código do processo: Global, 
Local e Dinâmica. 
 
As variáveis Globais existem o tempo todo no processo que está em execução e geralmente 
qualquer parte do processo consegue usar, alterar e consultar esta variável. 
 
As variáveis Locais só podem ser usadas dentro de uma sub-rotina. Elas são declaradas em uma 
sub-rotina, por exemplo, uma função. 
 
As variáveis Dinâmicas são criadas pela “vontade” do programador. Ele escreve um comando na 
linguagem para criar a variável. Só depois que este comando é executado que se pode utilizar a 
variável criada. 
 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio – 2012/2 Página 2 
 
Durante a compilação do programa o compilador verifica quantas variáveis Globais existem e 
qual o tamanho de cada uma delas. E coloca no cabeçalho do arquivo executável para informar 
ao processo durante sua execução a quantidade de KB necessários para as variáveis Globais. 
 
As variáveis Locais possuem algumas particularidade e se assemelha muito ao parâmetro de uma 
função. Por exemplo, a função FAT (N: Integer) dos exemplos 2 e 3 abaixo, calcula o fatorial de 
um número. O parâmetro também se assemelha muito a variável local porque só é usado em um 
determinado local. 
 
Exemplo 1 
 
Procedure P; 
Var I = Integer 
Begin 
For I=1 to 10 Do 
 Begin 
 … 
 End; 
End; 
 
 
Exemplo 2 - Delfi 
 
Function 
FAT(N:Integer); 
Var A, I:Integer 
Begin 
A:=1; 
For I:=1 to N Do 
A:=A*I; 
End; 
FAT:=A //Return A 
End; 
Exemplo 3 - Pascal 
 
Function 
FAT(N:Integer); 
Begin 
If N>1 Then 
 Return FAT(N-1)*N 
Else 
 Return 1 
End; 
 
Análise da variável N na memória 
 
A variável N é um parametro, ou seja, uma variável local. Ela tem particularidades. Que 
particularidades são estas? A memória contém ao mesmo tempo vários N diferentes. 
 
Então vamos vê isto, digamos que chamamos a subrotina, ou seja, a função: J:=FAT(3); 
O que vai acontecer? Em alguma parte da memória temos a variável N que é um 
parametro com o valor inicial 3. 
 
Entra na subrotina FAT(N:Integer) e verifica que 3 > 1. O then da função chama 
recursivamente a função FAT, mas agora o parametro mudou para N=2. Não podemos 
simplismente trocar o N que está com o valor 3 pelo valor 2. 
 
Por que não podemos fazer isto? Porque depois que calcula o fatorial de 2 falta 
multiplicar por N cujo o valor original era 3. O valor original de N não pode mudar o 
valor do parametro N. 
 
O que acontece? Na memória é criado outro N com o valor 2. Como a função sabe qual 
N utilizar? Ela sabe porque tem indicação externa que diz qua é o N válido naquele 
momento. Neste caso, o N=2. Executa-se mais uma vez a função FAT, mas agora o 
valor de N=1. 
 
Memória 
N = 3 
 
N = 2 
 
N = 1 
 
 
FAT(3) = FAT(2)*3 = 6 
FAT(2) = FAT(1)*2 = 2 
FAT(1) = 1 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio – 2012/2 Página 3 
 
Obs.: Quando for fazer o cálculo do fatorial de 3 ao criar o N a seta vai descendo ao 
utilizar o N no cálculo a seta vai subindo. 
 
Este é o jeito de persistir na memória vários valores do N, pois só assim é possível fazer 
o cálculo. 
 
A variável local é diferente da variável Global. A variável Global só tem uma para o 
programa inteiro. A local não para a mesma sub-rotina tem várias variáveis na memória 
com valores diferentes. 
 
No entanto, em um determinado momento de tempo somente uma variável estará sendo 
utilizada. E diferente é a forma de se guardar as variáveis Globais e Locais. 
 
Variáveis Locais tem mais de uma a medida que necessite, por exemplo, se o N for 
igual a 100. Quantas variáveis Locais teríamos na memória? 100. Então não se sabe a 
priori quantas variáveis locais serão necessárias. Este número é descoberto na execução. 
 
A variável Global é criada no início do programa e a variável Local é criada durante a 
execução do programa. Enquanto que a variável Local é criada dinamicamente depois 
que a rotina acaba as variáveis são destruídas dinamicamente deixando de ocupar 
espaço na memória. 
 
Antes de se chamar a sub-rotina função FAT, não existe N na memória ao chamar a 
FAT passa a alocar o 1º N na memória o 2º N e o 3º N. Ao retornar o valor do 3º N ele é 
apagado. Assim sucessivamente até o 1º N. 
 
Destruição da variável 
 
A primeira variável local a ser destruída e a última que foi criada e a última a ser 
destruída é a primeira que foi criada. 
 
A variável local é criada e destruída no momento da execução. A variável local ativa é 
sempre a última da execução no momento. 
 
Memória 
N = 3 
 
N = 2 
 
N = 1 
 
O N=1 está ativo ao executar a função FAT do código a seguir: 
 
Function FAT (N:Integer); 
Begin 
If N>1 
 Then 
 Return FAT(N-1)*N 
 Else Begin 
 N:=33; 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio – 2012/2 Página 4 
 
 Return 1; 
 End; 
End; 
 
Ao entrar no Else a primeira coisa que é feita é atribuir 33 ao N. O N ativo que era igual a 1 mudou 
para 33. Mudou o valor do N=2? Não, pois ele não estava ativo no momento da execução. Vai mudar? 
Não, pois quando o N for igual a 2 não se tem a atribuição de N:= 33. 
 
A variavel local alterada é sempre a que está ativa no momento. 
 
A pilha é a estrutura de dados perfeita para lógica de criação e destruição de variáveis locais. A última 
coisa a empilhar é a primeira a desempilhar. A primeira coisa a empilhar é a última a desempilhar. 
 
A área de dados das variáveis locais é uma pilha. Existe uma parte da memória que é a parte da pilha e 
dentro da pilha tem uma área da pilha. Tem um pedaço com as variáveis já criadas, abaixo é área livre 
e no meio tem o topo da pilha conforme mostra a Figura 1. 
 
Quando uma subrotina começa a executar é criada uma variável nova. Então o topo da pilha é 
decrementado de forma a colocar na pilha um novo conjunto de variáveis locais e parâmetros. Por 
exemplo, as variáveis locais N=3, N=2 e N=1. Conforme mostra a Figura 2. 
 
Quando a subrotina acabar de executar o que vai acontecer? Desalocação das variáveis locais da 
subrotina Função FAT, ou seja, o topo é incrementado evolta a ser como era antes da execução dessa 
subrotina. Onde estavam as variáveis locais N volta a ser área livre da memória da pilha. Conforme 
mostra a Figura 3. 
 
Assim é alocar e desalocar na pilha. Você aloca decrementando o topo e desaloca incrementando o 
topo. 
 
A ideia de pilha para o processo poder executar é uma coisa tão importante e fundamental para as 
variáveis locais que as CPUs tem instruções especificas para trabalhar com as pilhas isto por causa das 
variáveis locais. 
 
Então a Intel tem instruções para o uso da pilha. Push EAX empilha o valor do registrador EAX 
decrementando o topo da pilha. Pop EBX pega o valor do topo da pilha, coloca no registrador EBX e 
incrementa o topo da pilha. 
 
Existem mais instruções para lidar com a pilha. Estas são as mais básicas de todas. 
 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio – 2012/2 Página 5 
 
EAX e EBX são registradores. Isto acontece na passagem de parâmetros. 
 
 
Linguagem de máquina 
 
Mov EAX, 3 
Push EAX Exemplo 1 
Call 500 
 
Mov EAX, [1000] (Endereço da variavel X) 
Push EAX Exemplo 2 
Call 500 Endereço da Função FAT 
 
No caso da função FAT o EAX será o N. Então a variavel local fica em uma área de memória que é 
chamada de área de pilha que é diferente da área das variáveis Globais que é uma área separada. 
 
Uma parte do processo é o código executável, as variáveis Globais, as variáveis Locais e as variáveis 
dinâmicas. 
 
Variaveis Dinamicas 
 
A variavel dinâmica normalmente é usada em linguagens de programação mais sofisticadas. Em 
linguagem orientada a objetos tipicamente um objeto é uma variavel dinâmica. Exemplo, uma lista 
encadeada de empregados. A seguir o código 1: 
 
Type 
Emp = Relor 
 Matricula: Integer; 
 Nome: String; 
 Prox: ^Emp; //Ponteiro para o próximo registro de Empregado 
 Emp 
 
Procedure 
Var 
P:^Emp; // Criação de um ponteiro para P 
Begin 
New(P); //Cria a variavel dinamica do tipo Emp e a variavel local P passa a apontar para 
 esta variavel dinamica criada. 
 
P^.Matricula = 123; 
P^.Nome = ‘João’ 
 
As vezes se confundi variavel dinâmica com variavel ponteiro. P é variavel ponteiro ele aponta. P 
dinâmico ele é local fica na pilha. O comando new cria a variavel dinâmica que não está na pilha e faz 
a variavel local que é o P apontar para a dinâmica. O que é apontar? É guardar o endereço de memória 
da variável. 
 
Temos a memória e dentro da memória temos o processo. Dentro do processo temos a área de pilha e 
tem outro pedaço que é área da variável dinâmica que se chama Heap. 
 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio – 2012/2 Página 6 
 
 
 
Conforme mostra a Figura 4 o P é uma variável local por ser local ele fica onde? Na Pilha. Em algum 
lugar na Pilha tem o valor de P. Qual é o valor de P? O endereço. Quando executar o comando o que 
acontece? Na Heap onde ficam as variáveis dinâmicas é alocado em um pedaço dela uma variável 
dinâmica do tipo Empregado. 
 
Digamos que na Pilha a variável local P guarde o endereço 2000. O comando New não apenas reserva 
uma área da memória do Heap para variável dinâmica do tipo Emp, mas também atribui o valor desta 
variável ao ponteiro P. O que é atribuir o valor da variável ao ponteiro? O que é apontar para 
empregado? É colocar o endereço para variável empregado. Isto é apontar. 
 
O comando New faz duas coisas: primeiro aloca um pedaço da Heap para a variável dinâmica e em 
seguida coloca na variável ponteiro o endereço onde foi alocada a variável dinâmica. Então é assim 
que é criada a variável dinâmica. 
 
Além da variável ponteiro é a variável local tem outra variável que fica na Heap que é a variável 
dinâmica. 
 
A variável dinâmica não tem nome. O ponteiro é que aponta para esta variável dinâmica que tem 
nome. Para se usar um campo do Empregado tem fazer isto com o a variável ponteiro P. 
 
Em P.Matricula e P.Nome estou atribuindo valores a variável dinâmica. Como ela não tem nome 
temos que usar o ponteiro para os campos da variável dinâmica. 
 
No caso de linguagens orientadas a objetos. O objeto é uma variável dinâmica, mas é mais escondido. 
 
Diferenciação entre o ponteiro e a variável dinâmica em uma linguagem OO tradicional 
 
Type 
L_Emp = Class 
 Public 
 Matricula: Integer; 
 Nome: String; 
Prox: L_Emp 
End; 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio – 2012/2 Página 7 
 
 
Procedure X; 
Var 
E: L_Emp; 
Begin 
E:= New L_Emp; // A variável E é um ponteiro para o endereço da variável L_Emp 
E.Matricula:= 123; 
E2:=E; // Neste caso ambas as variáveis estão apontando para o mesmo endereço 2000 
E2.Matricula:= 567; 
 
Na linguagem OO não temos o ponteiro explícito. A linguagem OO esconde o ponteiro. Embora a 
linguagem OO não tem o ponteiro como uma coisa explícita na linguagem o código na linguagem de 
máquina do código 1 e 2 é o mesmo. Nos dois casos você tem uma variável ponteiro. 
 
Se for criada uma outra variável, por exemplo E2 e atribuir ao E. Se alterar o valor de E2 altera o valor 
da matricula do próprio E, pois o objeto é um só. E e E2 são ponteiros que apontam para o mesmo 
endereço. 
 
Quando se atribui E ao E2. O que está acontecendo? Estou copiando o valor do E que é 2000 para o 
E2. Ambas as variáveis apontam para o mesmo endereço 2000. Embora a linguagem OO não tenha 
ponteiros explícitos eles estão lá. 
 
Type 
 Emp = Relo 
 Matricula: Integer; 
 Nome: String; 
 Prox:^Emp; 
 Emp 
 
Procedure X; 
Var 
P1, P2:^Emp; 
Begin 
New(P); 
P^.Matricula:= 123; 
P^.Nome = ‘João’; 
New(P2); 
P2^.Matricula = 567; 
... 
Dispose(P) //Destruindo a variável dinâmica apontada por P 
 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio – 2012/2 Página 8 
 
 
 
Em linguagem de programação mais antiga você tem o comando de alocação/criação que é o New e 
você tem também o comando de destruição da variável dinâmica. O que é destruir a variável dinâmica 
apontada por P? É tornar a área da Heap livre. O que está acontecendo? A Heap é uma coisa diferente 
da Pilha. A Heap pode ter lugres ocupados e lugares livres. 
 
Então, a área da Heap funciona diferente. Você é obrigado ter áreas diferentes para cada uma das 
variáveis. A Heap não tem ordem correta para alocação da variáveis, pois depende do programador. 
Ele vai determinar quando cria e quando destrói a variável dinâmica. Então pode ficar bagunçado? 
Não. Fica uma coisa misturada. 
 
Para as três formas de se usar a variável temos três áreas de memória do processo. Uma para as 
variáveis Globais, uma para as variáveis locais e outra para as variáveis dinâmicas. Esta é a forma mais 
completa do processo. 
 
Temos três áreas distintas a área de código, área de variáveis globais, área das variáveis locais (Pilha) e 
área das variáveis dinâmicas (Heap). 
 
No caso do Unix eles simplificam um pouco isto. Então no Unix duas variáveis estão condensadas em 
uma só área. Existe uma área de dados que é igual as variáveis globais mais a Heap. 
 
Dá para ajuntar, pois não temos maiores problemas. As globais são bem comportadas. Como fica no 
Unix? Fica conforme mostra a Figura 6, um exemplo de alocação sequencial do processo na memória. 
 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio – 2012/2 Página 9 
 
 
 
Então são três áreas: Código, Dados e Pilha. Os dados condensam as Globais e a Heap. Uma coisa 
importante é que dentro dessas áreas além das variáveis alocadas dinamicamente tem as áreas livres. 
 
Tanto na Heap quanto na Pilha. Você tem dentro delas áreas livres para alocação de variáveis locais 
(no caso a Pilha) e variáveis dinâmicas (no caso a Heap). 
 
Mas, além das áreas livres internas no processo existemas áreas livres externas ao processo. As áreas 
livres externas ao processo servem para alocação de novos processos. 
 
As áreas livres internas ao processo são para as variáveis locais e dinâmicas que o processo vai 
precisar. Assim é a organização dos processos na memória. Este exemplo fala da alocação dos 
processos de forma continua é a forma mais fácil de fazer e mais simples. 
 
As áreas de memória do processo código, Pilha e dados. Elas podem ser alocadas separadamente na 
memoria conforme mostra a Figura 7, pois não precisam estar sequencialmente. Qual a vantagem de 
alocar separadamente? É mais fácil encontrar uma área livre. Se existe uma regra que obrigue as áreas 
do processo serem alocadas juntas isto restringe um pouco a alocação. 
 
Por exemplo, queremos alocar um processo de 300 KB é mais fácil encontrar três pedaços de 100 KB 
de área de memória livre do que um único espaço de 300 KB na memória. Então exigir que as três 
áreas do processo sejam alocadas juntas é uma desvantagem, pois dificulta a alocação de processos. 
 
É uma vantagem alocar separadamente as áreas dos processos. A outra vantagem de alocar dessa 
forma é que se tem mais chance de crescer as áreas do processo quando necessário se tiver área livre. 
 
Se for profissional o módulo de alocação é separado. Para uma questão didática o modelo junto é mais 
utilizado, pois é mais fácil. 
 
Uma questão que deve ser resolvida pelo Sistema Operacional é a questão de alocação dos novos 
processos. Esta questão existe tanto no caso de alocação do processo junto quanto no caso separado. 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio – 2012/2 Página 10 
 
 
 
A alocação não sequencial do processo na memória é melhor do que a alocação sequencial porque é 
mais fácil encontrar áreas livres de memória. 
 
Algoritmo de Alocação 
 
Então o problema é que tenho mais de uma área livre. Em qual área livre irei usar para alocar o 
processo? Tem vários algoritmos de alocação. Veremos alguns tipos de algoritmos de alocação. 
 
A Figura 8 a seguir mostra os processos 1 de 100 KB, o processo 2 de 200 KB, e o processo 3 de 80 
KB, o processo 4 de 100 KB e a área livre de 200 KB. Quando o processo acaba sua execução a área 
de memória que ele ocupava fica livre. 
 
 
 
Digamos que os processos 1 e 3 acabaram sua execução e liberaram a memória. Então temos três áreas 
livres (100 KB, 80 KB e 200 KB). Temos agora um processo 5 com 80 KB. Temos que fazer uma 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio – 2012/2 Página 11 
 
escolha. Onde alocar o processo 5? Temos três áreas livres de memória. Esta escolha é feita pelo 
algoritmo de alocação. 
 
 
Algoritmo de alocação First Fit 
 
Utilizando o algoritmo de alocação First Fit ele vai alocar aonde? No primeiro lugar que encontrar de 
área livre que caiba o processo (ou uma das áreas do processo). Então alocará no 100 KB, ou seja, 
onde estava o processo 1. O processo 5 ocupará 80 KB e sobrará 20 KB de área livre que não será 
utilizada. Isto é um desperdício conforme mostra a Figura 9. 
 
 
 
Alocar uma área e deixar um pedaço livre não é muito interessante, pois muitas vezes o pedaço 
pequeno não é o suficiente para alocar um novo processo. A área que sobra neste caso, 20 KB fica sem 
uso porque nada novo consegue ser alocado nela. 
 
Fragmentação da Memória 
 
Conforme mostra a Figura 10, os espaços de área livre que sobram ao alocar um processo pelo 
algoritmo de alocação são chamados de Fragmentação. 
 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio – 2012/2 Página 12 
 
 
 
O First Fit tem esta característica embora ele seja muito rápido ele pode gerar fragmentos. 
 
Algoritmo Best Fit 
 
Existe outro algoritmo que é mais sofisticado que se chama Best Fit. Ele pesquisa entre as áreas livres 
de memória o espaço mais adequado para alocar o processo. Exemplo, alocar o processo 5 de tamanho 
80 KB. Tem um espaço adequado para alocar 80 KB? Tem. A área de 80 KB ao invés de alocar na 
área de 100 KB. Conforme mostra a Figura 11. 
 
 
 
Agora digamos que o processo 5 tenha 60 KB. Onde alocar este processo? Este processo será alocado 
onde melhor se adeque, ou seja, na área livre de 80 KB. Conforme mostra a Figura 12. Neste caso, 
sobra 20 KB que é um desperdício (fragmento). 
 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio – 2012/2 Página 13 
 
 
 
First Fit pesquisa a partir do “zero” da memória e o Next Fit é a partir da última alocação na memória. 
 
Algoritmo Worst Fit 
 
A ideia do Worst Fit é a seguinte aloca-se a área de tamanho exato se existir. Se não existir uma área 
de tamanho exato então ele aloca a maior área encontrada. 
 
Conforme mostra a Figura 13, queremos alocar um processo de 60 KB. Como não existe uma área de 
memória com este tamanho exato. O Worst Fit aloca a maior área livre de memória encontrada que é 
de 200 KB sobrando 140 KB de área livre. 
 
 
O Worst Fit não gera fragmento porque quando ele não encontra uma área de memória de um tamanho 
exato ele aloca a maior área e o que sobra é um tamanho grande. Embora ele seja bom ele não é tão 
bom assim. Por quê? Digamos que se tenha um processo 7 de 150 KB. 
 
Ele poderia ser alocado na área livre de 200 KB e sobraria 50 KB, mas como o Worst Fit já matou a 
área livre de 200 KB (a área maior) o processo 7 não poderá ser alocado neste espaço. E o Worst Fit é 
pior para este caso. 
 
Então não dá para dizer de forma eficiente qual destes algoritmos é o melhor. O que dá para dizer é 
que o First Fit é o mais rápido para executar e implementar do que os outros algoritmos Best e Worst. 
 
No caso de alocar o processo por áreas separadas temos o mesmo problema e utiliza-se os mesmos 
algoritmos de alocação. E este mesmo problema existe dentro da área de Heap, pois tem espaço livre e 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio – 2012/2 Página 14 
 
alocado. Na Heap é alocado as variáveis dinâmicas, mas temos o mesmo problema de alocar memória 
só que o espaço é menor. 
 
Quem controla o espaço da Heap é a própria linguagem de programação e não o Sistema Operacional. 
O Windows até tem suporte para isto, mas normalmente é a própria linguagem de programação que 
gera o código de alocação executa internamente o algoritmo segundo o fabricante da linguagem 
escolheu para implementar. 
 
Compactação 
 
Como a fragmentação pode ser resolvida? Pela compactação. Conforme mostra a Figura 14. A 
compactação junta todos os processos e toda área livre na parte de baixo da memória e acima junta 
todas as áreas livres. 
 
A compactação tem um problema que é a mudança dos endereços dos processos e das suas respectivas 
áreas. 
 
Digamos que o processo 7 tem uma variável global que estava no endereço 65000 após a compactação 
seu endereço foi modificado. Então a mera compactação simples não vai funcionar. 
 
 
Figura 14 
 
Não adianta fazer somente a compactação. Precisamos alterar os ponteiros para os novos endereços de 
memória. 
 
A compactação exige que se tenha mecanismos para modificar os endereços, pois senão dará 
problemas. 
 
O sistema operacional tem condição de corrigir o endereço perdido. Uma coisa que ele pode fazer é 
apontar o endereço de carga. Ele pode corrigir a carga e pode corrigir o endereço. 
 
O problema é que os sistemas operacionais de hoje em dia não sabem dentro da área de memória do 
processo onde estão as variáveis do ponteiro. 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio – 2012/2 Página 15 
 
 
O sistema operacional sabe na hora da execução onde estão os endereços. Ele não sabe dentro da área 
de memória dos processos onde estão os ponteiros. Em um esquemacomo este a compactação não 
pode ser usada, pois o sistema operacional não sabe corrigir a variável de ponteiro. 
 
A compactação nem sempre pode ser implementada. Neste caso não pode. Porém, existe outro caso 
que é o caso do registrador de base. 
 
Compactação com o Registrador de Base 
 
O endereço será feito a partir do registrador de base. Durante a execução o valor de deslocamento e 
somando ao valor do registrador de base gerando o novo endereço. 
 
Assim, a compactação vai funcionar, ou seja, com o registrador de base é possível compactar sem ele 
não é possível, pois não consegue recuperar o endereço da variável ponteiro. 
 
Para o caso dos processos alocados por áreas? A base não é única. Algumas CPUs permitem várias 
bases. A Intel permite três bases. Uma base para área de código, uma base para área de dados e outra 
base para área de Heap. 
 
Tem três registradores de base diferentes um para cada área 
 
Mecanismos para lidar com a falta de memória 
 
Existem casos que se tem memória livre, mas está separada. Digamos que temos uma memória com 
200 KB livre. Criou um processo novo de 100 KB. Criou um processo de 80 KB. Ficou sobrando 20 
KB. Cria um processo novo de 100 KB. Não vai dá, pois sobrou só 20 KB. A memória está 
insuficiente para rodar o processo de 100 KB. 
 
Então isto é um problema? Em teoria é. Hoje em dia temos memórias grandes (4 GB). Vai existir um 
caso que os processo na memória a soma seja mais de 4 GB. Hoje em dia isto fica muito improvável 
de acontecer. 
 
O problema de memória insuficiente é antigo e hoje em dia acontece muito menos. 
 
O tratamento das imagens digitais só foi possível a partir do momento que passamos ter mais memória 
na máquina para guardar a imagem na memória. 
 
Hoje em dia o caso que faz sentido de uso de muita memória é a edição de vídeo. Neste caso a 
memória pode encher e é preciso ter um mecanismo para não dá erro para você. Então, embora isto 
fosse mais comum no passado é importante ter hoje em dia. Isto pode acontecer no computador 
pessoal e no servidor. 
 
Resolve-se o problema de falta de memória através de mecanismos. Usa-se o disco ou gastar menos 
memória.