Buscar

SOII_Materia_Parte02

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 26 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 26 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 26 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

Prévia do material em texto

SISTEMA OPERACIONAL II – PARTE 2 
 
Elaborado por Luciana SA Amancio Merge com material da Soraia – 2013/01 Página 1 
 
4) COMO CONSEGUIR EXECUTAR UM PROCESSO EM UM ENDEREÇO QUALQUER 
DE MEMÓRIA? 
 
5) Correção de endereços em tempo de carga 
6) Registrador de base 
7) Uso de endereçamento relativo a instancia atual 
8) Segmentação 
9) Paginação 
 
5) O USO DE ENDEREÇO RELATIVO 
 
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. 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. 
 
6) ÁREAS DE MEMÓRIA DE UM PROCESSO (INTRODUÇÃO À SEGMENTAÇÃO) 
 
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 determinam 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. 
 
Áreas de Um Processo: Código, Dados (variáveis locais) e área de pilha (cada processo tem a sua). A 
amarração das variáveis locais é feita em tempo de execução. 
 
7) VARIÁVEIS GLOBAIS 
 
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. Quando o programa começa ela 
passa existir e quando o programa termina ela deixa de existir. 
 
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. 
 
8) VARIÁVEIS LOCAIS 
 
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. O problema maior que ocorre com as variáveis Locais está dentro 
de funções recursivas, como mostra o exemplo abaixo: 
SISTEMA OPERACIONAL II – PARTE 2 
 
Elaborado por Luciana SA Amancio Merge com material da Soraia – 2013/01 Página 2 
 
 
function FAT(n: integer): integer; 
 begin 
 if n = 1 then 
 FAT := 1 
 else FAT := n * FAT(n-1); 
 end; 
 
 program principal; 
 var FAT: integer; 
 begin 
 FAT := 1; 
 for i := 1 to n do 
 FAT := FAT * i; 
 End. 
 
A remoção é a complicação desta alocação de variável local em uma função recursiva, pois não existe 
uma única variável n na memória existem vários n. Para resolver este problema é utilizada uma pilha 
de execução. Na pilha de execução temos o seguinte funcionamento, supondo n = 4: 
 
 Aloca-se no sentido de cima para baixo a variável n. Assim existem quatro variáveis de 
nome n na memória, criada a cada chamada da função recursiva: n = 4, n = 3, n = 2, n = 1; 
 
 Quando desaloca na ordem inversa da alocação, de baixo para cima, é que serão feitos os 
cálculos do fatorial: n = 1, n = 2, n = 3, n = 4. 
 
 
 
 
 
 
As variáveis Locais possuem algumas particularidades 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; 
 
4 
3 
2 
1 
 
alocando desaloca 
Pilha 
SISTEMA OPERACIONAL II – PARTE 2 
 
Elaborado por Luciana SA Amancio Merge com material da Soraia – 2013/01 Página 3 
 
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. 
 
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. 
 
n 3 fat (3) = fat ( 3 ) * 3 = 6 
 
n 2 fat (2) = fat ( 1 ) * 2 = 2 
 
 → n * 20 fat (1) = 1 
 
O último "n" será sempre o ativo, marcado por um indicador. Qualquer nova atribuição do valor será 
feito na última. 
 
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 qual é 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 
 
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. É 
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. 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio Merge com material da Soraia – 2013/01 Página 4 
 
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. 
 
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; 
 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 deN:= 33. A variável 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 sub-rotina 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 sub-rotina acabar de executar o que vai acontecer? Desalocação das variáveis locais da sub-
rotina Função FAT, ou seja, o topo é incrementado e volta a ser como era antes da execução dessa sub-
rotina. Onde estavam as variáveis locais N volta a ser área livre da memória da pilha. Conforme mostra 
a Figura 3. 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio Merge com material da Soraia – 2013/01 Página 5 
 
 
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. 
 
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. EAX e EBX são registradores. Isto acontece na passagem de parâmetros. 
 
Mov EAX, 3 
Push EAX Exemplo 1 de Linguagem de Máquina 
Call 500 
 
Mov EAX, [1000] (Endereço da variável X) 
Push EAX Exemplo 2 de Linguagem de Máquina 
Call 500 Endereço da Função FAT 
 
No caso da função FAT o EAX será o N. Então a variável 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. 
 
9) VARIAVEIS DINAMICAS 
 
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. 
 
São alocadas utilizando a instrução NEW em Pascal e MALLOC em C. São variáveis alocadas de 
acordo com a programação feita utilizando as instruções descritas acima. O fato de o programador ficar 
com esta responsabilidade, cria complicações, pois, o compilador não sabe quando essas variáveis serão 
alocadas e desalocadas. 
 
Na memória das áreas ocupadas pelo processo têm a seguinte subdivisão: área de dados, para as 
variáveis globais e dinâmicas, área de pilha, reservada para variáveis locais e área de código. 
 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio Merge com material da Soraia – 2013/01 Página 6 
 
Um processo contém: CÓDIGO, DADOS (variáveis GLOBAIS, variáveis LOCAIS e variáveis 
DINÂMICA). Códigos, dados, variáveis globais são alocados quando o processo começa a executar, 
dados locais que é usado na pilha, vai alocando os dados conforme o programa executa, quando 
começam a executar são alocados na pilha e variáveis dinâmicas. 
 
 Procedure X 
Var P,Q,R : ^real; 
Begin I := 5; new(P); new (Q); new (R); p^=3,8; 
 
Onde: P, Q e R não são as variáveis dinâmicas, são os ponteiros que apontam para as variáveis 
dinâmicas. A variável dinâmica só passa a existir depois que é feito o loop. P, Q e R são variáveis locais, 
portanto estão na pilha de execução. Nesse programa, existem 4 variáveis locais I, P, Q e R, começando 
a pilha de execução: 
 
5 
 
 
 
 
 
 
Quando fazemos new P : O que pode acontecer? 
1) É alocado um espaço real na heap; 
2) É feito com que P aponte para esse espaço; 
 
 
Nota: 
Heap: local onde são armazenadas as variáveis dinâmicas. A mesma coisa acontece com Q e R, quando 
faz newQ e newR. 
 
Se (ponteiro)P = 3,8, P está referenciando o ponteiro e está usando o valor 3,8 na variável dinâmica 
apontada por P. Quando acabar acontecerá que o programador poderá desalocar as variáveis em 
qualquer ordem, ele não precisa fazer isso na mesma ordem que alocou. 
 
A variável dinâmica normalmente é usada em linguagens de programação mais sofisticadas. Em 
linguagem orientada a objetos tipicamente um objeto é uma variável 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 variável dinâmica do tipo Emp e a variável local P passa a apontar para 
3,8 
HEAP I 
P 
Q 
R 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio Merge com material da Soraia – 2013/01 Página 7 
 
 Esta variável dinâmica criada. 
 
P^.Matricula = 123; 
P^.Nome = „João‟ 
 
As vezes se confundi variável dinâmica com variável ponteiro. P é variável ponteiro ele aponta. P 
dinâmico ele é local fica na pilha. O comando new cria a variável dinâmica que não está na pilha e faz a 
variável 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. 
 
 
 
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 e 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. 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio Merge com material da Soraia – 2013/01 Página 8 
 
 
As variáveis dinâmicas não têm nome, e são armazenadas numa área chamada HEAP. Ao utilizar um 
comando de alocação de memória, uma variável local (p) aponta para uma variável dinâmica contida na 
área de HEAP. P é uma variável local armazenada na pilha. 
 
A área de HEAP seria a quarta área de um processo em muitos SO, como o Win 3.1. No UNIX, há 
somente3 áreas: Variáveis globais, HEAP (locais e dinâmicas) e código. 
 
As áreas de um processo podem estar aglutinadas num só bloco numa área de memória, ou separadas e 
espalhadas na memória. A área de código de um processo não muda, pois foi carregado totalmente e 
compilado na memória. Porém, na área de dados há alterações em valores de endereços, pois as 
variáveis precisam ser amarradas. 
 
Na área de pilha, o topo vai consumindo espaços livres para armazenar dados, até chegar ao limite 
inferior da área de pilha. Quando isto acontece, o HW gera uma interrupção, e podem ocorrer 2 eventos 
de acordo com o SO. 
 
Abortamento do processo ou/e deixar o topo continuar descendo para expansão da área de pilha. Essa 
expansão só é possível se, abaixo da área de pilha, houver área livre. A pilha, na CPU Intel, cresce para 
baixo. 
 
Uma outra alternativa para expansão da área de pilha, seria a copia da área de pilha para uma área livre, 
mas dependerá se o HW terá essa capacidade. Isso acarreta uma re-amarração dos endereços em tempo 
de execução, e é essa a ponte que depende do HW. 
 
É possível fazer essa re-amarração alterando-se o valor dos registradores base, como na CPU Intel para 
que as instruções passem a acessar os novos endereços, sem que o processo seja incomodado. A HEAP 
aloca as variáveis a execução de comandos do tipo NEW, mas só desloca aos comandos DISPODE. 
Logo, é possível que haja espaços livres na heap, no meio da heap alocada. 
 
O código do comando de alocação é quem percebe que a heap está cheia. No Pascal, quando se tenta 
alocar uma variável na heap cheia, a rotina de alocação percebe a exaustão da heap e aborta o processo. 
No Unix, quando a heap esta cheia ou com espaços muito pequenos para alocação de processos, o 
processo faz uma chamada ao sistema para aumentar a área de dados. A área de heap cresce para cima, 
ela não cresce invadindo a área de variáveis globais. 
 
No Windows 3.1, se a heap está cheia pode-se alocar outra área de dados para servir como uma segunda 
heap. Os dados na heap são alocados numa certa seqüência, porém, nem sempre as variáveis ficam 
alocadas seqüencialmente. 
 
As áreas de código contem uma parte resultante do código-fonte do processo e uma parte que já é 
pronta, que contem as rotinas das bibliotecas do compilador. A parte que vem da biblioteca não vai toda 
para a área de código, somente as partes da biblioteca utilizadas pelo processo. 
 
Ao se carregar o programa na memória, não se sabe onde ficarão as áreas de códigos dos processos, nem 
a área de código da biblioteca compartilhada. A partir do momento em que se sabe a posição do código 
da biblioteca, se faz a correção dos endereços das chamadas as rotinas da biblioteca. A correção desses 
endereços de biblioteca é diferente da correção de código comum. As instruções que contem referencias 
a rotinas da biblioteca são marcadas pelo executável para correção de endereço, e tem marcado o 
numero da rotina sendo chamado na biblioteca. Ao carregar a biblioteca na memória, o linker passa a 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio Merge com material da Soraia – 2013/01 Página 9 
 
saber a posição das rotinas na memória, então ele checa a posição da rotina sendo chamada e substitui 
na chamada. 
 
10) DIFERENÇA ENTRE VARIÁVEIS LOCAIS E DINÂMICAS 
 
As Variáveis locais tem um seqüenciamento muito claro de alocação e desalocação quando a rotina 
começa a rodar, são alocadas todas as variáveis locais para essa rotina, quando a rotina acaba de rodar, 
são desalocados na mesma ordem em que foram alocadas. 
 
Nas variáveis dinâmicas o programador pode escolher a ordem de desalocação, não seguem a ordem de 
pilha como nas locais. Não dá para usar uma pilha para alocar variáveis dinâmicas. A grande diferença é 
o sequenciamento. 
 
O ponteiro guarda o endereço na memória. A variável é aquilo para qual o ponteiro aponta. O ponteiro 
contém o endereço e esse endereço aponta para a variável dinâmica alocada na heap. A variável 
dinâmica é aquilo que foi alocado na heap. O grande ponto: a heap não é uma pilha. A heap é a 3ª área 
diferente de dados. 
 
11) 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; 
 
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 tenha 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 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á. 
 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio Merge com material da Soraia – 2013/01 Página 10 
 
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 
 
 
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 à á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. 
 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio Merge com material da Soraia – 2013/01 Página 11 
 
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. 
 
 
 
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 existem as á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 processovai 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 Merge com material da Soraia – 2013/01 Página 12 
 
 
 
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. 
 
12) CONCLUSÃO 
 
Quatro tipos de área diferentes de um processo: 
- Área onde está o código executado; 
- Área onde estão os variáveis globais (que mais são utilizadas); 
- Área de variáveis locais que são alocados dinamicamente; 
- Variáveis dinâmicas. 
 
No caso do UNIX juntou duas e agora são três áreas: 
- Área do código executável; 
- Área de pilha (que contém a pilha e variáveis locais); 
- Área de dados (contém variável global e a heap. Juntou globais e dinâmicas). 
A partir do conceito acima podemos concluir que o processo fica todo contido na memória e podemos 
ter o mesmo processo em várias partes da memória. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
SO 
////// 
D1 
P1 
P2 
C2 
C1 
D2 
3 áreas do processo P1 
3 áreas do processo P2 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio Merge com material da Soraia – 2013/01 Página 13 
 
Como essas áreas sofrem alteração? 
 
Área de Código 
 
Faz sentido ser modificado? Sim, durante a execução do programa. Esses programas geram códigos que 
são incorporados a eles mesmos. Mas isso não é muito comum. 
 
Os programas automodificáveis eles precisam ter alteração na área de código, uma vez que o programa é 
carregado na memória e vira processo essa área vem a ser modificada e é por causa disso que desde que 
o hardware permita, essa área fica inibida, impedindo que o processo faça modificação nessa área e se o 
processo tentar fazer ele é abortado. Então, geralmente, a resposta à pergunta acima é Não. É 
proibida a modificação dessa área. Se o próprio processo ou outro tentar alterar a área de código o SO 
abortará a execução desse processo. 
 
Área de Pilha 
 
Sofre modificação? Sim, pois as varáveis locais podem ser modificadas. A área de pilha é alterável. Não 
apenas isso. Dentro da área de pilha tem um ponteiro que aponta para um lugar dentro da área que esse 
ponteiro se chama topo da pilha e no caso da Intel que tudo que está abaixo dos outros está livre, só a 
parte de cima tem variáveis. 
 
Quando uma rotina se inicia (o que significa alocação? Significa que descer um pouco do topo), quando 
a rotina acaba, é solto o topo da pilha, quer dizer que a rotina acabou. A CPU de 30 anos pra cá, tem 
uma função específica para manipular o topo da pilha (mais básicas: paste e copy). 
 
Nessa área de pilha o valor muda, muda a área total, vai mudar o valor de dentro. Outra coisa é, pode ter 
um programa que tenha um tempo de execução muito grande, ou um programa que tenha variáveis 
locais muito grandes, pode acontecer quando a rotina entra o topo desce, se uma rotina é muito 
recursiva, cada vez que tem uma recursão o topo desce um pouco e assim por diante tem uma hora que o 
topo da pilha vai bater no limite dela, então aborta o processo, isso é o stack overflow. 
 
Nos SO‟s mais sofisticados, antes de abortar um processo o SO tenta aumentar a área da pilha, se 
conseguir crescer não aborta o processo se crescer não tem jeito (ex: Unix). Alterável à medida que são 
incluídas/excluídas/alteradas as variáveis locais nessa pilha. 
 
Se uma rotina tem muita recursão, pode acabar com o espaço na pilha, causando o estouro da pilha (a 
maioria dos SOs abortam o processo – ex.: Windows 3.1). O Unix tenta aumentar o tamanho da pilha ao 
perceber que o espaço disponível da pilha chegou ao fim. 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio Merge com material da Soraia – 2013/01 Página 14 
 
 
 
 
Visão de uma pilha da arquitetura Intel: 
 
 
 
 
 
 
Tentativa de liberar espaço para pilha: 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Área de dados 
 
 
 
 
 
No Unix essa área contém variáveis globais e dinâmicas (heap): Conforme o programa vai sendo 
executado vai sendo alocados e desalocados variáveis dinâmicas, ou seja, será feito o new no Pascal ou 
malloc no C/C++, e “dispose” no Pascal ou free no C/C++ respectivamente. 
 
Se o programa utilizar muitas variáveis dinâmicas, em algum momento, é possível que não tenha mais 
espaço para alocar essas variáveis, nesse caso, pode abortar ou tentar crescer o tamanho da área, ou seja, 
o SO pode tentar crescer a área de pilha. 
 
1) Quem sabe se a heap tem ou não espaço é o processo, o SO não se envolve. 
2) O Windows pode ter mais de uma heap. 
3) Na área de pilha e de dados do Unix, elas são alteráveis (conteúdo) e o tamanho também. 
/////// 
globais 
heap 
Topo 
Variáveis 
 
Área livre 
Topo 
 
Área livre 
Topo Topo 
Variáveis 
 
Área livre 
Topo 
 
Variáveis 
Área livre 
Variáveis 
Topo 
Variáveis 
Nova área 
livre 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio Merge com material da Soraia – 2013/01 Página 15 
 
 
 
 
2) 
 
 
 
 
 
 
No Unix ao invés de abortar o processo, provocando o erro de stack overflow, ele aumenta a área de 
pilha, caso não consiga ocorre o erro descrito anteriormente. Desse tipo de concepção foi inventada uma 
forma de organizar a memória, a quantidade de áreas que o processo possui. Essa forma de organizar a 
memória é chamada segmentação. Se houver muitas variáveis dinâmicas, pode ser que cause falta de 
espaço na heap. 
 
O que pode acontecer? 
- Aborto do processo 
- Tentativa de expansão da área da heap através de uma solicitação da rotina new (no Pascal) ou malloc 
(no C), que percebem a falta de espaço na heap (Unix). 
 
O Unix pode reservar inicialmente um espaço livre em comum para a pilha e/ou dados usarem à medida 
que elas forem precisando. O processo não se divide na memória. 
 
 
 
 
 
 
 
 
 
 
 
 
Quando um processo chega e precisa de memória, é feita uma busca no conjunto por um bloco que seja 
grande o suficiente para o processo. Se o bloco for grande demais, ele será dividido em dois: uma parte 
é alocada ao processo que chega; a outra é devolvida para o conjunto de blocos. 
 
O problema de alocação de memória dinâmica consiste em como atender a um pedido de tamanho n de 
uma lista de blocos de memórias livres. As estratégias de first-fit, best-fit e worst-fit são as mais 
comumente usadas para selecionar um bloco de memória livre do conjunto de blocos disponíveis.13) FRAGMENTAÇÃO DA MEMÓRIA (PROBLEMA DA ALOCAÇÃO DE 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. 
P 
//// 
D 
C 
Processo 1 
Pilha P 1 
Área livre para 
Pilha/Dados 
P 1 
Dados P 1 
Código P 1 
Processo 1 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio Merge com material da Soraia – 2013/01 Página 16 
 
 
 
O First Fit tem esta característica embora ele seja muito rápido ele pode gerar fragmentos. 
 
Tenho uma memória disponível tem que alocar a memória dentro dessa memória disponível e o pedaço 
alocado tem que ficar indisponível. Com isso, cria situações que podem gerar o impedimento do 
surgimento de processos. Se tiver muitas alocações e desalocações o que pode acontecer é que terá 
muitas áreas disponíveis pequenas e separadas umas das outras, se eu precisar alocar uma nova área que 
seja maior que qualquer área dessa eu não vou conseguir, apesar da soma de cada área ser maior do que 
a área que eu quero alocar. Esse problema se chama Fragmentação de Memória. 
 
Se houver muitas alocações/desalocações na memória, pode acabar causando o surgimento de várias 
áreas disponíveis na memória mas pequenas demais para caber os segmentos de um processo apesar da 
soma dessas áreas serem, muitas vezes, maiores que o espaço que um processo precisa. Esse problema é 
chamado de fragmentação. 
 
Como se resolve esse problema? 
1) Utilizar compactação; 
2) Evitar que aconteça. 
 
1ª solução: deslocar as áreas livres e ocupadas de forma que as áreas livres fiquem todas juntas 
(compactação). 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Processo 1 
Problema: A 
movimentação das 
áreas dos processos 
depende do HW. 
 
 
 
 
Na segmentação pode 
ser feita a 
SO 
Área livre 
Processo 2 
Área livre 
Processo 3 
Área livre 
Área livre 
Processo 1 
50000 
 
45000 
 
40000 
 
35000 
 
31000 
 
25000 
 
22000 
 
20000 
 
0 
 
SO 
Processo 3 
Processo 2 
Área livre 
50000 
 
45000 
 
40000 
 
34000 
32000 
 
 
 
 
 
 
 
 
0 
 
Antes da compactação Depois da compactação 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio Merge com material da Soraia – 2013/01 Página 17 
 
 
2a solução: Tentar evitar que a fragmentação ocorra. 
 
Para isso deve ser usada um algoritmo de alocação de área a um processo de forma que as áreas livres 
sejam poucas e as menores possíveis. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
O Algoritmo Worst Fit é o algoritmo que escolhe a maior área disponível. Nesse exemplo, a área livre 
escolhida por esse algoritmo seria a área que começa no endereço 25000 e termina no endereço 31000 
(tamanho 6000). Ao alocar os 3500kb necessários para o processo X, sobraria 2500 Kb para outro 
processo utilizar. 
 
Mas esse algoritmo pode causar o seguinte problema: Se um processo precisar de 6000 kb para ser 
alocado na memória, vai acabar não conseguindo, pois não há uma área desse tamanho para ele. A 
solução seria fazer uma compactação. 
 
O Worst Fit tem uma variação: se existir uma área com o tamanho exato, ela será usada. Se não tiver, 
use a que tem o maior tamanho. 
 
O 3o algoritmo é o First Fit que utiliza a 1a área grande o suficiente para caber o processo. No exemplo 
acima, a área livre que o SO utilizaria para alocar o processo seria a que começa no endereço 5000 (que 
tem um tamanho de 5000). 
 
O First Fit tem uma variação: o Next Fit ou Circular Fit verifica a 1a área livre grande o suficiente para 
alocar o processo a partir da posição de memória alocada para o último processo. 
 
Todos os três algoritmos verifica todas as áreas disponíveis para ver qual área se adequa melhor ao 
algoritmo. A verificação pode demorar se houver muitas áreas livres. O SO mantém uma lista de todos 
Um processo novo precisa de uma área de memória 
de tamanho 3500. 
 
Qual das áreas livres pode ser escolhida? 
 
O algoritmo Best Fit escolhe a área que tem o 
tamanho igual ou um pouco maior do que a área 
necessária para o processo. 
 
Nesse exemplo, a área livre escolhida por esse 
algoritmo seria a área que começa no endereço 35000 
(que tem um tamanho de 4000). 
Note que nesse caso causaria uma fragmentação pois 
utilizando uma área de 3500 na área de tamanho 
4000, vai acabar sobrando 500, área essa 
possivelmente pequena para a inserção de um novo 
processo. 
 
 
 
Processo 4 
Área livre 
Processo 2 
Área livre 
Processo 3 
Área livre 
Área livre 
Processo 1 
50000 
 
45000 
39000 
 
35000 
 
31000 
 
25000 
 
21000 
 
20000 
 
10000 
 
 5000 
 
 2000 
 
 0 
SO 
Área livre 
Processo 5 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio Merge com material da Soraia – 2013/01 Página 18 
 
as áreas livres disponíveis na memória (ordenado pelo endereço inicial) com seu endereço inicial e 
tamanho. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Se for alocado/desalocado um ou mais espaços livres (por inteiro ou não), o SO deve atualizar a lista dos 
espaços livres para refletir o estado da memória. 
 
Uma solução para o problema da fragmentação externa é a compactação. A meta é trocar de posição o 
conteúdo da memória para reunir toda a memória livre em um grande bloco. Se a relocacao é estática e 
for feita no momento de montagem ou carga, a compactação não poderá ser feita. A compactação só 
será possível se a relocacao for dinâmica e for feita em tempo de execução. Quando a compactação é 
possível, devemos determinar o seu custo. O algoritmo de compactação mais simples consiste em mover 
todos os processos em direção a um lado da memória; todos os blocos livres se movem na outra direção, 
gerando um grande bloco de memória disponível. Outra solução possível para o problema de 
fragmentação externa é permitir que o espaço de endereçamento lógico de um processo seja não 
contíguo, possibilitando que um processo receba memória física onde ela estiver disponível. Solução: 
Paginação e segmentação. 
 
14) ALGORITMO DE ALOCAÇÃO (Para evitar a Fragmentação da Memória) 
 
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. 
 
0 3000 
4000 1000 
9000 3000 
End. 
Inicial 
da 
Área 
Livre 
Tam. 
da 
Área 
Livre 
Ponteiro 
para a 
próximo 
item da 
lista 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio Merge com material da Soraia – 2013/01 Página 19 
 
 
 
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 
escolha. Onde alocar o processo 5? Temos três áreas livres de memória. Esta escolha é feita pelo 
algoritmo de alocação. 
 
14.1) ALGORITMO DE ALOCAÇÃO FIRST FIT 
 
Aloca o bloco na primeira área livre que encontrar. Não procura áreas livres na memória. Assim é mais 
rápido. Porém gera áreas livres de tamanho variado na memória. Começa a procurar no espaço seguinte 
à última alocação. 
 
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. 
 
 
SISTEMA OPERACIONAL II – REVISÃO PARTE2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio Merge com material da Soraia – 2013/01 Página 20 
 
 
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. 
 
14.2) ALGORITMO BEST FIT 
 
Existe outro algoritmo que é mais sofisticado que se chama Best Fit que tenta alocar na área de tamanho 
mais próximo ao que se quer inserir na memória. 
 
Este algoritmo 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). 
 
 
 
First Fit pesquisa a partir do “zero” da memória e o Next Fit é a partir da última alocação na memória. 
 
 
 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio Merge com material da Soraia – 2013/01 Página 21 
 
14.3) 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. Este algoritmo tenta alocar na área de tamanho 
mais afastado do que se quer inserir na memória. Faz o worst se não existir espaço de tamanho exato. 
Começa a procurar área livre no início da memória. 
 
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 
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. 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio Merge com material da Soraia – 2013/01 Página 22 
 
 
 
14.4) CONCLUSÃO 
 
Memória 
 
 
 
 
 
 
 
 
 
 
 
 
 
No esquema acima têm cinco áreas livres, cada uma com os seguintes tamanhos: 3000, 5000, 8000, 
4000, 2000 respectivamente. Se o processo alocar uma área de 4000 na memória não haveria 
fragmentação, pois ele ocuparia a área livre de tamanho 4000. O problema é se tentar alocar um bloco 
de 3500, pois sobrará um espaço de 500, pequeno demais para poder ser alocado por outro bloco, é o 
que o algoritmo Best Fit faz. 
 
O que pode ser feito é tentar alocar em um bloco maior e assim sobrar um pedaço maior para que possa 
ser alocado por outro bloco, por exemplo, alocar no bloco de 8000 sobrando 4500, que é o que o 
algoritmo Worst Fit faz. Mas, agora se quiser alocar um processo de 6000, por exemplo, não tem mais 
área com tamanho maior ou igual para este processo, o que vai ter que fazer é a compactação. Não 
existe um algoritmo prático para alocação. 
 
Pode ser uma coisa custosa procurar o espaço que melhor se adapta. Por isso, existe outro algoritmo que 
coloca o processo no primeiro espaço livre encontrado que couber este processo. Este algoritmo é o 
First Fit. 
 
Dentro do sistema operacional existe uma lista encadeada com os espaços livres da memória para 
controlar esses espaços livres. Como mostra o esquema abaixo: O endereço de início 0 e tamanho 3000 
aponta para o endereço inicial 10000 de tamanho 5000 e este aponta o endereço inicial 25000 de 
tamanho 8000 e este aponta para o endereço inicial 40000 de tamanho 4000 e por último o endereço 
inicial 60000 de tamanho 2000. 
SO 
 
 
 
 
 
 
 
 
 
 
 
3000 
5000 
8000 
4000 
2000 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio Merge com material da Soraia – 2013/01 Página 23 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Os problemas e as soluções da alocação de memória são utilizados tanto para processos como para 
variáveis dinâmica, onde quem controla isto é o sistema operacional e a biblioteca padrão, e nesta última 
contém as informações sobre o que foi alocados na heap e etc. 
 
15) COMPACTAÇÃO 
 
Deslocamento de todas as áreas para acabar com os buracos; Juntaria todas as áreas e formaria um 
espaço livre maior capaz de ser alocado para um novo processo. Isso é chamado de compactação. 
 
Exemplo: A memória contém cinco processos (P1, P2, P3, P4 e P5) e entre eles tem uma área livre. A 
compactação vai juntar essas áreas. Na tabela de segmento o início do processo P5, que antes era 40000 
passa a ser 32000, o seu tamanho permanece em 5000, assim como se trata do último processo alocado 
na memória, o endereço inicial da área livre é 37000. 
 
Memória Memória 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
É o hardware que permite a compactação da memória. E esta compactação é acionada quando um 
processo deseja ocupar a memória e não tem área disponível, o SO toma a iniciativa da compactação da 
memória. 
 
Início Tamanho Próximo 
0 3000 
 
Início Tamanho Próximo 
10000 5000 
 
Início Tamanho Próximo 
25000 8000 
 
Início Tamanho Próximo 
40000 4000 
 
Início Tamanho Próximo 
60000 2000 
 
SO 
 
P5 
 
P4 
 
P3 
 
P2 
 
P1 
 
SO 
 
P5 
P4 
P3 
P2 
P1 
 
Compactação 
40000 
45000 
32000 
37000 
Ínicio Tamanho 
40000 5000 
 
Tabela de Segmento antes 
da Compactação 
Ínicio Tamanho 
32000 5000 
 
Tabela de Segmento 
depois da Compactação 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio Merge com material da Soraia – 2013/01 Página 24 
 
O mesmo problema ocorre para alocação de variáveis dinâmicas dentro de área de heap de um processo. 
E como solução é compactar a memória. Neste caso, para correção dos endereços tem que ser possível 
saber onde estão os ponteiros das variáveis dinâmicas. O Java consegue fazer isto, mas o C, Pascal não 
conseguem. 
 
 
 
 
 
 
 
 
 
 
A vantagem da segmentação é poder fazer a compactação e apenas trocar o endereço inicial do 
segmento na tabela de segmento, pois o deslocamento e o tamanho são os mesmos. Para se chegar ao 
endereço final da posição da memória o hardware tem somar o início do segmento mais deslocamento. 
 
Problemas da compactação: 
1) Mover memória; 
2) Depende de o hardware mover a posição que a área de determinado processo ocupa sem que o 
processo saiba que isso aconteceu, nem sempre é possível de ser feito. No caso de 
segmentação é possível, desde que todas as tabelas de segmentosreflitam a nova posição de 
cada segmento. 
 
A outra forma é tentar evitar (2) que a fragmentação ocorra e para isso existem algoritmos, e cada um 
tem seu objetivo, para a escolha de área livre, que é uma área que minimize a fragmentaçã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 
 
Pilha 
 
 
 
 
 
Dados 
Código 
 
Heap 
 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio Merge com material da Soraia – 2013/01 Página 25 
 
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. 
 
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 esquema como 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. 
 
15.1) 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. 
 
16) FALTA DE MEMÓRIA 
 
Quando o usuário quer executar processos que não cabem na memória da máquina. Isto pode acontecer 
quando: 
 Um processo executado for maior do que a memória da máquina; 
 Ou a soma dos tamanhos de cada processo que se quer executar na máquina é maior que a 
memória desta máquina; 
 O tamanho total dos processos é maior que o tamanho da memória que está disponível. 
 
17) 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 processos 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. 
 
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 
 
Elaborado por Luciana SA Amancio Merge com material da Soraia – 2013/01 Página 26 
 
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 gasta menos 
memória.

Outros materiais