Docsity
Docsity

Prepare for your exams
Prepare for your exams

Study with the several resources on Docsity


Earn points to download
Earn points to download

Earn points by helping other students or get them with a premium plan


Guidelines and tips
Guidelines and tips

Dynamic Memory Allocation - Class Notes | Programming Languages | CS 550, Study notes of Programming Languages

Material Type: Notes; Professor: Johnson; Class: Programming Languages; Subject: Computer Science; University: Drexel University; Term: Spring 2008;

Typology: Study notes

Pre 2010

Uploaded on 08/18/2009

koofers-user-qiw
koofers-user-qiw 🇺🇸

10 documents

1 / 137

Toggle sidebar

Related documents


Partial preview of the text

Download Dynamic Memory Allocation - Class Notes | Programming Languages | CS 550 and more Study notes Programming Languages in PDF only on Docsity! Dynamic Memory Allocation Agenda • Process Layout • Memory Allocation Algorithms • Garbage Collection Algorithms Reference: Ch. 5.7 and 8.5 Process Layout lower addresses higher addresses executable code (text) static data (e.g. globals) heap stack valid addresses valid addresses rigid rigid changed with sbrk() changed by calling and returning from functions sbrk() • #include <unistd.h> • Prototype: void *sbrk(ptrdiff_t increment); • Increases or decreases the address of the bottom of the heap • Returns the previous address • sbrk(0) can be used to obtain the current address • Implementation of sbrk() is operating system dependent Example • Compiled on tux using gcc, this program produces the following output: 0x00020908 0x00022908 #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { printf("0x%08p\n",sbrk(0)); malloc(1024); printf("0x%08p\n",sbrk(0)); return 0; } What happened… executable code (text) static data (e.g. globals) • Initially, the heap ended at 0x00020908 • Then I said that I needed an additional 1k • So malloc() increased the heap size by 8k 0x00020908 0x00022908 stack Agenda • Process Layout • Memory Allocation Algorithms – Fixed Size – Variable Size • First-Fit • Next-Fit • Best-Fit • The Buddy Algorithm • Garbage Collection Algorithms Fixed Size Algorithm • Maintain a list of free blocks (the free-list) • To allocate a block, pop one off the front of the list • To free a block, push it back onto the front of the list Fixed Size Algorithm Give each of the blocks a four-byte header Fixed Size Algorithm Use these headers as next-pointers, and arrange the blocks into a linked list front Fixed Size Algorithm To allocate a block, pop one off the front of the list, e.g. p1 = alloc(); p2 = alloc(); p3 = alloc(); front Fixed Size Algorithm To allocate a block, pop one off the front of the list, e.g. p1 = alloc(); p2 = alloc(); p3 = alloc(); p1 p2 p3 front Fixed Size Algorithm To free a block, push it back onto the front of the list, e.g. free(p1); free(p3); free(p2); p1 p2 p3 front Fixed Size Algorithm To free a block, push it back onto the front of the list, e.g. free(p1); free(p3); free(p2); p1 p2 p3 front Fixed Size Algorithm front Note that the list is not usually kept sorted by address Agenda • Process Layout • Memory Allocation Algorithms – Fixed Size – Variable Size • First-Fit • Next-Fit • Best-Fit • The Buddy Algorithm • Garbage Collection Algorithms Variable Size Algorithms* • Maintain a list of free blocks (the free-list) • To allocate a block, find a block of sufficient size and remove it from the list • To free a block, insert it into the list, keeping the list sorted by address * The Buddy Algorithm does not adhere to this overall scheme. Variable Size Algorithms • Adjacent free blocks must be coalesced ne xt fr ee b lo ck un us ed 4k un us ed ne xt fr ee b lo ck 8k 12 k un us ed ne xt fr ee b lo ck Finding a block of sufficient size • At least three approaches – First-Fit • Find the first block in the list of sufficient size – Next-Fit – Best-Fit Variable Size: First-Fit Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); p6 = alloc(1k); free(p1); free(p3); free(p5); p7 = alloc(3k); free(p6); p8 = alloc(1k); p9 = alloc(6k); 16k front Variable Size: First-Fit Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); p6 = alloc(1k); free(p1); 8k front free(p3); free(p5); p7 = alloc(3k); free(p6); p8 = alloc(1k); p9 = alloc(6k); 2k p1 1k p3 5k p2 Variable Size: First-Fit Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); p6 = alloc(1k); free(p1); 7k front free(p3); free(p5); p7 = alloc(3k); free(p6); p8 = alloc(1k); p9 = alloc(6k); 2k p1 1k p4 5k p2 1k p3 Variable Size: First-Fit Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); p6 = alloc(1k); free(p1); 3k front free(p3); free(p5); p7 = alloc(3k); free(p6); p8 = alloc(1k); p9 = alloc(6k); 2k p1 1k p5 5k p2 1k p3 4k p4 Variable Size: First-Fit Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); p6 = alloc(1k); free(p1); 2k front free(p3); free(p5); p7 = alloc(3k); free(p6); p8 = alloc(1k); p9 = alloc(6k); 2k p1 1k p6 5k p2 1k p3 4k p4 1k p5 Variable Size: First-Fit Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); p6 = alloc(1k); free(p1); 2k front free(p3); free(p5); p7 = alloc(3k); free(p6); p8 = alloc(1k); p9 = alloc(6k); 2k p1 1k p6 5k p2 1k 4k p4 1k p5p3 Variable Size: First-Fit Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); p6 = alloc(1k); free(p1); 2k front free(p3); free(p5); p7 = alloc(3k); free(p6); p8 = alloc(1k); p9 = alloc(6k); 2k p1 1k p6 2k p2 1k p3 4k p4 1k p5p7 3k Variable Size: First-Fit Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); p6 = alloc(1k); free(p1); 1k front free(p3); free(p5); p7 = alloc(3k); free(p6); p8 = alloc(1k); p9 = alloc(6k); 1k 1k p6 2k p2 1k p3 p4p7 3k p1 p8 1k p5 p9 6k Finding a block of sufficient size • At least three approaches – First-Fit – Next-Fit • There is an additional pointer into the free-list called the roving pointer • The search starts at the block pointed to by the roving pointer • Once a block is found, the roving pointer is pointed to the next block in the free-list – Best-Fit Variable Size: Next-Fit Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); p6 = alloc(1k); free(p1); free(p3); free(p5); p7 = alloc(3k); free(p6); p8 = alloc(1k); p9 = alloc(6k); 16k front rp Variable Size: Next-Fit Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); p6 = alloc(1k); free(p1); 8k free(p3); free(p5); p7 = alloc(3k); free(p6); p8 = alloc(1k); p9 = alloc(6k); 2k p1 1k p3 5k p2 front rp Variable Size: Next-Fit Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); p6 = alloc(1k); free(p1); 7k free(p3); free(p5); p7 = alloc(3k); free(p6); p8 = alloc(1k); p9 = alloc(6k); 2k p1 1k p4 5k p2 1k p3 front rp Variable Size: Next-Fit Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); p6 = alloc(1k); free(p1); 3k free(p3); free(p5); p7 = alloc(3k); free(p6); p8 = alloc(1k); p9 = alloc(6k); 2k p1 1k p5 5k p2 1k p3 4k p4 front rp Variable Size: Next-Fit Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); p6 = alloc(1k); free(p1); 2k front free(p3); free(p5); p7 = alloc(3k); free(p6); p8 = alloc(1k); p9 = alloc(6k); 2k p1 1k p6 5k p2 1k p3 4k p4 1k p5 rp Variable Size: Next-Fit Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); p6 = alloc(1k); free(p1); 2k front free(p3); free(p5); p7 = alloc(3k); free(p6); p8 = alloc(1k); p9 = alloc(6k); 2k p1 1k p6 5k p2 1k 4k p4 1k p5p3 rp Variable Size: Next-Fit Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); p6 = alloc(1k); free(p1); 2k front free(p3); free(p5); p7 = alloc(3k); free(p6); p8 = alloc(1k); p9 = alloc(6k); 2k p1 1k p6 2k p2 1k p3 4k p4 1k p5p7 3k rp Variable Size: Next-Fit Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); p6 = alloc(1k); free(p1); 1k front free(p3); free(p5); p7 = alloc(3k); free(p6); p8 = alloc(1k); p9 = alloc(6k); 2k p1 1k p6 1k p2 1k p3 p4p7 3k rp 1k p8 p5 p9 6k Finding a block of sufficient size • At least three approaches – First-Fit – Next-Fit – Best-Fit • Find the smallest block in the list of sufficient size Variable Size: Best-Fit Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); p6 = alloc(1k); free(p1); free(p3); free(p5); p7 = alloc(3k); free(p6); p8 = alloc(1k); p9 = alloc(6k); 16k front Variable Size: Best-Fit Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); p6 = alloc(1k); free(p1); 8k front free(p3); free(p5); p7 = alloc(3k); free(p6); p8 = alloc(1k); p9 = alloc(6k); 2k p1 1k p3 5k p2 Variable Size: Best-Fit Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); p6 = alloc(1k); free(p1); 7k front free(p3); free(p5); p7 = alloc(3k); free(p6); p8 = alloc(1k); p9 = alloc(6k); 2k p1 1k p4 5k p2 1k p3 Variable Size: Best-Fit Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); p6 = alloc(1k); free(p1); 3k front free(p3); free(p5); p7 = alloc(3k); free(p6); p8 = alloc(1k); p9 = alloc(6k); 2k p1 1k p5 5k p2 1k p3 4k p4 Variable Size: Best-Fit Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); p6 = alloc(1k); free(p1); 2k front free(p3); free(p5); p7 = alloc(3k); free(p6); p8 = alloc(1k); p9 = alloc(6k); 2k p1 1k p6 5k p2 1k p3 4k p4 1k p5 Variable Size: Best-Fit Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); p6 = alloc(1k); free(p1); 2k front free(p3); free(p5); p7 = alloc(3k); free(p6); p8 = alloc(1k); p9 = alloc(6k); 2k p1 1k p6 5k p2 1k 4k p4 1k p5p3 Variable Size: Best-Fit Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); p6 = alloc(1k); free(p1); 2k front free(p3); free(p5); p7 = alloc(3k); free(p6); p8 = alloc(1k); p9 = alloc(6k); 2k p1 1k p6 5k p2 1k 1k p4 1k p5p3 3k Variable Size: Best-Fit Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); p6 = alloc(1k); free(p1); 4k free(p3); free(p5); p7 = alloc(3k); free(p6); p8 = alloc(1k); p9 = alloc(6k); FAIL! 1k p6 5k p2 1k p4 p5p3 3k front 1k p1 p8 1k Summary of the three approaches • First-Fit – Bad if you get a cluster of small blocks at the front of the free-list • Best-Fit – Visits every free block during an allocation – Tends to leave a lot of small blocks in the free-list • Next-Fit – Generally considered the best of the three Agenda • Process Layout • Memory Allocation Algorithms – Fixed Size – Variable Size • First-Fit • Next-Fit • Best-Fit • The Buddy Algorithm • Garbage Collection Algorithms The Buddy Algorithm • There is one free-list for each size of block – The lists are doubly-linked – The lists are not kept sorted by address The Buddy Algorithm • To allocated a block of size n – Determine the smallest integer k such that 2k ≥ n – Find a block of size 2k, and remove the block from its free-list – If there are no blocks of size 2k • Find the next larger block, and remove it from its free-list • Divide the block into two buddies • Keep one and insert the other into the appropriate free-list • Continue in this manner until you have a block of size 2k The Buddy Algorithm • To deallocate a block of size 2k – Check the block’s buddy – If they are both free, coalesce them into one block of size 2k+1 – Continue in this manner until you cannot coalesce any more blocks – Insert the block that you are left with into the appropriate free-list The Buddy Algorithm Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); free(p2); free(p4); free(p3); p6 = alloc(3k); p7 = alloc(3k); free(p5); free(p6); free(p1); free(p7); 8k 16k: 8k: 4k: 2k: 1k: 4k 2k2k p1 The Buddy Algorithm Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); free(p2); free(p4); free(p3); p6 = alloc(3k); p7 = alloc(3k); free(p5); free(p6); free(p1); free(p7); 8k 16k: 8k: 4k: 2k: 1k: 4k 1k 1k 2k p1 p2 The Buddy Algorithm Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); free(p2); free(p4); free(p3); p6 = alloc(3k); p7 = alloc(3k); free(p5); free(p6); free(p1); free(p7); 5k 16k: 8k: 4k: 2k: 1k: 4k 1k1k 2k 3k p1 p2 p3 The Buddy Algorithm Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); free(p2); free(p4); free(p3); p6 = alloc(3k); p7 = alloc(3k); free(p5); free(p6); free(p1); free(p7); 5k 16k: 8k: 4k: 2k: 1k: 4k 1k1k 2k 3k p1 p3 p4 p5 The Buddy Algorithm Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); free(p2); free(p4); free(p3); p6 = alloc(3k); p7 = alloc(3k); free(p5); free(p6); free(p1); free(p7); 5k 16k: 8k: 4k: 2k: 1k: 4k 2k 3k 2k p1 p3 p5 Coalesced The Buddy Algorithm Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); free(p2); free(p4); free(p3); p6 = alloc(3k); p7 = alloc(3k); free(p5); free(p6); free(p1); free(p7); 8k 16k: 8k: 4k: 2k: 1k: 4k 2k 2k p1 p5 The Buddy Algorithm Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); free(p2); free(p4); free(p3); p6 = alloc(3k); p7 = alloc(3k); free(p5); free(p6); free(p1); free(p7); 16k: 8k: 4k: 2k: 1k: 4k 2k 2k 3k 1k 3k 1kp1 p6 p7 The Buddy Algorithm Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); free(p2); free(p4); free(p3); p6 = alloc(3k); p7 = alloc(3k); free(p5); free(p6); free(p1); free(p7); 16k: 8k: 4k: 2k: 1k: 4k 2k 2k 4k 3k 1kp1 p7 The Buddy Algorithm Example: p1 = alloc(2k); p2 = alloc(1k); p3 = alloc(5k); p4 = alloc(1k); p5 = alloc(4k); free(p2); free(p4); free(p3); p6 = alloc(3k); p7 = alloc(3k); free(p5); free(p6); free(p1); free(p7); 16k: 8k: 4k: 2k: 1k: 4k 3k 1k 8k p7 Coalesced
Docsity logo



Copyright © 2024 Ladybird Srl - Via Leonardo da Vinci 16, 10126, Torino, Italy - VAT 10816460017 - All rights reserved