Professional Documents
Culture Documents
Sumrio
2
Acesso aos dados sem procedimentos aninhados. Questes sobre procedimentos aninhados Profundidade de aninhamento Elos de acesso Displays Gerenciamento do heap Gerenciador de memria Localidade em programas
A memria
8
Memria de Pilha
Memria Heap
Os dados que podem sobreviver chamada do procedimento que os criou usualmente so alocados em um heap de memria reutilizvel.
Para linguagens que no permitem declaraes de procedimentos aninhadas, a alocao de memria para as variveis e o acesso a essas variveis simples: Variveis globais so alocadas em uma rea de memria esttica. Qualquer outro nome precisa ser local ativao no topo da pilha. (top_sp da pilha)
Na famlia de linguagens C, todas as variveis so definidas ou dentro de uma nica funo ou fora de qualquer funo(globalmente).
Varivel global
Escopo seguindo todas as declaraes, exceto quando onde houver uma definio local.
Varivel local
A alocao de memria para as variveis e o acesso a essas variveis simples: 1- Variveis globais so alocadas em uma rea de memria esttica. Os endereos dessas variveis permanecem fixos e so conhecidos em tempo de compilao.
2 - Qualquer outro nome precisa ser local ativao no topo da pilha. Podemos acessar essas variveis por meio do apontador top_sp da pilha.
O acesso se torna muito mais complicado quando uma linguagem permite que as declaraes de procedimentos sejam aninhadas e tambm usa a regra geral de escopo esttico, ou seja, um procedimento pode acessar variveis dos procedimentos cuja declaraes envolvem sua prpria declarao.
O motivo que saber em tempo de compilao que a declarao de p est imediatamente aninhada dentro de q no nos diz as posies relativas de seus registros de ativao em tempo de execuo.
Suponha que x seja declarado no procedimento envolvente q. Localizar a ativao relevante de q a partir de uma ativao de p uma deciso dinmica; isso exige informaes em tempo de execuo adicionais sobre as ativaes.
Das linguagens mais recentes com procedimentos aninhados, uma das mais influentes ML. ML uma linguagem funcional, significando que as variveis, uma vez declaradas e inicializadas, no so alteradas. Definio: val <nome> = <expresso> Funes: fun <nome>(<argumentos>) = <corpo> Corpo de funo: let <lista de definies> in<comandos> end
Profundidade de aninhamento
15
Procedimentos que no esto aninhados dentro de nenhum outro procedimento = profundidade 1. Se um procedimento p for definido imediatamente dentro de um procedimento na profundidade de aninhamento i, ento d a p a profundidade de aninhamento i + 1.
Profundidade de aninhamento
16
fun sort(inputFile, outputFile) = let Definidas dentro de val a = array(11,0); funo com profundidade fun readArray(inputFile) = ....... 1. ....a...; fun exchange(i , j) = ....... ....a...; fun quickSort(m, n) = ....... let val v = ....; fun partition(y , z) = ...a...v .... Exchange ..... in ... a ... v ... partition ... quickSort end in ... a .. readArray .. Quicksort end;
profundidade 1
2 2 2
Uma implementao direta da regra de escopo esttica normal para funes aninhadas obtida acrescentandose um apontador chamado elo de acesso a cada registro de ativao.
Se o procedimento p est aninhado imediatamente dentro do procedimento q, ento o elo de acesso em qualquer ativao de p aponta para ativao mais recente de q.
s Elo de acesso a Q(1,9) Elo de acesso v Q(1,3) Elo de acesso v P(1,3) Elo de
v
Q(1,3)
Elo de acesso
v
Imagem 3. Elos de acesso para localizar dados no locais.
Displays (1/3)
19
Se a profundidade de aninhamento crescer muito, pode ser necessrio seguir longas cadeias de elos para alcanar os dados de que precisamos. Uma implementao mais eficiente utiliza um arranjo auxiliar d, chamado display, que consiste em um apontador para cada profundidade de aninhamento. d[i] vai apontar para o registro mais alto da pilha para qualquer procedimento na profundidade de aninhamento i;
Displays (2/3)
20
d[1] d[2]
s
Q(1,9) salvo d[2] Q(1,3)
d[1] d[2]
salvo d[2]
P(1,3)
salvo d[3]
Displays (3/3)
21
Gerenciamento do Heap
22
O Heap uma poro de memria usada para dados que residem indefinidamente, ou at que o programa os exclua explicitamente.
O gerenciador de memria
23
O gerenciador de memria administra todo o espao livre na memria heap o tempo inteiro. Ele realiza duas funes bsicas:
Alocao Liberao
Propriedades desejveis
24
Eficincia de espao
Um gerenciador de memria dever minimizar o espao total do heap necessrio por um programa.
Eficincia de programa
Um gerenciador de memria dever fazer bom uso do subsistema de memria para permitir que os programas sejam executados mais rapidamente.
Baixo custo
O gerenciamento da memria e a otimizao da memria precisam ser feitos levando-se em conta o comportamento da memria.
Tempo gasto para acessar diferentes partes da memria pode variar desde nanossegundos at milissegundos.
Tamanhos tpicos
> 2 GB
3 15 ms
256 MB 2 GB
Memria Fsica
100 150 ns
128 KB 4 MB
40 60 ns
16 64 KB
5 10 ns
32 Words
1 ns
A maioria dos programas exibe um alto grau de localidade; ou seja, gastam a maior parte do tempo executando uma pequena frao do cdigo e usando uma pequena frao dos dados.
Localidade temporal se for provvel que os endereos de memria que ele acessa sejam acessados novamente dentro de um curto espao de tempo. Localidade espacial se for provvel que os endereos de memria vizinhos do endereo acessado, tambm sejam acessados dentro de um curto perodo de tempo.
A sabedoria convencional diz que os programas gastam 90% do seu tempo executando 10% do cdigo.
Os programas frequentemente contm muitas instrues que nunca so executadas. Os programas construdos com componentes e bibliotecas utilizam apenas uma pequena frao da funcionalidade fornecida. Apenas um pequena frao do cdigo que poderia ser invocado realmente executada em uma rodada tpica do programa.
Quando uma nova instruo executada, h alta probabilidade de que a prxima instruo tambm seja executada. A tcnica fazer com que o compilador coloque os blocos bsicos (sequncias de instrues que sempre so executadas sequencialmente) que provavelmente seguiro uns aos outros - na mesma pgina ou at na mesma linha de cache. Colocando a maioria das instrues e dados na memria rpida, porm pequena, e deixando o restante na memria lenta, porm grande.
Reduzindo a Fragmentao
30
Reduzimos a fragmentao controlando como o gerenciador de memria coloca novos objetos no heap. Descobriu-se empiricamente que uma boa estratgia para minimizar a fragmentao alocar a memria solicitada no menor buraco disponvel que seja grande o suficiente.
Referncias
31