410 likes | 524 Views
It is a 800-pages topic, but here we want to do it in one/two class!. Memory Management (Ch 14). Dynamic memory allocation Language systems provide an important hidden player: Runtime memory manager Activation records Objects Explicit allocations: new , malloc , etc.
E N D
It is a 800-pages topic, but here we want to do it in one/two class! Memory Management (Ch 14) • Dynamic memory allocation Language systems provide an important hidden player: Runtime memory manager • Activation records • Objects • Explicit allocations: new, malloc, etc. • Implicit allocations: strings, file buffers, arrays with dynamically varying size, etc. IT 327
Memory Model Yes! It’s OS’s job!! • For now, assume that the OS grants each running program one or more fixed-size regions of memory for dynamic allocation • We will model these regions as an array • Our textbook shows an examples of memory management code in Java IT 327
Stacks Of Activation Records A simple memory management problem • Activation records must be allocated dynamically • Allocate on call and de-allocate on return • Stack of activation records: push and pop IT 327
A Stack Illustration An empty stack of 8 words. reg. grow IT 327
Some program P needs 3 words The manager program calls m.push(3). P gets this pointer IT 327
Some other program Q needs 2 words The manager program calls m.push(2). P gets this pointer Q gets this pointer wasted IT 327
Heap • Stack is easy to do, but Allocations and deallocations may come in any order? • A heapis a pool of blocks of memory At the beginning there is only one block (but not always the case) There are many approaches for doing this… IT 327
How to deal blocks to the requests? A pool of free blocks are linked, initially containing one big free block, then fragmented into small blocks The easiest approach: First Fitfor request • Search the free list for first adequate block • If there is extra space in the block, return the unused portion to front of the free list • Allocate requested portion (at the lower end) To free a block, just add to the front of the free list IT 327
Heap implementation in an array Pointer to next block, -1 means no next block. Size of this block IT 327
Some program P requests 4 words Size of this free block P gets this pointer Size of this block for P IT 327
Some program Q requests 2 words Q gets this pointer Size of this block IT 327
P is done IT 327
Some program R requests 1 word R gets this pointer IT 327
top A Problem p2 p2 • Consider this sequence: • The manager needs to coalesce adjacent free blocks. p1=m.allocate(4); p2=m.allocate(4); m.deallocate(p1); m.deallocate(p2); p3=m.allocate(7); top top p1 p1 top How? IT 327
Improvement strategy • Quick lists, a separate list, same sized blocks • Delayed coalescing Keep separate free lists for popular (small) block sizes IT 327
Another problem: Fragmentation p1=m.allocate(4);p2=m.allocate(1);m.deallocate(p1);p3=m.allocate(5); The final allocation will fail because of fragmentation. DeFragmentation IT 327
Heap Mechanisms (to manage heaps.) Many variety and different refinements • Three major issues: • Placement—where to allocate a block • Splitting—when and how to split large blocks • Coalescing—when and how to recombine IT 327
Placement: Where to allocate a block • (FF) First Fit from a stack (FIFO) of free list • (BF) Best Fit … • (NF) Next Fit … Some mechanisms use a more scalable data structure like a Balanced Binary Tree IT 327
Splitting: When and how to split large blocks • Split to requested size • Sometimes, less splitting gives better results e.g., allocate more than requested or rounding up allocation size to somemultiple, for example 2n IT 327
Coalescing: When and how to recombine adjacent free blocks • Several varieties: • No coalescing • Eager coalescing • Delayed coalescing IT 327
Current Heap Links • Some systems track current heap links • A current heap link is a memory address (location in the heap) where the running program may use a b What if a = new X(i); b = new X(j); a = b; IT 327
Tracing Current Heap Links 2 IntList a = new IntList(null);int b = 2;int c = 1;a = a.cons(b);a = a.cons(c); 1 3 Where are the current heap links in this picture? 1 2 3 IT 327
To Find Current Heap Links • Start with the root set: memory locations outside of the heap with links into the heap We have to check: • Active activation records (if on the stack) • Static variables, etc. • For each memory location in the set, look at the allocated block it points to, and add all the memory locations in that block • Repeat until no new locations are found {a b c } They are not in the active activation record. IT 327
Possible Errors In Current Heap Links Heap 1. Exclusion errors: a memory location that actually is a current heap link is left out. (This type of error is not allowed) Current heap links Static variables p, r, a Current Activation Record IT 327
Possible Errors In Current Heap Links Heap 2. Unused inclusion errors: a memory location is included, but the program never actually uses the value stored there Current heap links Static variables s, p, r, a, c, d How do I know this is the case? Current Activation Record IT 327
Possible Errors In Current Heap Links Heap 3. Used inclusion errors (mistaken): a memory location is included, but the program uses the value stored there as something other than a heap address (e.g. int) Current heap links Static variables s, p, r, a, c, y, z How do I know this is the case? Current Activation Record IT 327
Errors Are Unavoidable • For heap manager purposes, exclusion errors are unacceptable Therefore, we must include a location if it might be used as a heap link, and • This makes unused inclusionerrors unavoidable • Depending on the language, used inclusions errors (mistaken) may also be unavoidable IT 327
An application for current heap links:Heap Compaction/Defragmentation P P • Manager can re-allocate blocks: • Copy the block to a new location • Update all links to (or into) that block • So it can compact the heap, moving all allocated blocks to one end, leaving one big free block and no fragmentation S Q R Q T R S T IT 327
There are so many errors caused by improper de-allocation (e.g., Bad or without class destructors in C/C++) • It is a burden on the programmer … Therefore, let the language system do the job automatically --- Garbage Collection IT 327
Garbage Collection • Mark and sweep • Copying • Reference counting Three Major Approaches IT 327
Mark And Sweep uses current heap links in a two-stage process: • Mark: find the live heap links and mark all the heap blocks pointed by them • Sweep: make a pass over the heap and return unmarked blocks to the free pool - both kinds of inclusion errors are tolerated, - blocks are not moved, fragmentation may remain IT 327
Mark And Sweep blocks are not moved / fragmentations may remain Mark: live heap links (in red) P P Free blocks Free blocks R R S S Sweep: return unmarked blocks to the free pool T T IT 327
Copying Collection • divide memory in half, and uses only one half at a time • When one half becomes full, find live heap links, and copy live blocks to the other half • Fragmentation is eliminated • Moves blocks Cannot tolerate used inclusion errors. Why? Because that used variable will be mistaken as a link and hence modified IT 327
Moves blocks: cannot tolerate used inclusion errors (mistake) X=100 P X=700 P S Copying Collection Q R Q T R S T IT 327
Reference Counting • Each block has a counter of heap links to it • Incremented when a heap link is copied, decremented when a heap link is discarded • When counter goes to zero, block is garbage and can be freed • Does not use current heap links IT 327
Reference Counting IT 327
Garbage cycles can’t be identified Reference Counting Problem Reference counters are not zero But all blocks are garbage. IT 327
Reference Counting • Problem 1: cycles of garbage • Problem 2: overhead of updating reference counters is high • One advantage: more uniform. I.e., cost is incremental, no big pause while collecting IT 327
Garbage Collecting Refinements • Generational collectors • Divide block into generations according to age • Garbage collect in younger generations more often (using previous methods) • Incremental collectors • Collect garbage a little at a time • Avoid the uneven performance like mark-and-sweep and copying collectors IT 327
Languages with Garbage Collectors • Required: Java, ML • encouraged: Ada • difficult to have: C, C++ • But not impossible, even for C and C++ • There are libraries that replace the usual malloc/free with a garbage-collecting manager IT 327
Conclusion • Memory management is an important hidden player in language systems • Performance and reliability are critical • Different techniques are difficult to compare, since every run of every program makes different memory demands • Still an active area of language systems research and experimentation IT 327