1 / 114

Dynamic Memory Allocation

Dynamic Memory Allocation. Outline. Implementation of a simple allocator Explicit Free List Segregated Free List Suggested reading: 10.9, 10.10, 10.11, 10.12, 10.13. Segregate: 隔离. Dynamic Memory Allocation P731. Explicit vs. Implicit Memory Allocator

auryon
Download Presentation

Dynamic Memory Allocation

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Dynamic Memory Allocation

  2. Outline • Implementation of a simple allocator • Explicit Free List • Segregated Free List • Suggested reading: 10.9, 10.10, 10.11, 10.12, 10.13 Segregate:隔离

  3. Dynamic Memory Allocation P731 • Explicit vs. Implicit Memory Allocator • Explicit: application allocates and frees space • E.g., malloc and free in C • Implicit: application allocates, but does not free space • E.g. garbage collection in Java, ML or Lisp

  4. Dynamic Memory Allocation • Allocation • In both cases the memory allocator provides an abstraction of memory as a set of blocks • Doles out free memory blocks to application Doles: 发放

  5. 10.9.1 The malloc and free Functions

  6. Malloc package P731 • #include <stdlib.h> • void *malloc(size_t size) • if successful: • returns a pointer to a memory block of at least size bytes, aligned to 8-byte boundary. • if size==0, returns NULL • if unsuccessful: returns NULL • void free(void *p) • returns the block pointed at by p to pool of available memory • p must come from a previous call to malloc,calloc or realloc.

  7. sbrk() Function P732 • #include <unistd.h> • void *sbrk(int incr) • If successful • It returns the old value of brk • If unsuccessful • It returns –1 • It sets errno to ENOMEM • If incr is zero • It returns the current value • incr can be a negative number

  8. Free word Allocated block (4 words) Free block (3 words) Allocated word Assumptions • Assumptions made in this lecture • memory is word addressed (each word can hold a pointer)

  9. p1 = malloc(4) p2 = malloc(5) p3 = malloc(6) free(p2) p4 = malloc(2) Allocation examples Figure 10.36 P733

  10. 10.9.2 Why Dynamic Memory Allocation

  11. Why Dynamic Memory Allocation P734 1 #include "csapp.h" 2 #define MAXN 15213 3 4 int array[MAXN]; 5 6 int main() 7 { 8 int i, n; 9 10 scanf("%d", &n); 11 if (n > MAXN) 12 app_error("Input file too big"); 13 for (i = 0; i < n; i++) 14 scanf("%d", &array[i]); 15 exit(0); 16 }

  12. Why Dynamic Memory Allocation P734 1 #include "csapp.h" 2 3 int main() 4 { 5 int *array, i, n; 6 7 scanf("%d", &n); 8 array = (int *)Malloc(n * sizeof(int)); 9 for (i = 0; i < n; i++) 10 scanf("%d", &array[i]); 11 exit(0); 12 }

  13. 10.9.3 Allocator Requirements and Goals

  14. Constraints • Applications: • Can issue arbitrary sequence of allocation and free requests • Free requests must correspond to an allocated block

  15. Constraints • Allocators • Can’t control number or size of allocated blocks • Must respond immediately to all allocation requests • i.e., can’t reorder or buffer requests • Must allocate blocks from free memory • i.e., can only place allocated blocks in free memory

  16. Constraints • Allocators • Must align blocks so they satisfy all alignment requirements • usually 8 byte alignment • Can only manipulate and modify free memory • Can’t move the allocated blocks once they are allocated • i.e., compaction is not allowed

  17. Goals P735 • Given some sequence of malloc and free requests: • R0, R1, ..., Rk, ... , Rn-1 • Want to maximize throughput and peak memory utilization. • These goals are often conflicting

  18. Performance goals: throughput • Number of completed requests per unit time • Example: • 5,00 malloc calls and 5,00 free calls in 1 seconds • throughput is 1,000 operations/second.

  19. Performance goals: peak memory utilization • Given some sequence of malloc and free requests: • R0, R1, ..., Rk, ... , Rn-1 • Def: aggregate payload Pk: • malloc(p) results in a block with a payload of p bytes. • After request Rk has completed, the aggregate payloadPk is the sum of currently allocated payloads. Aggregate: 合计,累计

  20. Performance goals: peak memory utilization • Given some sequence of malloc and free requests: • R0, R1, ..., Rk, ... , Rn-1 • Def: current heap size is denoted by Hk • Note that Hk is monotonically nondecreasing • Def: peak memory utilization: • After k requests, peak memory utilization is: • Uk = ( maxi<k Pi ) / Hk

  21. 10.9.4 Fragmentation Fragmentation: 分成碎片

  22. Fragmentation • Poor memory utilization caused by fragmentation • Comes in two forms: • internal fragmentation • external fragmentation

  23. block Internal fragmentation Internal fragmentation payload Internal Fragmentation • Internal fragmentation • For some block, internal fragmentation is the difference between the block size and the payload size

  24. Internal Fragmentation • Internal fragmentation • Is caused by overhead of maintaining heap data structures, padding for alignment purposes, or explicit policy decisions (e.g., not to split the block). • Depends only on the pattern of previous requests, and thus is easy to measure.

  25. p1 = malloc(4) p2 = malloc(5) p3 = malloc(6) free(p2) p4 = malloc(6) External fragmentation • Occurs when there is enough aggregate heap memory, but no single • free block is large enough

  26. External fragmentation • External fragmentation depends on • the pattern of future requests • and thus is difficult to measure

  27. 10.9.5 Implementation Issues

  28. p0 free(p0) p1 = malloc(1) Implementation issues • How do we know how much memory to free just given a pointer? • How do we keep track of the free blocks?

  29. Implementation issues • What do we do with the extra space when allocating a structure that is smaller than the free block it is placed in? • How do we pick a block to use for allocation • many might fit? • How do we reinsert freed block? Reinsert:重新插入

  30. Knowing how much to free • Standard method • keep the length of a structure in the word preceding the structure • This word is often called the header field or header • requires an extra word for every allocated structure

  31. p0 = malloc(4) p0 5 free(p0) Block size data Knowing how much to free

  32. 10.9.6 Implicit Free Lists Implicit:暗示的,绝对的

  33. Implicit list • Need to identify whether each block is free or allocated • Can use extra bit • Bit can be put in the same word as the size if block sizes are always multiples of 8 (mask out low order bit when reading size).

  34. 4 4 6 2 1 word p a = 1: allocated block a = 0: free block size: block size payload: application data (allocated blocks only) size 0 0 a payload Format of allocated and free blocks optional padding Implicit list Figure 10.37 P738 Figure 10.38 P738

  35. 10.9.7 Placing Allocated Blocks

  36. Finding a free block • 1)First fit: • Search list from beginning, choose first free block that fits • Can take linear time in total number of blocks (allocated and free) • In practice it can cause “splinters” at beginning of list p = start; while ((p < end) || \\ not passed end (*p & 1) || \\ already allocated (*p <= len) ); \\ too small

  37. Finding a free block • 2) Next fit: • Like first-fit, but search list from location of end of previous search • Research suggests that fragmentation is worse • 3) Best fit: • Search the list, choose the free block with the closest size that fits • Keeps fragments small --- usually helps fragmentation • Will typically run slower than first-fit

  38. 10.9.8 Splitting Free Blocks

  39. 4 4 6 2 p 2 4 4 4 2 Allocating in a free block • Allocating in a free block - splitting • Since allocated space might be smaller than free space, we might want to split the block Figure 10.39 P740

  40. 10.9.9 Getting Additional Heap Memory

  41. 10.9.10 Coalescing Free Blocks Coalescing:接合

  42. 4 2 4 4 2 p free(p) 2 4 4 4 2 malloc(5) Freeing a block • Simplest implementation: • Only need to clear allocated flag • But can lead to “false fragmentation” • There is enough free space, but the allocator won’t be able to find it

  43. 4 2 4 4 2 p free(p) 4 4 6 2 Coalescing • Join with next and/or previous block if they are free • Coalescing with next block • But how do we coalesce with previous block? Figure 10.40 P741

  44. 10.9.11 Coalescing with Boundary Tags

  45. Bidirectional • Boundary tags [Knuth73] • replicate size/allocated word at bottom of free blocks • Allows us to traverse the “list” backwards, but requires extra space • Important and general technique!

  46. 1 word header size 0 0 a a = 1: allocated block a = 0: free block size: block size payload: application data (allocated blocks only) payload and padding Format of allocated and free blocks size 0 0 a boundary tag (footer) 4 4 4 4 6 6 4 4 Bidirectional Figure 10.41 P742

  47. Case 1 Case 2 Case 3 Case 4 allocated allocated free free block being freed allocated free allocated free Constant time coalescing Figure 10.42 P743

  48. Constant time coalescing (case 1) m1 1 m1 1 m1 1 m1 1 n 1 n 0 n 1 n 0 m2 1 m2 1 m2 1 m2 1

  49. Constant time coalescing (case 2) m1 1 m1 1 m1 1 m1 1 n 1 n+m2 0 n 1 m2 0 m2 0 n+m2 0

  50. Constant time coalescing (case 3) m1 0 n+m1 0 m1 0 n 1 n 1 n+m1 0 m2 1 m2 1 m2 1 m2 1

More Related