9. Layout de um Processo
9
Text
Data
Heap
BSS
Stack
Program Break
Code
Initialized static variables
Uninitialized static variables
Dynamic allocated variables
Function stack frames
11. Alocação na Heap
● Objetos com tamanho conhecido apenas em tempo de
execução
● C tem malloc e free
● C++ tem new e delete
● Go usa escape analysis e garbage collection
11
23. Alocador Simples
● Pode ser implementado em algumas centenas de LOCs
● Questões não endereçadas
○ Fragmentação
○ Devolver memória para o OS
■ Quando?
■ Como? munmap, madvise...
○ Multi-thread
○ ...
23
25. Thread-Caching Malloc (TCMalloc)
● Implementado originalmente em C pelo Google
● Serve como base para o algoritmo usado pelo Go
● Diminui lock-contention em programas multi-threaded
25
26. TCMalloc
● Cada thread tem um cache local
● Dois tipos de alocação
○ Small allocations (<= 32 kB)
○ Large allocations
26
27. TCMalloc - Small Allocations
● Atendidas pelo cache local da thread
● Tamanho é arredondado para o de uma das classes
27
malloc(965 bytes) ⇒ malloc(1024 bytes)
malloc(1023 bytes) ⇒ malloc(1024 bytes)
28. TCMalloc - Small Allocations
Class 0
Class 1
Class 2
...
Local Thread Cache
28
29. TCMalloc - Small Allocations
Class 0
Class 1
Class 2
...
Local Thread Cache
29
30. TCMalloc - Small Allocations
Class 0
Class 1
Class 2
...
Local Thread Cache
Span
Span
Span
...
Central Free List
Class 1
30
Run of contiguous pagesSpan
31. TCMalloc - Small Allocations
Class 0
Class 1
Class 2
...
Local Thread Cache
Span
Span
Span
...
Central Free List
Class 1
31
32. TCMalloc - Small Allocations
Span
Span
Span
Central Free List
Class X
Span
1 page
2 pages
...
> 255
pages
Span Span
Span Span Span
Span Span
Central Heap
32
33. TCMalloc - Small Allocations
Span
Span
Span
Central Free List
Class X
Span
1 page
2 pages
...
> 255
pages
Span Span
Span Span
Span Span
Central Heap
Span
...
33
Span
34. TCMalloc - Small Allocations
Application Local Thread Cache
Central Free List
Central Heap
4 bytes
N 8-byte
objects
X pages
OS
Y*X pages
34
X pages
N 8-byte
objects
Y*X pages
35. TCMalloc - Large Allocations
● Atendidas pela Heap central
● Tamanho é arredondado para numero de paginas
35
malloc(34 kB) ⇒ malloc(36 kB) ⇒ 9 pages
malloc(33 kB) ⇒ malloc(36 kB) ⇒ 9 pages
50. Go’s Allocator
● Acoplado ao GC e outras partes do runtime
○ Difícil de trocar por outras implementações
● Três tipos de alocação
○ Tiny Allocations (no pointers, size < 16 bytes)
○ Small Allocations (size <= 32 kbytes)
○ Large Allocations
50
51. Go’s Allocator - Large Allocations
51
1 page
2 pages
...
> 255
pages
Span Span
Span Span Span Spanmheap
Busy
Spans Span Span Span
Antes de alocar, mheap faz o sweep do mesmo número de paginas
54. Go’s Allocator - Large Allocations
54
Depois de alocar, dependendo da quantidade de memória em
uso...
● A goroutine pode ter que trabalhar para o GC
● Stop the World
55. Go’s Allocator - Small Allocations
55
P1
mcache
Cada processador lógico (P) tem um cache local (mcache)
P2
mcache
56. Go’s Allocator - Small Allocations
56
P1
P2
mcache
mcache
Cada mcache mantem um span para cada tamanho (size class)
Span
Span
...
class 1
class 2
Span
Span
...
class 1
class 2
58. Go’s Allocator - Small Allocations
58
P1
mcache
mcache retorna o endereço de um objeto livre no span
Span
Span
...
class 1
class 2
Span
59. Go’s Allocator - Small Allocations
59
P1
mcache
mcache pede um novo span para o mcentral dessa size class
Span
Span
...
class 1
class 2
Span
60. Go’s Allocator - Small Allocations
60
P1
mcache
Cada mcentral tem duas listas, empty e nonempty spans
Span
Span
...
...
class 1
class 2
mcentral
mcentral
Span Span
Span Span
61. Go’s Allocator - Small Allocations
61
P1
mcache
Span com objetos livres vai ser entregue ao mcache
Span
...
...
class 1
class 2
mcentral
mcentral
Span
Span
Span Span
62. Go’s Allocator - Small Allocations
62
P1
mcache
mcentral vai tentar fazer sweep de spans vazios
Span
Span
...
...
class 1
class 2
mcentral
mcentral
Span Span
If there are no
nonempty spans….
63. Go’s Allocator - Small Allocations
63
Se nada funciona, mcentral vai pedir um novo span para a mheap
class 0 mcentral
Span Span
mheap
64. Go’s Allocator - Small Allocations
64
mcentral vai dar esse span para a mcache
class 0 mcentral
Span Span
mheapSpan
65. Go’s Allocator - Tiny Allocations
Alocações para objetos sem pointers menores que < 16 bytes
The main targets of tiny allocator are small strings and
standalone escaping variables. On a json benchmark the
allocator reduces number of allocations by ~12% and
reduces heap size by ~20%.
65
66. 66
Go’s Allocator - Tiny Allocations
64 bytes
Allocated Free Allocated Free
● Cada P mantem um objeto de 64-bytes que foi alocado de um
span
● Cada tiny allocation adiciona um subobjeto ao final do objeto
● O GC não sabe sobre esses subobjetos!
67. 67
Go’s Allocator - Tiny Allocations
Allocated Free
mcache
P1
● Pega um novo bloco do mcache ≃ small allocation
● Eventualmente, o GC vai coletar o bloco antigo
FreeP1
mcache
68. Garbage Collector ⇒ Concurrent mark and sweep
68
Go’s Allocator - Sweeping
1. Scan all objects
2. Mark objects that are live
3. Sweep objects that are not live
69. ● Runtime periodicamente devolve memória ao OS
● Devolve spans que foram garbage collected a mais de 5
minutos
● No Linux, usa a syscall madvise(2)
69
Go’s Allocator - Devolvendo memória ao OS
madvise(addr, size, _MADV_DONTNEED)