• Nenhum resultado encontrado

Gerenciamento de memória

N/A
N/A
Protected

Academic year: 2022

Share "Gerenciamento de memória"

Copied!
27
0
0

Texto

(1)

DCC024 Linguagens de Programac¸ ˜ao

2020/1

Gerenciamento de mem ´ oria

Haniel Barbosa

(2)

Mem ´ oria

B

Quais componentes de um programa precisam ser armazenados?

I o programa em si

Operac¸ ˜oes a serem executadas

I o estado do programa

Valores manipulados por essas operac¸ ˜oes

B

Amem ´oria ´e onde esses componentes s ˜ao armazenados

B

Veremos como gerenciar a mem ´oria para o estado de um programa

(3)

Gerenciamento de mem ´ oria no interpretador de micro-ML

B

O interpretador de express ˜oes mantinha o estado de vari ´aveis

[(‘‘a”, 5), (‘‘f”, ‘‘x”, Prim2(‘‘+”, Var ‘‘x”, Var ‘‘a”), [(‘‘a”, 3)]), ...]

B

Oarmazenamentode valores se dava pela inserc¸ ˜ao na cabec¸a da lista I Definic¸ ˜ao de um novo escopo

B

Aremoc¸ ˜aode valores se dava pela remoc¸ ˜ao da cabec¸a da lista I Sa´ıda de um escopo

B

Oacessoa valores durante a interpretac¸ ˜ao da express ˜ao se dava por uma busca na lista

Possibilitar, de forma eficiente e segura, oacesso,armazenamentoeremoc¸ ˜ao de dados ´e o problema central de gerenciamento de mem ´oria.

(4)

Gerenciamento de mem ´ oria no interpretador de micro-ML

B

O interpretador de express ˜oes mantinha o estado de vari ´aveis

[(‘‘a”, 5), (‘‘f”, ‘‘x”, Prim2(‘‘+”, Var ‘‘x”, Var ‘‘a”), [(‘‘a”, 3)]), ...]

B

Oarmazenamentode valores se dava pela inserc¸ ˜ao na cabec¸a da lista I Definic¸ ˜ao de um novo escopo

B

Aremoc¸ ˜aode valores se dava pela remoc¸ ˜ao da cabec¸a da lista I Sa´ıda de um escopo

B

Oacessoa valores durante a interpretac¸ ˜ao da express ˜ao se dava por uma busca na lista

Possibilitar, de forma eficiente e segura, oacesso,armazenamentoeremoc¸ ˜ao de dados ´e o problema central de gerenciamento de mem ´oria.

(5)

Gerenciamento de mem ´ oria em C

i n t g l o b a l v a r = 7 ;

void f o o (i n t* p t r )

{

i n t a u t o v a r = 9 ; p t r [ 0 ] = g l o b a l v a r ; p t r [ 1 ] = a u t o v a r ;

}

i n t main ( )

{

i n t* p t r = (i n t* ) m a l l o c ( 5 * s i z e o f(i n t) ) ; f o o ( p t r ) ;

p t r [ 2 ] = p t r [ 1 ] + g l o b a l v a r ;

}

(6)

Tipos de mem ´ oria

B

Est ´atica I Permanente I Vari ´aveis globais

B

Din ˆamica I Stack

Armazenamento feito quando um escopo ´e criado (push) Remoc¸ ˜ao quando o escopo ´e destru´ıdo (pop)

Gerenciamento autom ´atico

I Heap

Piscina de blocos de mem ´oria, virtualmente ilimitada Armazenamento/remoc¸ ˜ao feitos independente de escopos Gerenciamento manual

(7)

Est ´atica vs Din ˆamica

Mem ´oria est ´atica n ˜ao tem custo extra de gerenciamento durante execuc¸ ˜ao



Mem ´oria est ´atica n ˜ao ´e flex´ıvel

I Se execuc¸ ˜ao precisar de menos mem ´oria, haver ´a desperd´ıcio I Se execuc¸ ˜ao precisar de mais mem ´oria, impossibilitar ´a a execuc¸ ˜ao

Mem ´oria din ˆamica ´e flex´ıvel:

I pode-se usar apenas o estritamente necess ´ario para uma execuc¸ ˜ao I Limitada apenas pelo total de mem ´oria no dispositivo



Mem ´oria din ˆamica tem custo de gerenciamento durante a execuc¸ ˜ao

(8)

Stack vs Heap

Armazenamento, remoc¸ ˜ao e acesso na stack s ˜ao simples



Stack possui tamanho pr ´e-determinado, ent ˜ao pode ocorrerstack overflow I Vari ´aveis locais requerendo mais mem ´oria do que o limite

I Recurs ˜ao muito profunda levando a mais escopos do que o limite

Heap limitada apenas pela mem ´oria do dispositivo



Armazenamento, remoc¸ ˜ao e acesso s ˜ao custosos e/ou complexos

(9)

Gerenciamento de mem ´ oria na heap

B

Considere a heap como um conjunto deunidades de mem ´oriaindexado por inteiros (i.e., um vetor)

B

Considere umalista de blocos livresdenotando partes desocupadas da heap I Cada elemento da lista cont ´em: a posic¸ ˜ao de in´ıcio do bloco livre, seu tamanho, e

uma refer ˆencia ao bloco livre seguinte

I Inicialmente a lista cont ´em um bloco livre englobando toda a mem ´oria

B

O armazenamento de dados na heap reserva blocos (segmentos cont´ıguos da mem ´oria) cuja primeira posic¸ ˜ao cont ´em o tamanho do bloco

(10)

Armazenamento e remoc¸ ˜ao de dados da heap

Considere os seguintes m ´etodos:

B

allocate(

n : Int

) :

(a : Int)

I Acha o primeiro blocoao menosde tamanhon+1na lista de blocos livres I Cria um bloco de tamanhon+1comec¸ando na posic¸ ˜aoado bloco livre. O

tamanho do bloco ´e salvo na posic¸ ˜aoa

I O restante do bloco livre se torna um novo bloco livre e ´e adicionado `a lista

B

deallocate(

a : Int

)

I Remove o bloco na posic¸ ˜aoae o adiciona `a cabec¸a da lista de blocos livres

B

Exemplo: considere uma heap m de tamanho 10

p1 = m.allocate(4);

p2 = m.allocate(2);

m.deallocate(p1);

p3 = m.allocate(1);

(11)

Armazenamento e remoc¸ ˜ao de dados da heap

Considere os seguintes m ´etodos:

B

allocate(

n : Int

) :

(a : Int)

I Acha o primeiro blocoao menosde tamanhon+1na lista de blocos livres I Cria um bloco de tamanhon+1comec¸ando na posic¸ ˜aoado bloco livre. O

tamanho do bloco ´e salvo na posic¸ ˜aoa

I O restante do bloco livre se torna um novo bloco livre e ´e adicionado `a lista

B

deallocate(

a : Int

)

I Remove o bloco na posic¸ ˜aoae o adiciona `a cabec¸a da lista de blocos livres

B

Exemplo: considere uma heap m de tamanho 10

p1 = m.allocate(4);

p2 = m.allocate(2);

m.deallocate(p1);

p3 = m.allocate(1);

(12)

Exemplos de uso da heap

B

E se tiv ´essemos as seguintes operac¸ ˜oes?

p1 = m.allocate(4);

p2 = m.allocate(4);

m.deallocate(p1);

m.deallocate(p2);

p3 = m.allocate(7);

B

Apesar de a mem ´oria, de tamanho 10, estar totalmente livre, est ´a dividida em dois blocos livres adjacentes de tamanho 5 cada.

(13)

Exemplos de uso da heap

B

E se tiv ´essemos as seguintes operac¸ ˜oes?

p1 = m.allocate(4);

p2 = m.allocate(4);

m.deallocate(p1);

m.deallocate(p2);

[fails] p3 = m.allocate(7);

B

Apesar de a mem ´oria, de tamanho 10, estar totalmente livre, est ´a dividida em dois blocos livres adjacentes de tamanho 5 cada.

(14)

Combinac¸ ˜ao de blocos livres

B

Combinar blocos livres adjacentes permite o armazenamento no caso anterior

B

Manter a lista de blocos livres ordenada pela posic¸ ˜ao de in´ıcio dos blocos permite f ´acil combinac¸ ˜ao

B

Basta um novo bloco ser adjacente ao seu antecessor ou sucessor na lista para uma combinac¸ ˜ao ser poss´ıvel

(15)

Fragmentac¸ ˜ao de mem ´ oria

B

A soluc¸ ˜ao anterior s ´o ´e suficiente para blocos adjacentes

B

Exemplo:

p1 = m.allocate(3);

p2 = m.allocate(2);

m.deallocate(p1);

p3 = m.allocate(2);

p4 = m.allocate(3);

B

Apesar de a mem ´oria possuir, em princ´ıpio, espac¸o o suficiente, ela est ´a fragmentada

(16)

Fragmentac¸ ˜ao de mem ´ oria

B

A soluc¸ ˜ao anterior s ´o ´e suficiente para blocos adjacentes

B

Exemplo:

p1 = m.allocate(3);

p2 = m.allocate(2);

m.deallocate(p1);

p3 = m.allocate(2);

[fails] p4 = m.allocate(3);

B

Apesar de a mem ´oria possuir, em princ´ıpio, espac¸o o suficiente, ela est ´a fragmentada

(17)

Onde armazenar blocos?

B

Diferentes possibilidades com vantagens e desvantagens. Alguns exemplos:

B

First fit

I Armazenamento no bloco compat´ıvel com a menor posic¸ ˜ao na mem ´oria

Simples e eficiente

 Pode separar blocos grandes mais facilmente

B

Best fit

I Armazenamento no bloco compat´ıvel de menor tamanho

Maior sinergia entre bloco a ser armazenado e blocos dispon´ıveis

 Pode levar a blocos muito pequenos mais facilmente

 Implementac¸ ˜ao mais complexa da lista de blocos para acesso eficiente (e.g., ´arvores rubro-negras)

(18)

Evitando fragmentac¸ ˜ao de mem ´ oria no exemplo anterior

B

Com armazenamento porbest fito exemplo ´e bem-sucedido:

B

Exemplo:

p1 = m.allocate(3);

p2 = m.allocate(2);

m.deallocate(p1);

p3 = m.allocate(2);

[works!] p4 = m.allocate(3);

B

O bloco apontado por p3 n ˜ao mais ´e alocado no comec¸o

B

Um bloco de tamanho 4 est ´a dispon´ıvel para o armazenamento apontado por p4.

(19)

Tr ˆes principais aspectos do gerenciamento da heap

B

Placement: dentre v ´arios blocos livres, em qual realizar o armazenamento I First fit, best fit, ...

B

Splitting: quando e como separar grandes blocos livres de mem ´oria I pode ser melhor n ˜ao gerar blocos livres de tamanhos “incomuns” durante o

armazenamento

B

Coalescing: quando e como recombinar blocos de mem ´oria

I em casos com frequente armazenamento de pequenos blocos pode ser melhor n ˜ao recombinar blocos adjacentes, ou faz ˆe-lo s ´o quando necess ´ario

(20)

Erros devido ao mau uso de mem ´ oria

B

O gerenciamento manual de mem ´oria pode levar a erros

B

Um erro comum ´e n ˜ao remover blocos de mem ´oria armazenados I Vazamentos de mem ´oria (Memory leaks)

I Pode levar a um consumo excessivo de mem ´oria

B

Um erro ainda mais perigoso ´e o de manter refer ˆencias a blocos de mem ´oria que foram removidos

I Ponteiros cegos (Dangling pointers) I Pode levar a comportamentos inesperados

(21)

Exemplo de vazamento de mem ´ oria

void l e a k ( )

{

i n t* i = (i n t* ) m a l l o c (s i z e o f(i n t) ) ;

* i = 3 ;

p r i n t f ( ”%d

\

n ” , * i ) ;

}

i n t main ( )

{

l e a k ( ) ;

}

(22)

Exemplo de ponteiro cego

void d a n g l i n g ( )

{

i n t* i = (i n t* ) m a l l o c (s i z e o f(i n t) ) ; i n t* j ;

* i = 3 ; f r e e ( i ) ;

j = (i n t* ) m a l l o c (s i z e o f(i n t ) ) ;

* j = 8 ;

p r i n t f ( ”%d

\

n ” , * i ) ;

}

i n t main ( )

{

d a n g l i n g ( ) ;

}

(23)

Valgrind for fun and profit

B

Pode detectar vazamentos de mem ´oria

$ valgrind ./11-mem-leak ...

==70445== LEAK SUMMARY:

==70445== definitely lost: 4 bytes in 1 blocks

==70445== indirectly lost: 0 bytes in 0 blocks

==70445== possibly lost: 0 bytes in 0 blocks

==70445== still reachable: 0 bytes in 0 blocks

==70445== suppressed: 0 bytes in 0 blocks

B

Pode detectar acessos inv ´alidos de mem ´oria

$ valgrind ./11-mem-dangling ...

==71000== Invalid read of size 4

==71000== at 0x1091D5: dangling (in /home/hbarbosa/teaching/lp/codes/11-mem-dangling)

==71000== by 0x1091FE: main (in /home/hbarbosa/teaching/lp/codes/11-mem-dangling)

==71000== Address 0x4a5a040 is 0 bytes inside a block of size 4 free’d

==71000== at 0x483CA3F: free (in /usr/lib/x86˙64-linux-gnu/valgrind/vgpreload˙memcheck-amd64- linux.so)

==71000== by 0x1091B8: dangling (in /home/hbarbosa/teaching/lp/codes/11-mem-dangling)

==71000== by 0x1091FE: main (in /home/hbarbosa/teaching/lp/codes/11-mem-dangling)

==71000== Block was alloc’d at

==71000== at 0x483B7F3: malloc (in /usr/lib/x86˙64-linux-gnu/valgrind/vgpreload˙memcheck-amd64- linux.so)

==71000== by 0x10919E: dangling (in /home/hbarbosa/teaching/lp/codes/11-mem-dangling)

==71000== by 0x1091FE: main (in /home/hbarbosa/teaching/lp/codes/11-mem-dangling)

(24)

Coleta de lixo (Garbage collection)

B

Mau uso de mem ´oria pode ser evitado com abordagens autom ´aticas de remoc¸ ˜ao de blocos armazenados na heap

B

Essas abordagens s ˜ao conhecidas como coleta de lixo I Remoc¸ ˜ao de blocos que n ˜ao s ˜ao mais utilizados (lixo)

B

Geralmente requer determinar quais blocos da mem ´oria s ˜ao relevantes:

I Dadas um conjunto inicial de interesse, adicionar todas as posic¸ ˜oes de mem ´oria alcanc¸ ´aveis a partir daquele conjunto e as adicionar ao conjunto

I Repetir at ´e um ponto fixo

B

Diferentes abordagens com vantagens e desvantagens

(25)

Exemplos de coleta de lixo: mark and sweep

B

Marcac¸ ˜ao: marcar todos os blocos de mem ´oria relevantes

B

Varredura: remoc¸ ˜ao de todos os blocos armazenados que n ˜ao s ˜ao relevantes

N ˜ao ´e necess ´ario mover blocos armazenados relevantes



N ˜ao afeta fragmentac¸ ˜ao da heap



Requer uma extensa an ´alise da mem ´oria armazenada

(26)

Exemplos de coleta de lixo: copying collector

B

Heap ´e dividida em duas partes, com uma parte usada de cada vez

B

Quando a parte usada enche, copia-seapenasos blocos relevantes para a outra parte e remove a primeira.

Elimina fragmentac¸ ˜ao



Requer copiar todos os blocos relevantes



Requer uma extensa an ´alise da mem ´oria armazenada

(27)

Exemplos de coleta de lixo: reference counting

B

Todo bloco armazenado ´e associado a um contador

B

Contador incrementado (resp. decrementado) quando refer ˆencia ao bloco ´e copiada (resp. descartada)

B

Quando o contador atinge zero, o bloco ´e removido

N ˜ao ´e preciso analisar a mem ´oria para determinar blocos relevantes

Custo da coleta ´e incremental, sem uma grande pausa



Manutenc¸ ˜ao dos contadores adiciona custo extra a operac¸ ˜oes



Contagem errada pode levar a ponteiros cegos e vazamentos de mem ´oria

Referências

Documentos relacionados

Os testes de desequilíbrio de resistência DC dentro de um par e de desequilíbrio de resistência DC entre pares se tornarão uma preocupação ainda maior à medida que mais

obediência, em grego hypakoe , e cinco vezes o verbo obedecer. A palavra é formada da palavra akoe , que significa audição, escuta, atenção, como em latim oboedire, obedecer,

A atividade escolhida, teve o principal objetivo observar o desenvolvimento do Pensamento Algébrico no quinto ano do Ensino Fundamental e além disso, fez com que a professora da

Além de serem produzidos para o consumo das famílias dos agricultores, os produtos coloniais são também consumidos em uma série de eventos realizados na região, tais como

Entre em contato com o administrador da rede para obter o endereço IP e o nome do host de cada host no qual planeja instalar o software do agente de host para gerenciar subsistemas

(É atividade opcional para o estagiário, desde que haja concordância nesta decisão do seu supervisor direto). f) Pesquisa na área de psicologia – O estagiário poderá

Para poderem obter proteção para a Bordetella bronchiseptica, os cães não vacinados devem receber uma dose, no mínimo, 72 horas antes do período previsível de risco (ver também

Como todos os medicamentos, este medicamento pode causar efeitos secundários, embora estes não se manifestem em todas as pessoas. Efeitos