Chapter FourteenModern Programming Languages1 Memory Management.

Slides:



Advertisements
Similar presentations
Chapter 22 Implementing lists: linked implementations.
Advertisements

Singly linked lists Doubly linked lists
Memory Management Chapter FourteenModern Programming Languages, 2nd ed.1.
Chapter 3 – Lists A list is just what the name implies, a finite, ordered sequence of items. Order indicates each item has a position. A list of size 0.
Garbage collection David Walker CS 320. Where are we? Last time: A survey of common garbage collection techniques –Manual memory management –Reference.
Dynamic Memory Management
Introduction to Memory Management. 2 General Structure of Run-Time Memory.
Lecture 10: Heap Management CS 540 GMU Spring 2009.
Garbage Collection What is garbage and how can we deal with it?
Lecture 21 Dynamic Memory Allocation:- *Allocation of objects in program ’ s heap _e.g. C ’ s malloc/free or Pascal ’ s new/dispose _e.g. C ’ s malloc/free.
Dynamic Allocation Eric Roberts CS 106B February 4, 2013.
5. Memory Management From: Chapter 5, Modern Compiler Design, by Dick Grunt et al.
Run-time organization  Data representation  Storage organization: –stack –heap –garbage collection Programming Languages 3 © 2012 David A Watt,
Garbage Collection CSCI 2720 Spring Static vs. Dynamic Allocation Early versions of Fortran –All memory was static C –Mix of static and dynamic.
1 Optimizing Malloc and Free Professor Jennifer Rexford COS 217 Reading: Section 8.7 in K&R book
CS 326 Programming Languages, Concepts and Implementation Instructor: Mircea Nicolescu Lecture 18.
CPSC 388 – Compiler Design and Construction
CS 536 Spring Automatic Memory Management Lecture 24.
Chapter 8 Runtime Support. How program structures are implemented in a computer memory? The evolution of programming language design has led to the creation.
Memory Management. History Run-time management of dynamic memory is a necessary activity for modern programming languages Lisp of the 1960’s was one of.
Memory Allocation. Three kinds of memory Fixed memory Stack memory Heap memory.
Memory Management Memory Areas and their use Memory Manager Tasks:
Honors Compilers Addressing of Local Variables Mar 19 th, 2002.
1 Optimizing Malloc and Free Professor Jennifer Rexford
Run time vs. Compile time
The environment of the computation Declarations introduce names that denote entities. At execution-time, entities are bound to values or to locations:
Garbage collection (& Midterm Topics) David Walker COS 320.
1 Run time vs. Compile time The compiler must generate code to handle issues that arise at run time Representation of various data types Procedure linkage.
CS61C Midterm Review on C & Memory Management Fall 2006 Aaron Staley Some material taken from slides by: Michael Le Navtej Sadhal.
Chapter 3: Arrays, Linked Lists, and Recursion
Memory Allocation CS Introduction to Operating Systems.
Chapter TwelveModern Programming Languages1 Memory Locations For Variables.
Dynamic Memory Allocation Questions answered in this lecture: When is a stack appropriate? When is a heap? What are best-fit, first-fit, worst-fit, and.
Data Structures Week 5 Further Data Structures The story so far  We understand the notion of an abstract data type.  Saw some fundamental operations.
Compiler Construction
ICS 145B -- L. Bic1 Project: Main Memory Management Textbook: pages ICS 145B L. Bic.
Storage Management. The stack and the heap Dynamic storage allocation refers to allocating space for variables at run time Most modern languages support.
1 Dynamic Memory Allocation –The need –malloc/free –Memory Leaks –Dangling Pointers and Garbage Collection Today’s Material.
Chapter FourteenModern Programming Languages1 Memory Management.
CS 326 Programming Languages, Concepts and Implementation Instructor: Mircea Nicolescu Lecture 9.
RUN-Time Organization Compiler phase— Before writing a code generator, we must decide how to marshal the resources of the target machine (instructions,
11/26/2015IT 3271 Memory Management (Ch 14) n Dynamic memory allocation Language systems provide an important hidden player: Runtime memory manager – Activation.
Pointers in C Computer Organization I 1 August 2009 © McQuain, Feng & Ribbens Memory and Addresses Memory is just a sequence of byte-sized.
GARBAGE COLLECTION IN AN UNCOOPERATIVE ENVIRONMENT Hans-Juergen Boehm Computer Science Dept. Rice University, Houston Mark Wieser Xerox Corporation, Palo.
Memory Management -Memory allocation -Garbage collection.
Operating Systems ECE344 Ashvin Goel ECE University of Toronto Memory Management Overview.
LECTURE 13 Names, Scopes, and Bindings: Memory Management Schemes.
1 Recall that... char str [ 8 ]; str is the base address of the array. We say str is a pointer because its value is an address. It is a pointer constant.
1 Chapter 15-1 Pointers, Dynamic Data, and Reference Types Dale/Weems.
MORE POINTERS Plus: Memory Allocation Heap versus Stack.
Dynamic Memory Management Jennifer Rexford 1. 2 Goals of this Lecture Dynamic memory management techniques Garbage collection by the run-time system (Java)
1 Compiler Construction Run-time Environments,. 2 Run-Time Environments (Chapter 7) Continued: Access to No-local Names.
Runtime Environments Chapter 7. Support of Execution  Activation Tree  Control Stack  Scope  Binding of Names –Data object (values in storage) –Environment.
Eliminating External Fragmentation in a Non-Moving Garbage Collector for Java Author: Fridtjof Siebert, CASES 2000 Michael Sallas Object-Oriented Languages.
Memory Management What if pgm mem > main mem ?. Memory Management What if pgm mem > main mem ? Overlays – program controlled.
CSC 533: Programming Languages Spring 2016
Storage Allocation Mechanisms
Section 10: Memory Allocation Topics
CSC 533: Programming Languages Spring 2015
Dynamic Memory Allocation
Data Structures Interview / VIVA Questions and Answers
CS 153: Concepts of Compiler Design November 28 Class Meeting
Concepts of programming languages
Optimizing Malloc and Free
CS Introduction to Operating Systems
Linked Lists.
Topic 3-b Run-Time Environment
Where is all the knowledge we lost with information? T. S. Eliot
CSC 533: Programming Languages Spring 2019
SPL – PS2 C++ Memory Handling.
Presentation transcript:

Chapter FourteenModern Programming Languages1 Memory Management

Chapter FourteenModern Programming Languages2 Dynamic Memory Allocation n Lots of things need memory at runtime: – Activation records – Objects – Explicit allocations: new, malloc, etc. – Implicit allocations: strings, file buffers, arrays with dynamically varying size, etc. n Language systems provide an important hidden player: runtime memory management

Chapter FourteenModern Programming Languages3 Outline n 14.2 Memory model using Java arrays n 14.3 Stacks n 14.4 Heaps n 14.5 Current heap links n 14.5 Garbage collection

Chapter FourteenModern Programming Languages4 Memory Model n For now, assume that the OS grants each running program one or more fixed-size regions of memory for dynamic allocation n We will model these regions as Java arrays – To see examples of memory management code – And, for practice with Java

Chapter FourteenModern Programming Languages5 Declaring An Array n A Java array declaration: n Array types are reference types—an array is really an object, with a little special syntax The variable a above is initialized to null It can hold a reference to an array of int values, but does not yet int[] a = null;

Chapter FourteenModern Programming Languages6 Creating An Array Use new to create an array object: n We could have done it with one declaration statement, like this: int[] a = null; a = new int[100]; int[] a = new int[100];

Chapter FourteenModern Programming Languages7 Using An Array Use a[i] to refer to an element (as lvalue or rvalue): a is an array reference expression and i is an int expression Use a.length to access length Array indexes are 0..( a.length-1 ) int i = 0; while (i<a.length) { a[i] = 5; i++; }

Chapter FourteenModern Programming Languages8 Memory Managers In Java public class MemoryManager { private int[] memory; /** * MemoryManager constructor. initialMemory int[] of memory to manage */ public MemoryManager(int[] initialMemory) { memory = initialMemory; } … } We will show Java implementations this way. The initialMemory array is the memory region provided by the operating system.

Chapter FourteenModern Programming Languages9 Outline n 14.2 Memory model using Java arrays n 14.3 Stacks n 14.4 Heaps n 14.5 Current heap links n 14.5 Garbage collection

Chapter FourteenModern Programming Languages10 Stacks Of Activation Records n For almost all languages, activation records must be allocated dynamically n For many, it suffices to allocate on call and deallocate on return n This produces a stack of activation records: push on call, pop on return n A simple memory management problem

Chapter FourteenModern Programming Languages11 A Stack Illustration An empty stack of 8 words. The stack will grow down, from high addresses to lower addresses. A reserved memory location (perhaps a register) records the address of the lowest allocated word.

Chapter FourteenModern Programming Languages12 The program calls m.push(3), which returns 5: the address of the first of the 3 words allocated for an activation record. Memory management uses an extra word to record the previous value of top.

Chapter FourteenModern Programming Languages13 The program calls m.push(2), which returns 2: the address of the first of the 2 words allocated for an activation record. The stack is now full—there is not room even for m.push(1). For m.pop(), just do top = memory[top] to return to previous configuration.

Chapter FourteenModern Programming Languages14 A Java Stack Implementation public class StackManager { private int[] memory; // the memory we manage private int top; // index of top stack block /** * StackManager constructor. initialMemory int[] of memory to manage */ public StackManager(int[] initialMemory) { memory = initialMemory; top = memory.length; }

Chapter FourteenModern Programming Languages15 /** * Allocate a block and return its address. requestSize int size of block, > 0 block address StackOverflowError if out of stack space */ public int push(int requestSize) { int oldtop = top; top -= (requestSize+1); // extra word for oldtop if (top<0) throw new StackOverflowError(); memory[top] = oldtop; return top+1; } The throw statement and exception handling are introduced in Chapter 17.

Chapter FourteenModern Programming Languages16 /** * Pop the top stack frame. This works only if the * stack is not empty. */ public void pop() { top = memory[top]; } }

Chapter FourteenModern Programming Languages17 Outline n 14.2 Memory model using Java arrays n 14.3 Stacks n 14.4 Heaps n 14.5 Current heap links n 14.5 Garbage collection

Chapter FourteenModern Programming Languages18 The Heap Problem n Stack order makes implementation easy n Not always possible: what if allocations and deallocations can come in any order? n A heap is a pool of blocks of memory, with an interface for unordered runtime memory allocation and deallocation n There are many mechanisms for this…

Chapter FourteenModern Programming Languages19 First Fit n A linked list of free blocks, initially containing one big free block n To allocate: – Search free list for first adequate block – If there is extra space in the block, return the unused portion at the upper end to the free list – Allocate requested portion (at the lower end) n To free, just add to the front of the free list

Chapter FourteenModern Programming Languages20 Heap Illustration A heap manager m with a memory array of 10 words, initially empty. The link to the head of the free list is held in freeStart. Every block, allocated or free, has its length in its first word. Free blocks have free-list link in their second word, or –1 at the end of the free list.

Chapter FourteenModern Programming Languages21 p1=m.allocate(4); p1 will be 1—the address of the first of four allocated words. An extra word holds the block length. Remainder of the big free block was returned to the free list.

Chapter FourteenModern Programming Languages22 p1=m.allocate(4); p2=m.allocate(2); p2 will be 6—the address of the first of two allocated words. An extra word holds the block length. Remainder of the free block was returned to the free list.

Chapter FourteenModern Programming Languages23 p1=m.allocate(4); p2=m.allocate(2); m.deallocate(p1); Deallocates the first allocated block. It returns to the head of the free list.

Chapter FourteenModern Programming Languages24 p1=m.allocate(4); p2=m.allocate(2); m.deallocate(p1); p3=m.allocate(1); p3 will be 1—the address of the allocated word. Notice that there were two suitable blocks. The other one would have been an exact fit. (Best Fit is another possible mechanism.)

Chapter FourteenModern Programming Languages25 A Java Heap Implementation public class HeapManager { static private final int NULL = -1; // null link public int[] memory; // the memory we manage private int freeStart; // start of the free list /** * HeapManager constructor. initialMemory int[] of memory to manage */ public HeapManager(int[] initialMemory) { memory = initialMemory; memory[0] = memory.length; // one big free block memory[1] = NULL; // free list ends with it freeStart = 0; // free list starts with it }

Chapter FourteenModern Programming Languages26 /** * Allocate a block and return its address. requestSize int size of block, > 0 block address OutOfMemoryError if no block big enough */ public int allocate(int requestSize) { int size = requestSize + 1; // size with header // Do first-fit search: linear search of the free // list for the first block of sufficient size. int p = freeStart; // head of free list int lag = NULL; while (p!=NULL && memory[p]<size) { lag = p; // lag is previous p p = memory[p+1]; // link to next block } if (p==NULL) // no block large enough throw new OutOfMemoryError(); int nextFree = memory[p+1]; // block after p

Chapter FourteenModern Programming Languages27 // Now p is the index of a block of sufficient size, // and lag is the index of p's predecessor in the // free list, or NULL, and nextFree is the index of // p's successor in the free list, or NULL. // If the block has more space than we need, carve // out what we need from the front and return the // unused end part to the free list. int unused = memory[p]-size; // extra space if (unused>1) { // if more than a header's worth nextFree = p+size; // index of the unused piece memory[nextFree] = unused; // fill in size memory[nextFree+1] = memory[p+1]; // fill in link memory[p] = size; // reduce p's size accordingly } // Link out the block we are allocating and done. if (lag==NULL) freeStart = nextFree; else memory[lag+1] = nextFree; return p+1; // index of useable word (after header) }

Chapter FourteenModern Programming Languages28 /** * Deallocate an allocated block. This works only if * the block address is one that was returned by * allocate and has not yet been deallocated. address int address of the block */ public void deallocate(int address) { int addr = address-1; memory[addr+1] = freeStart; freeStart = addr; } }

Chapter FourteenModern Programming Languages29 A Problem n Consider this sequence: Final allocate will fail: we are breaking up large blocks but never reversing the process n Need to coalesce adjacent free blocks p1=m.allocate(4); p2=m.allocate(4); m.deallocate(p1); m.deallocate(p2); p3=m.allocate(7);

Chapter FourteenModern Programming Languages30 A Solution We can implement a smarter deallocate method: – Maintain the free list sorted in address order – When freeing, look at the previous free block and the next free block – If adjacent, coalesce n This is a lot more work than just returning the block to the head of the free list…

Chapter FourteenModern Programming Languages31 /** * Deallocate an allocated block. This works only if * the block address is one that was returned by * allocate and has not yet been deallocated. address int address of the block */ public void deallocate(int address) { int addr = address-1; // real start of the block // Find the insertion point in the sorted free list // for this block. int p = freeStart; int lag = NULL; while (p!=NULL && p<addr) { lag = p; p = memory[p+1]; }

Chapter FourteenModern Programming Languages32 // Now p is the index of the block to come after // ours in the free list, or NULL, and lag is the // index of the block to come before ours in the // free list, or NULL. // If the one to come after ours is adjacent to it, // merge it into ours and restore the property // described above. if (addr+memory[addr]==p) { memory[addr] += memory[p]; // add its size to ours p = memory[p+1]; // }

Chapter FourteenModern Programming Languages33 if (lag==NULL) { // ours will be first free freeStart = addr; memory[addr+1] = p; } else if (lag+memory[lag]==addr) { // block before is // adjacent to ours memory[lag] += memory[addr]; // merge ours into it memory[lag+1] = p; } else { // neither: just a simple insertion memory[lag+1] = addr; memory[addr+1] = p; } }

Chapter FourteenModern Programming Languages34 Quick Lists n Small blocks tend to be allocated and deallocated much more frequently n A common optimization: keep separate free lists for popular (small) block sizes n On these quick lists, blocks are one size n Delayed coalescing: free blocks on quick lists are not coalesced right away (but may have to be coalesced eventually)

Chapter FourteenModern Programming Languages35 Fragmentation n When free regions are separated by allocated blocks, so that it is not possible to allocate all of free memory as one block n More generally: any time a heap manager is unable to allocate memory even though free – If it allocated more than requested – If it does not coalesce adjacent free blocks – And so on…

Chapter FourteenModern Programming Languages36 p1=m.allocate(4); p2=m.allocate(1); m.deallocate(p1); p3=m.allocate(5); The final allocation will fail because of fragmentation.

Chapter FourteenModern Programming Languages37 Other Heap Mechanisms n An amazing variety n Three major issues: – Placement—where to allocate a block – Splitting—when and how to split large blocks – Coalescing—when and how to recombine n Many other refinements

Chapter FourteenModern Programming Languages38 Placement n Where to allocate a block n Our mechanism: first fit from FIFO free list n Some mechanisms use a similar linked list of free blocks: first fit, best fit, next fit, etc. n Some mechanisms use a more scalable data structure like a balanced binary tree

Chapter FourteenModern Programming Languages39 Splitting n When and how to split large blocks n Our mechanism: split to requested size n Sometimes you get better results with less splitting—just allocate more than requested n A common example: rounding up allocation size to some multiple

Chapter FourteenModern Programming Languages40 Coalescing n When and how to recombine adjacent free blocks n We saw several varieties: – No coalescing – Eager coalescing – Delayed coalescing (as with quick lists)

Chapter FourteenModern Programming Languages41 Outline n 14.2 Memory model using Java arrays n 14.3 Stacks n 14.4 Heaps n 14.5 Current heap links n 14.5 Garbage collection

Chapter FourteenModern Programming Languages42 Current Heap Links n So far, the running program is a black box: a source of allocations and deallocations n What does the running program do with addresses allocated to it? n Some systems track current heap links n A current heap link is a memory location where a value is stored that the running program will use as a heap address

Chapter FourteenModern Programming Languages43 Tracing Current Heap Links IntList a = new IntList(null); int b = 2; int c = 1; a = a.cons(b); a = a.cons(c); Where are the current heap links in this picture?

Chapter FourteenModern Programming Languages44 To Find Current Heap Links n Start with the root set: memory locations outside of the heap with links into the heap – Active activation records (if on the stack) – Static variables, etc. n For each memory location in the set, look at the allocated block it points to, and add all the memory locations in that block n Repeat until no new locations are found

Chapter FourteenModern Programming Languages45 Discarding Impossible Links n Depending on the language and implementation, we may be able to discard some locations from the set: – If they do not point into allocated heap blocks – If they do not point to allocated heap blocks (Java, but not C) – If their dynamic type rules out use as heap links – If their static type rules out use as heap links (Java, but not C)

Chapter FourteenModern Programming Languages46 Errors In Current Heap Links n Exclusion errors: a memory location that actually is a current heap link is left out n Unused inclusion errors: a memory location is included, but the program never actually uses the value stored there n Used inclusion errors: a memory location is included, but the program uses the value stored there as something other than a heap address—as an integer, for example

Chapter FourteenModern Programming Languages47 Errors Are Unavoidable n For heap manager purposes, exclusion errors are unacceptable n We must include a location if it might be used as a heap link n This makes unused inclusion errors unavoidable n Depending on the language, used inclusions may also be unavoidable

Chapter FourteenModern Programming Languages48 Used Inclusion Errors In C n Static type and runtime value may be of no use in telling how a value will be used Variable x may be used either as a pointer or as an array of four characters union { char *p; char tag[4]; } x;

Chapter FourteenModern Programming Languages49 Heap Compaction n One application for current heap links n Manager can move allocated blocks: – Copy the block to a new location – Update all links to (or into) that block n So it can compact the heap, moving all allocated blocks to one end, leaving one big free block and no fragmentation

Chapter FourteenModern Programming Languages50 Outline n 14.2 Memory model using Java arrays n 14.3 Stacks n 14.4 Heaps n 14.5 Current heap links n 14.5 Garbage collection

Chapter FourteenModern Programming Languages51 Some Common Pointer Errors type p: ^Integer; begin new(p); p^ := 21; dispose(p); p^ := p^ + 1 end procedure Leak; type p: ^Integer; begin new(p) end; Dangling pointer: this Pascal fragment uses a pointer after the block it points to has been deallocated Memory leak: this Pascal procedure allocates a block but forgets to deallocate it

Chapter FourteenModern Programming Languages52 Garbage Collection n Since so many errors are caused by improper deallocation… n …and since it is a burden on the programmer to have to worry about it… n …why not have the language system reclaim blocks automatically?

Chapter FourteenModern Programming Languages53 Three Major Approaches n Mark and sweep n Copying n Reference counting

Chapter FourteenModern Programming Languages54 Mark And Sweep n A mark-and-sweep collector uses current heap links in a two-stage process: – Mark: find the live heap links and mark all the heap blocks linked to by them – Sweep: make a pass over the heap and return unmarked blocks to the free pool n Blocks are not moved, so both kinds of inclusion errors are tolerated

Chapter FourteenModern Programming Languages55 Copying Collection n A copying collector divides memory in half, and uses only one half at a time n When one half becomes full, find live heap links, and copy live blocks to the other half n Compacts as it goes, so fragmentation is eliminated n Moves blocks: cannot tolerate used inclusion errors

Chapter FourteenModern Programming Languages56 Reference Counting n Each block has a counter of heap links to it n Incremented when a heap link is copied, decremented when a heap link is discarded n When counter goes to zero, block is garbage and can be freed n Does not use current heap links

Chapter FourteenModern Programming Languages57 Reference Counting Problem One problem with reference counting: it misses cycles of garbage. Here, a circularly linked list is pointed to by circle.

Chapter FourteenModern Programming Languages58 Reference Counting Problem When circle is set to null, the reference counter is decremented. No reference counter is zero, though all blocks are garbage.

Chapter FourteenModern Programming Languages59 Reference Counting n Problem with cycles of garbage n Problem with performance generally, since the overhead of updating reference counters is high n One advantage: naturally incremental, with no big pause while collecting

Chapter FourteenModern Programming Languages60 Garbage Collecting Refinements n Generational collectors – Divide block into generations according to age – Garbage collect in younger generations more often (using previous methods) n Incremental collectors – Collect garbage a little at a time – Avoid the uneven performance of ordinary mark-and-sweep and copying collectors

Chapter FourteenModern Programming Languages61 Garbage Collecting Languages n Some require it: Java, ML n Some encourage it: Ada n Some make it difficult: C, C++ – Even for C and C++ it is possible – There are libraries that replace the usual malloc / free with a garbage-collecting manager

Chapter FourteenModern Programming Languages62 Trends n An old idea whose popularity is increasing n Good implementations are within a few percent of the performance of systems with explicit deallocation n Programmers who like garbage collection feel that the development and debugging time it saves is worth the runtime it costs

Chapter FourteenModern Programming Languages63 Conclusion n Memory management is an important hidden player in language systems n Performance and reliability are critical n Different techniques are difficult to compare, since every run of every program makes different memory demands n An active area of language systems research and experimentation