Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack...
Transcript of Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack...
![Page 1: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/1.jpg)
Dynamic Memory Allocation
ZhaoguoWang
![Page 2: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/2.jpg)
Why dynamic memory allocation?
Do not know the size until the program runs (at runtime). #defineMAXN15213intarray[MAXN];intmain(void){inti,n;scanf("%d",&n);if(n>MAXN)app_error("Inputfiletoobig");for(i=0;i<n;i++)scanf("%d",&array[i]);exit(0);}
![Page 3: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/3.jpg)
Why dynamic memory allocation?
Do not know the size until the program runs (at runtime). intmain(void){ int*array,i,n;
scanf("%d",&n);array=(int*)malloc(n*sizeof(int));for(i=0;i<n;i++) scanf("%d",&array[i]);exit(0);
}
![Page 4: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/4.jpg)
Dynamic allocation on heap Kernel virtual memory
Shared libraries
Runtime heap
User stack
Unused
%rsp (stack pointer)
Memory invisible to user code
brk
Read/write segment (.data, .bss)
Read-only segment (.init, .text, .rodata)
Loaded from the executable file
Question: Is it possible to dynamically allocate memory on stack?
![Page 5: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/5.jpg)
Dynamic allocation on heap Question: Is it possible to dynamically allocate memory on stack?
Answer: Yes void*alloca(size_tsize); Allocates size bytes of space in the stack frame of the caller. This temporary space is automatically freed when the function that called alloca() returns to its caller.
voidfunc(intn){array=alloca(n);
}
...
User stack
ret
array %rsp
nbytes
subq$n,%rsp
![Page 6: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/6.jpg)
Dynamic allocation on heap Question: Is it possible to dynamically allocate memory on stack?
Answer: Yes void*alloca(size_tsize); Allocates size bytes of space in the stack frame of the caller. This temporary space is automatically freed when the function that called alloca() returns to its caller.
voidfunc(intn){array=alloca(n);
}
... ret
array %rsp
nbytes
subq$n,%rsp
Not good practice!
User stack
![Page 7: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/7.jpg)
Dynamic allocation on heap Question: Is it possible to dynamically allocate memory on stack?
Answer: Yes void*alloca(size_tsize); Issue I – Can not free memory until current function returns à Blowing the stack up Issue II – Can not pass the memory out of the scope à Copy memories across different functions Issue III – Return value points to the top of the stack à buffer overflow (attack)
...
User stack
ret
array %rsp
nbytes
subq$n,%rsp
Not good practice!
![Page 8: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/8.jpg)
Dynamic allocation on heap Question: How to allocate memory on heap?
Kernel virtual memory Kernel virtual memory
Shared libraries
Runtime heap
User stack
Unused
%rsp (stack pointer)
Memory invisible to user code
brk
Read/write segment (.data, .bss)
Read-only segment (.init, .text, .rodata)
Loaded from the executable file
![Page 9: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/9.jpg)
Dynamic allocation on heap Question: How to allocate memory on heap?
OS is responsible for heap.
Process Process Process Process
Operating System
system call
Kernel virtual memory
Shared libraries
Runtime heap
User stack
Unused
%rsp (stack pointer)
Memory invisible to user code
brk
Read/write segment (.data, .bss)
Read-only segment (.init, .text, .rodata)
Loaded from the executable file
![Page 10: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/10.jpg)
Dynamic allocation on heap Question: How to allocate memory on heap?
OS is responsible for heap – System calls
void*sbrk(intptr_tsize);
Kernel virtual memory
Shared libraries
Runtime heap
User stack
Unused
%rsp (stack pointer)
Memory invisible to user code
brk
Read/write segment (.data, .bss)
Read-only segment (.init, .text, .rodata)
Loaded from the executable file
It increases the top of heap by “size” and returns a pointer to the base of new storage. The “size” can be a negative number.
sbrk
![Page 11: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/11.jpg)
Kernel virtual memory
Shared libraries
Runtime heap
User stack
Unused
%rsp (stack pointer)
Memory invisible to user code
brk
Read/write segment (.data, .bss)
Read-only segment (.init, .text, .rodata)
Loaded from the executable file
Dynamic allocation on heap Question: How to allocate memory on heap?
OS is responsible for heap – System calls
void*sbrk(intptr_tsize);
It increases the top of heap by “size” and returns a pointer to the base of new storage. The “size” can be a negative number.
p=sbrk(1024)//allocate 1KB
1KB
sbrk
![Page 12: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/12.jpg)
Kernel virtual memory
Shared libraries
Runtime heap
User stack
Unused
%rsp (stack pointer)
Memory invisible to user code
brk
Read/write segment (.data, .bss)
Read-only segment (.init, .text, .rodata)
Loaded from the executable file
Dynamic allocation on heap Question: How to allocate memory on heap?
OS is responsible for heap – System calls
void*sbrk(intptr_tsize);
It increases the top of heap by “size” and returns a pointer to the base of new storage. The “size” can be a negative number.
p=sbrk(1024)//allocate 1KB
1KB
sbrk
sbrk(-1024)//free p
![Page 13: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/13.jpg)
Dynamic allocation on heap Question: How to allocate memory on heap?
OS is responsible for heap – System calls
void*sbrk(intptr_tsize);
Issue I – can only free the memory on the top of heap
p1=sbrk(1024)//allocate 1KB p2=sbrk(2048)//allocate 4KB How to free p1?
Kernel virtual memory
Shared libraries
4KB
User stack
Unused
%rsp (stack pointer)
Memory invisible to user code
brk
Read/write segment (.data, .bss)
Read-only segment (.init, .text, .rodata)
Loaded from the executable file
sbrk
1KB
![Page 14: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/14.jpg)
Dynamic allocation on heap Question: How to allocate memory on heap?
OS is responsible for heap – System calls
void*sbrk(intptr_tsize);
Issue I – can only free the memory on the top of heap Issue II – system call has high performance cost > 10X
Kernel virtual memory
Shared libraries
Runtime heap
User stack
Unused
%rsp (stack pointer)
Memory invisible to user code
brk
Read/write segment (.data, .bss)
Read-only segment (.init, .text, .rodata)
Loaded from the executable file
sbrk
![Page 15: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/15.jpg)
Dynamic allocation on heap
Basic idea – request a large of memory region from heap once, then manage this memory region by itself. à allocator in the library
Kernel virtual memory
Shared libraries
Runtime heap
User stack
Unused
%rsp (stack pointer)
Memory invisible to user code
brk
Read/write segment (.data, .bss)
Read-only segment (.init, .text, .rodata)
Loaded from the executable file
sbrk
Question: How to effciently allocate memory on heap?
malloc /free
Memory management in the user space.
![Page 16: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/16.jpg)
Dynamic allocation on heap
Basic idea – request a large of memory region from heap once, then manage this memory region by itself. à allocator in the library
Kernel virtual memory
Shared libraries
Runtime heap
User stack
Unused
%rsp (stack pointer)
Memory invisible to user code
brk
Read/write segment (.data, .bss)
Read-only segment (.init, .text, .rodata)
Loaded from the executable file
sbrk
malloc /free Process Process Process Process
Operating System
system call /func call
User library
Question: How to effciently allocate memory on heap?
![Page 17: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/17.jpg)
Memory Allocator
Assumption in this lecture – At the beginning, the allocator requests enough
memory with sbrk
Goal – Highly utilize the acquired memory with high
throughput • high throughput – how many mallocs / frees can be done per
second • high utilization – fraction of allocated size / total heap size
![Page 18: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/18.jpg)
Memory Allocator
Assumed behavior of applications – Can issue arbitrary sequence of malloc (for arbitary
sizes)/free – The argument of free must be the return value of a
previous malloc – No double free
Requirements of allocator – Must allocate from free memory (correctness) – Once allocated, cannot be moved
![Page 19: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/19.jpg)
Questions
1. How to keep track which bytes are free and which are not?
2. Which of the free chunks to allocate? 3. free only supplies a pointer, how to know its
corresponding chunk size?
![Page 20: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/20.jpg)
Track allocated/free chunks
Keep the metadata (addr, size) in a linked list
1B payload
a1KB payload
Free chunks
1B p
next 1KB pp
null
p=malloc(1)pp=malloc(1024)
Allocated chunks p
pp
size addr
null
Free chunks
Whatisthesizeofeachlinkedlistentry?
Memorybufferonheap
address
![Page 21: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/21.jpg)
Track allocated/free chunks
Keep the metadata (addr, size) in a linked list
1B p
next 1KB pp
null
p=malloc(1)pp=malloc(1024)
Allocated chunks
size addr
null
Free chunks
Whatisthesizeofeachlinkedlistentry?>=20BCanwefurtherreducethesizeofmetadata?
1B payload
a1KB payload
Free chunks
Memorybufferonheap
p
pp
address
![Page 22: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/22.jpg)
Implicit list
Embed the metadata in the chunks (blocks) - Each block has a one-word (8 bytes) header - Block is double-word (16 bytes) alignment
à Size is multiple of 16
Payload
Padding (optional)
header (8 bytes) 0
allocated: header & 0x1 size: header & ~(0x1)
![Page 23: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/23.jpg)
Implicit list
Embed the metadata in the chunks (blocks) - Each block has a one-word (8 bytes) header - Block is double-word (16 bytes) alignment
à Size is multiple of 16
p=malloc(1024) 0x411
1KB payload p
8B padding
![Page 24: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/24.jpg)
Implicit list
Embed the metadata in the chunks (blocks) - Each block has a one-word (8 bytes) header - Block is double-word (16 bytes) alignment
à Size is multiple of 16
p=malloc(1) ??? ???
p
???
![Page 25: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/25.jpg)
Implicit list
Embed the metadata in the chunks (blocks) - Each block has a one-word (8 bytes) header - Block is double-word (16 bytes) alignment
à Size is multiple of 16
p=malloc(1) 0x11 1B payload
p
7B padding
![Page 26: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/26.jpg)
Exercises
Alignment Request Blocksize Header(hex)
8bytes malloc(5)
4bytes malloc(13)
16bytes malloc(20)
8bytes malloc(3)
![Page 27: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/27.jpg)
Exercises
Alignment Request Blocksize Header(hex)
8bytes malloc(5) 16 0x11
4bytes malloc(13) 24 0x19
16bytes malloc(20) 32 0x21
8bytes malloc(3) 16 0x11
![Page 28: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/28.jpg)
Placing allocated blocks p1=malloc(8)p2=malloc(24)p3=malloc(56)p4=malloc(8)p5=malloc(24)p6=malloc(56)
header allocated payload padding free block
heap start
address
![Page 29: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/29.jpg)
Placing allocated blocks p1=malloc(8)p2=malloc(24)p3=malloc(56)p4=malloc(8)p5=malloc(24)p6=malloc(56)free(p2)free(p4)free(p6)
header allocated payload padding free block
heap start
address
![Page 30: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/30.jpg)
Placing allocated blocks p1=malloc(8)p2=malloc(24)p3=malloc(56)p4=malloc(8)p5=malloc(24)p6=malloc(56)free(p2)free(p4)free(p6)p7=malloc(8)
header allocated payload padding free block
heap start
address
First fit – Search list from beginning, choose first free block that fits
cur
![Page 31: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/31.jpg)
Placing allocated blocks header allocated payload padding free block
heap start
address
First fit – Search list from beginning, choose first free block that fits Issue: cause “splinters/fragments” at beginning of the buffer
cur p1=malloc(8)p2=malloc(24)p3=malloc(56)p4=malloc(8)p5=malloc(24)p6=malloc(56)free(p2)free(p4)free(p6)p7=malloc(8)
![Page 32: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/32.jpg)
Placing allocated blocks header allocated payload padding free block
heap start
address
cur
Best fit – choose the free block with the closest size that fits
p1=malloc(8)p2=malloc(24)p3=malloc(56)p4=malloc(8)p5=malloc(24)p6=malloc(56)free(p2)free(p4)free(p6)p7=malloc(8)
![Page 33: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/33.jpg)
Placing allocated blocks header allocated payload padding free block
heap start
address
cur
Best fit – choose the free block with the closest size that fits
p1=malloc(8)p2=malloc(24)p3=malloc(56)p4=malloc(8)p5=malloc(24)p6=malloc(56)free(p2)free(p4)free(p6)p7=malloc(8)
![Page 34: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/34.jpg)
Placing allocated blocks header allocated payload padding free block
heap start
address
cur Best fit – Search list from beginning, choose first free block that fits
Best fit keeps fragments small, but typically run slower than first fit.
p1=malloc(8)p2=malloc(24)p3=malloc(56)p4=malloc(8)p5=malloc(24)p6=malloc(56)free(p2)free(p4)free(p6)p7=malloc(8)
![Page 35: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/35.jpg)
Placing allocated blocks header allocated payload padding free block
heap start
address
cur Next fit – like first-fit, but search list from the location where previous search left off.
p1=malloc(8)p2=malloc(24)p3=malloc(56)p4=malloc(8)p5=malloc(24)p6=malloc(56)free(p2)free(p4)free(p6)p7=malloc(8)p8=malloc(56)
![Page 36: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/36.jpg)
Placing allocated blocks header allocated payload padding free block
heap start
address cur
Next fit – like first-fit, but search list from from the location where previous search left off.
Next fit runs faster than first fit, but fragmentation is worse.
p1=malloc(8)p2=malloc(24)p3=malloc(56)p4=malloc(8)p5=malloc(24)p6=malloc(56)free(p2)free(p4)free(p6)p7=malloc(8)p8=malloc(56)
![Page 37: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/37.jpg)
Placing allocated blocks header allocated payload padding free block
heap start
address
p1=malloc(8)p2=malloc(24)p3=malloc(56)p4=malloc(8)p5=malloc(24)p6=malloc(56)free(p2)free(p4)free(p6)p7=malloc(24)p8=malloc(24)
![Page 38: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/38.jpg)
Placing allocated blocks header allocated payload padding free block
heap start
address
cur p1=malloc(8)p2=malloc(24)p3=malloc(56)p4=malloc(8)p5=malloc(24)p6=malloc(56)free(p2)free(p4)free(p6)p7=malloc(24)p8=malloc(24)
![Page 39: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/39.jpg)
Placing allocated blocks header allocated payload padding free block
heap start
address cur
p1=malloc(8)p2=malloc(24)p3=malloc(56)p4=malloc(8)p5=malloc(24)p6=malloc(56)free(p2)free(p4)free(p6)p7=malloc(24)p8=malloc(24)
![Page 40: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/40.jpg)
Splitting free block header allocated payload padding free block
heap start
address cur
24B Payload
0x21
???
???
p1=malloc(8)p2=malloc(24)p3=malloc(56)p4=malloc(8)p5=malloc(24)p6=malloc(56)free(p2)free(p4)free(p6)p7=malloc(24)p8=malloc(24)
![Page 41: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/41.jpg)
Splitting free block header allocated payload padding free block
heap start
address cur
24B Payload
0x21
24B Payload
0x20
p1=malloc(8)p2=malloc(24)p3=malloc(56)p4=malloc(8)p5=malloc(24)p6=malloc(56)free(p2)free(p4)free(p6)p7=malloc(24)p8=malloc(24)
![Page 42: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/42.jpg)
Coalescing free blocks p1=malloc(8)p2=malloc(24)p3=malloc(56)p4=malloc(8)p5=malloc(24)p6=malloc(56)free(p2)free(p4)free(p6)free(p5)
header allocated payload padding free block
heap start
address cur
![Page 43: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/43.jpg)
Coalescing free blocks p1=malloc(8)p2=malloc(24)p3=malloc(56)p4=malloc(8)p5=malloc(24)p6=malloc(56)free(p2)free(p4)free(p6)free(p5)
header allocated payload padding free block
heap start
address 24B Payload
0x20
56B Payload
0x40
cur
![Page 44: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/44.jpg)
Coalescing free blocks p1=malloc(8)p2=malloc(24)p3=malloc(56)p4=malloc(8)p5=malloc(24)p6=malloc(56)free(p2)free(p4)free(p6)free(p5)
header allocated payload padding free block
heap start
address 88B Payload
0x60
Coalescing with next block
cur
![Page 45: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/45.jpg)
Coalescing free blocks p1=malloc(8)p2=malloc(24)p3=malloc(56)p4=malloc(8)p5=malloc(24)p6=malloc(56)free(p2)free(p4)free(p6)free(p5)
header allocated payload padding free block
heap start
address 88B Payload
0x60
Coalescing with next block
cur
How to coalesce with previous block?
![Page 46: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/46.jpg)
Coalescing free blocks p1=malloc(8)p2=malloc(24)p3=malloc(56)p4=malloc(8)p5=malloc(24)p6=malloc(56)free(p2)free(p4)free(p6)free(p5)
header allocated payload padding free block
heap start
address 88B Payload
0x60
Coalescing with next block
cur
How to coalesce with previous block? -- search from start?
![Page 47: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/47.jpg)
Coalescing free blocks
Embed the metadata in the chunks (blocks) - Each block has a one-word (8 bytes) header and
(8 bytes) footer - Block is double-word (16 bytes) alignment
à Size is multiple of 16
p=malloc(1024)
0x411
1KB payload p
header
0x411 footer
Payload
Padding (optional)
header (8 bytes) 0
0
footer (8 bytes)
![Page 48: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/48.jpg)
Coalescing free blocks p1=malloc(8)p2=malloc(24)p3=malloc(56)p4=malloc(8)p5=malloc(24)p6=malloc(56)free(p2)free(p4)free(p6)free(p5)
header allocated payload / padding footer free block
heap start
cur (p5)
24B Payload
0x30
0x30 8B Padding
56B Payload
0x50
0x50 8B Padding
![Page 49: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/49.jpg)
Coalescing free blocks p1=malloc(8)p2=malloc(24)p3=malloc(56)p4=malloc(8)p5=malloc(24)p6=malloc(56)free(p2)free(p4)free(p6)free(p5)
header allocated payload / padding footer free block
heap start
cur (p5)
0x80
0x80
![Page 50: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/50.jpg)
Coalescing free blocks p1=malloc(8)p2=malloc(24)p3=malloc(56)p4=malloc(8)p5=malloc(24)p6=malloc(56)free(p2)free(p4)free(p6)free(p5)
header allocated payload / padding footer free block
heap start
cur (p4)
0x100
0x100
![Page 51: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/51.jpg)
Exercises
Alignment Request Blocksize Header(hex)
8bytes malloc(5)
4bytes malloc(13)
16bytes malloc(20)
8bytes malloc(3)
Eachblockhasbothheaderandfooter
![Page 52: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/52.jpg)
Exercises
Alignment Request Blocksize Header(hex)
8bytes malloc(5) 24 0x19
4bytes malloc(13) 32 0x19
16bytes malloc(20) 32 0x21
8bytes malloc(3) 24 0x19
Eachblockhasbothheaderandfooter
![Page 53: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/53.jpg)
Explicit free lists
Problems of implicit free list – Block allocation time is linear in the total number of
heap blocks
Basic idea – segregated list – Maintain multiple free list, each list holds blocks that
are roughly the same size
![Page 54: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/54.jpg)
Segregated list
Payload
Padding (optional)
0
Blocklayout
Next Prev
Freelists
{16} {32-48} {64–128}
Determine size class
First fit
fit?
Yes
Remove and split free block
Insert the fragment
No Search in next free list
0
![Page 55: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/55.jpg)
Segregated list Freelists Determine
size class
First fit
fit?
Yes
Remove and split free block
Insert the fragment
No Search in next free list
Do we need an allocated lists?
Payload
Padding (optional)
0
Blocklayout
Next Prev
0
{16} {32-48} {64–128}
![Page 56: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/56.jpg)
Segregated list Freelists Determine
size class
First fit
fit?
Yes
Remove and split free block
Insert the fragment
No Search in next free list
Do we need an allocated lists? No, we are able to calculate the start of the block with p passed by free()
Payload
Padding (optional)
0
Blocklayout
Next Prev
0
{16} {32-48} {64–128}
![Page 57: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/57.jpg)
Segregated list Freelists Determine
size class
First fit
fit?
Yes
Remove and split free block
Insert the fragment
No Search in next free list
Can we get rid of Next and Prev?
Payload
Padding (optional)
0
Blocklayout
Next Prev
0
{16} {32-48} {64–128}
![Page 58: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/58.jpg)
Segregated list Freelists Determine
size class
First fit
fit?
Yes
Remove and split free block
Insert the fragment
No Search in next free list
Allocated blocks do not need Next and Prev
Padding (optional)
0
Blocklayout
Next Prev
0
Can we get rid of Next and Prev?
Pay
load
s
{16} {32-48} {64–128}
Addr returned to user
![Page 59: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/59.jpg)
Segregated list Freelists Determine
size class
First fit
fit?
Yes
Remove and split free block
Insert the fragment
No Search in next free list
Padding (optional)
0
Blocklayout
Next Prev
0
With this design, what is the minimal size for a free block?
Pay
load
s
{16} {32-48} {64–128}
![Page 60: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/60.jpg)
Buddy System
Adopted by Linux kernel and jemalloc
This lecture – A simplified binary buddy allocator
![Page 61: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/61.jpg)
Binary buddy system
64K
( 0000 0000 0000 0000)2
![Page 62: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/62.jpg)
Binary buddy system
32K Buddy
Buddy 32K
( 0000 0000 0000 0000)2
( 1000 0000 0000 0000)2
Split - Split exactly in half
![Page 63: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/63.jpg)
Binary buddy system
16K Buddy
Buddy 16K
( 0000 0000 0000 0000)2
( 1000 0000 0000 0000)2
( 0100 0000 0000 0000)2
32K
Split - Split exactly in half - Each half is the buddy of the other Address - Block of size 2n begin at memory
addresses where the n least significant bits are zero
- When a block of size 2n+1 is split into two blocks of size 2n, the addresses of these two blocks will differ in exactly one bit, bit n.
If a block of size 2n begins at address addr, what is its buddy address and size?
![Page 64: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/64.jpg)
Binary buddy system
16K Buddy
Buddy 16K
( 0000 0000 0000 0000)2
( 1000 0000 0000 0000)2
( 0100 0000 0000 0000)2
32K
Split - Split exactly in half - Each half is the buddy of the other Address - Block of size 2n begin at memory
addresses where the n least significant bits are zero
- When a block of size 2n+1 is split into two blocks of size 2n, the addresses of these two blocks will differ in exactly one bit, bit n.
If a block of size 2n begins at address addr, what is its buddy address and size?
addr of buddy = addr ^ (n<<1)
![Page 65: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/65.jpg)
Binary buddy system
16K Buddy
Buddy 16K
( 0000 0000 0000 0000)2
( 1000 0000 0000 0000)2
( 0100 0000 0000 0000)2
32K
Split - Split exactly in half - Each half is the buddy of the other Address - Block of size 2n begin at memory
addresses where the n least significant bits are zero
- When a block of size 2n+1 is split into two blocks of size 2n, the addresses of these two blocks will differ in exactly one bit, bit n.
Combine - We assume only combine with its buddy
block in our lecture
![Page 66: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/66.jpg)
Buddy system
Freelists
24 25 26
Determine size class
First fit
fit?
Yes recursively
split free block in half until fit
Insert the fragment
No Search in next free list
Each list has the same size of blocks which is a power of 2.
Observation
(100)2
(110)2
![Page 67: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/67.jpg)
Buddy system
Freelists
24 25 26
Determine size class
First fit
fit?
Yes recursively
split free block in half until fit
Insert the fragment
No Search in next free list
p=malloc(1) Step 1. search in 26 list
Step 2. recursive split
(x000000)2
Each list has the same size of blocks which is a power of 2.
![Page 68: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/68.jpg)
Buddy system
Freelists
24 25 26
Determine size class
First fit
fit?
Yes recursively
split free block in half until fit
Insert the fragment
No Search in next free list
p=malloc(1) Step 1. search in 26 list
Step 2. recursive split
(x000000)2
(x100000)2
![Page 69: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/69.jpg)
Buddy system
Freelists
24 25 26
Determine size class
First fit
fit?
Yes recursively
split free block in half until fit
Insert the fragment
No Search in next free list
p=malloc(1) Step 1. search in 26 list
Step 2. recursive split
(x000000)2
(x100000)2
(x010000)2
![Page 70: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/70.jpg)
Buddy system
Freelists
24 25 26
Determine size class
First fit
fit?
Yes recursively
split free block in half until fit
Insert the fragment
No Search in next free list
p=malloc(1) Step 1. search in 26 list
Step 2. recursive split
(x000000)2
(x100000)2
(x010000)2
![Page 71: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/71.jpg)
Buddy system
Freelists
24 25 26
Determine size class
First fit
fit?
Yes recursively
split free block in half until fit
Insert the fragment
No Search in next free list
p=malloc(1) Step 1. search in 26 list
Step 2. recursive split Step 3. insert free blocks into the list Step 4. return, p is (x000000)2
(x010000)2 (x100000)2
![Page 72: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/72.jpg)
Buddy system
Freelists
24 25 26
Determine size class
First fit
fit?
Yes recursively
split free block in half until fit
Insert the fragment
No Search in next free list
p=malloc(1) free(p) (x010000)2
(x100000)2 (x010000)2
![Page 73: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/73.jpg)
Buddy system
Freelists
24 25 26
Determine size class
First fit
fit?
Yes recursively
split free block in half until fit
Insert the fragment
No Search in next free list
p=malloc(1) free(p)
(x100000)2
p’s address is (x000000)2 , size is 16B (no footer in this example) à p’s buddy is 16 B block begins at x000000 ^ (1<<4) which is (x010000)2
(x010000)2
(x010000)2
![Page 74: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/74.jpg)
Buddy system
Freelists
24 25 26
Determine size class
First fit
fit?
Yes recursively
split free block in half until fit
Insert the fragment
No Search in next free list
p=malloc(1) free(p)
(x000000)2
(x100000)2
p’s address is (x000000)2 , size is 32B (no footer in this example) à p’s buddy is 32 B block begins at x000000 ^ (1<<5) which is (x100000)2
![Page 75: Dynamic Memory Allocationzhaoguo/fa17-cso/notes/17... · Shared libraries Runtime heap User stack Unused %rsp (stack pointer) Memory invisible to user code brk Read/write segment](https://reader033.fdocuments.net/reader033/viewer/2022052103/603e15e526347621f2169fc6/html5/thumbnails/75.jpg)
Buddy system
Freelists
24 25
Determine size class
First fit
fit?
Yes recursively
split free block in half until fit
Insert the fragment
No Search in next free list
p=malloc(1) free(p)
p’s address is (x000000)2 , size is 32B à p’s next block address is p + 32B which is (x100000)2
26 (x000000)2