Dynamic Memory Management

Similar documents
Dynamic Memory Management! Goals of this Lecture!

Dynamic Memory Management

CSC 1600 Memory Layout for Unix Processes"

Dynamic Memory Allocation

Dynamic Memory Allocation: Basic Concepts

Dynamic Memory Allocation. Basic Concepts. Computer Organization 4/3/2012. CSC252 - Spring The malloc Package. Kai Shen

Princeton University. Computer Science 217: Introduction to Programming Systems. Dynamic Memory Management

Today. Dynamic Memory Allocation: Basic Concepts. Dynamic Memory Allocation. Dynamic Memory Allocation. malloc Example. The malloc Package

Dynamic Memory Allocation: Basic Concepts

Today. Dynamic Memory Allocation: Basic Concepts. Dynamic Memory Allocation. Dynamic Memory Allocation. malloc Example. The malloc Package

Introduction to Computer Systems /18 243, fall th Lecture, Oct. 22 th

Princeton University Computer Science 217: Introduction to Programming Systems. Dynamic Memory Management

Dynamic Memory Allocation I Nov 5, 2002

A.Arpaci-Dusseau. Mapping from logical address space to physical address space. CS 537:Operating Systems lecture12.fm.2

Dynamic Memory Allocation I

Dynamic Memory Allocation

Optimizing Dynamic Memory Management

10.1. CS356 Unit 10. Memory Allocation & Heap Management

Dynamic Memory Alloca/on: Basic Concepts

Dynamic Memory Allocation

o Code, executable, and process o Main memory vs. virtual memory

Dynamic Memory Alloca/on: Basic Concepts

Class Information ANNOUCEMENTS

Process s Address Space. Dynamic Memory. Backing the Heap. Dynamic memory allocation 3/29/2013. When a process starts the heap is empty

Dynamic Memory Allocation. Gerson Robboy Portland State University. class20.ppt

In Java we have the keyword null, which is the value of an uninitialized reference type

Dynamic Memory Allocation. Zhaoguo Wang

Memory Allocation. Copyright : University of Illinois CS 241 Staff 1

Memory Allocation I. CSE 351 Autumn Instructor: Justin Hsia

CS61C : Machine Structures

CSCI-UA /2. Computer Systems Organization Lecture 19: Dynamic Memory Allocation: Basics

Memory Allocation I. CSE 351 Autumn Instructor: Justin Hsia

Operating System Labs. Yuanbin Wu

Motivation for Dynamic Memory. Dynamic Memory Allocation. Stack Organization. Stack Discussion. Questions answered in this lecture:

Lecture 8 Dynamic Memory Allocation

Memory Allocation. Static Allocation. Dynamic Allocation. Dynamic Storage Allocation. CS 414: Operating Systems Spring 2008

Memory management. Johan Montelius KTH

COSC Software Engineering. Lectures 14 and 15: The Heap and Dynamic Memory Allocation

Memory Management in C (Dynamic Strings) Personal Software Engineering

CSE351 Spring 2018, Final Exam June 6, 2018

Programming Language Implementation

6.172 Performance Engineering of Software Systems Spring Lecture 9. P after. Figure 1: A diagram of the stack (Image by MIT OpenCourseWare.

CS61C : Machine Structures

Lectures 13 & 14. memory management

Last week. Data on the stack is allocated automatically when we do a function call, and removed when we return

CS 33. Storage Allocation. CS33 Intro to Computer Systems XXVII 1 Copyright 2017 Thomas W. Doeppner. All rights reserved.

Memory Management Basics

Secure Software Programming and Vulnerability Analysis

Limitations of the stack

CS61 Section Notes. Section 5 (Fall 2011) Topics to be covered Common Memory Errors Dynamic Memory Allocation Assignment 3: Malloc

COSC345 Software Engineering. The Heap And Dynamic Memory Allocation

Lecture 13: Garbage Collection

Run-Time Environments/Garbage Collection

Run-time Environments -Part 3

Memory (Stack and Heap)

CSCI 2132 Software Development. Lecture 29: Dynamic Memory Allocation

Dynamic Memory Allocation (and Multi-Dimensional Arrays)

Memory Management. To do. q Basic memory management q Swapping q Kernel memory allocation q Next Time: Virtual memory

CMSC 330: Organization of Programming Languages

CMSC 330: Organization of Programming Languages

ANITA S SUPER AWESOME RECITATION SLIDES

Run-time Environments

Run-time Environments

CMSC 330: Organization of Programming Languages. Memory Management and Garbage Collection

Dynamic Storage Allocation

Review! Lecture 5 C Memory Management !

Heap Management portion of the store lives indefinitely until the program explicitly deletes it C++ and Java new Such objects are stored on a heap

CS61C : Machine Structures

Requirements, Partitioning, paging, and segmentation

CS 31: Intro to Systems Pointers and Memory. Kevin Webb Swarthmore College October 2, 2018

Heap Management. Heap Allocation

CS 153 Design of Operating Systems

Memory Management. CS449 Fall 2017

CS 31: Intro to Systems Pointers and Memory. Martin Gagne Swarthmore College February 16, 2016

ECE 598 Advanced Operating Systems Lecture 10

Memory Management. q Basic memory management q Swapping q Kernel memory allocation q Next Time: Virtual memory

Data Structures Lecture 2 : Part 1: Programming Methodologies Part 2: Memory Management

Requirements, Partitioning, paging, and segmentation

CS 11 C track: lecture 5

Memory Allocation in C C Programming and Software Tools. N.C. State Department of Computer Science

COMP26120: Linked List in C (2018/19) Lucas Cordeiro

CPSC 213. Introduction to Computer Systems. Winter Session 2017, Term 2. Unit 1c Jan 24, 26, 29, 31, and Feb 2

Dynamic Memory Allocation

Robust Memory Management Schemes

Run-time Environments - 3

Understanding Pointers

CS61C : Machine Structures

Memory Management. CS31 Pascal Van Hentenryck CS031. Lecture 19 1

ECE 598 Advanced Operating Systems Lecture 12

Garbage Collection (1)

Operating systems. Lecture 9

Secure Coding in C and C++

Heap Arrays. Steven R. Bagley

Acknowledgements These slides are based on Kathryn McKinley s slides on garbage collection as well as E Christopher Lewis s slides

14. Memory API. Operating System: Three Easy Pieces

Run-time Environments. Lecture 13. Prof. Alex Aiken Original Slides (Modified by Prof. Vijay Ganesh) Lecture 13

Memory Management. CSC215 Lecture

Project 3a: Malloc and Free

HW 3: Malloc CS 162. Due: Monday, March 28, 2016

Deallocation Mechanisms. User-controlled Deallocation. Automatic Garbage Collection

Transcription:

Dynamic Memory Management 1

Goals of this Lecture Help you learn about: Dynamic memory management techniques Garbage collection by the run-time system (Java) Manual deallocation by the programmer (C, C++) Design decisions for the K&R heap manager implementation Circular linked-list of free blocks with a first fit allocation Coalescing of adjacent blocks to create larger blocks 2

Part 1: What do malloc() and free() do? 3

Memory Layout: char* string = "hello"; int isize; char* f() { char* p; scanf("%d", &isize); p = malloc(isize); return p; } Needed when required memory size is not known before the program runs Text RoData Data BSS Stack 4

Allocating & Deallocating Memory Dynamically allocating memory Programmer explicitly requests space in memory Space is allocated dynamically on the heap E.g., using malloc in C, and new in Java/C++ Dynamically deallocating memory Must reclaim or recycle memory that is never used again To avoid (eventually) running out of memory Garbage Allocated block in heap that will not be accessed again Can be reclaimed for later use by the program 5

Option #1: Garbage Collection Run-time system does garbage collection (Java) Automatically determines objects that can t be accessed And then reclaims the resources used by these objects Object x = new Foo(); Object y = new Bar(); x = new Quux(); if (x.check_something()) { x.do_something(y); } System.exit(0); Object Foo() is never used again! 6

Challenges of Garbage Collection Detecting the garbage is not always easy if (complex_function(y)) x = Quux(); Run-time system cannot collect all of the garbage Detecting the garbage introduces overhead Keeping track of references to objects (e.g., counter) Scanning through accessible objects to identify garbage Sometimes walking through a large amount of memory Cleaning the garbage leads to bursty delays E.g., periodic scans of the objects to hunt for garbage Leading to unpredictable freeze of the running program Very problematic for real-time applications though good run-time systems avoid long freezes 7

Option #2: Manual Deallocation Programmer deallocates the memory (C and C++) Manually determines which objects can t be accessed And then explicitly returns the resources to the heap E.g., using free in C or delete in C++ Advantages Lower overhead No unexpected pauses More efficient use of memory Disadvantages More complex for the programmer Subtle memory-related bugs Security vulnerabilities in the (buggy) code 8

Manual Deallocation Can Lead to Bugs Dangling pointers Programmer frees a region of memory but still has a pointer to it Dereferencing pointer reads or writes nonsense values int main(void) { char *p; p = malloc(10); free(p); putchar(*p); } May print nonsense character. 9

Manual Deallocation Can Lead to Bugs Memory leak Programmer neglects to free unused region of memory So, the space can never be allocated again Eventually may consume all of the available memory void f(void) { char *s; s = malloc(50); return; } int main(void) { while (1) f(); return 0; } Eventually, malloc() returns NULL 10

Manual Deallocation Can Lead to Bugs Double free Programmer mistakenly frees a region more than once Leading to corruption of the heap data structure or premature destruction of a different object int main(void) { char *p, *q; p = malloc(10); free(p); q = malloc(10); free(p); } Might free the space allocated to q! 11

malloc() and free() Challenges malloc() may ask for arbitrary number of bytes Memory may be allocated & freed in different order Cannot reorder requests to improve performance char *p1 = malloc(3); char *p2 = malloc(1); char *p3 = malloc(4); free(p2); char *p4 = malloc(6); free(p3); char *p5 = malloc(2); free(p1); free(p4); free(p5); 12

: Dynamic Memory #include <stdlib.h> void *malloc(size_t size); void free(void *ptr); char *p1 = malloc(3); char *p2 = malloc(1); char *p3 = malloc(4); free(p2); char *p4 = malloc(6); free(p3); char *p5 = malloc(2); free(p1); free(p4); free(p5); p1 0 } 0xffffffff Stack 13

: Dynamic Memory #include <stdlib.h> void *malloc(size_t size); void free(void *ptr); char *p1 = malloc(3); char *p2 = malloc(1); char *p3 = malloc(4); free(p2); char *p4 = malloc(6); free(p3); char *p5 = malloc(2); free(p1); free(p4); free(p5); p1 p2 0 } 0xffffffff Stack 14

: Dynamic Memory #include <stdlib.h> void *malloc(size_t size); void free(void *ptr); char *p1 = malloc(3); char *p2 = malloc(1); char *p3 = malloc(4); free(p2); char *p4 = malloc(6); free(p3); char *p5 = malloc(2); free(p1); free(p4); free(p5); p1 p2 p3 0 } 0xffffffff Stack 15

: Dynamic Memory #include <stdlib.h> void *malloc(size_t size); void free(void *ptr); char *p1 = malloc(3); char *p2 = malloc(1); char *p3 = malloc(4); free(p2); char *p4 = malloc(6); free(p3); char *p5 = malloc(2); free(p1); free(p4); free(p5); p1 p2 p3 0 } 0xffffffff Stack 16

: Dynamic Memory #include <stdlib.h> void *malloc(size_t size); void free(void *ptr); char *p1 = malloc(3); char *p2 = malloc(1); char *p3 = malloc(4); free(p2); char *p4 = malloc(6); free(p3); char *p5 = malloc(2); free(p1); free(p4); free(p5); p1 p2 p3 p4 0 } 0xffffffff Stack 17

: Dynamic Memory #include <stdlib.h> void *malloc(size_t size); void free(void *ptr); char *p1 = malloc(3); char *p2 = malloc(1); char *p3 = malloc(4); free(p2); char *p4 = malloc(6); free(p3); char *p5 = malloc(2); free(p1); free(p4); free(p5); p1 p2 p3 p4 0 } 0xffffffff Stack 18

: Dynamic Memory #include <stdlib.h> void *malloc(size_t size); void free(void *ptr); char *p1 = malloc(3); char *p2 = malloc(1); char *p3 = malloc(4); free(p2); char *p4 = malloc(6); free(p3); char *p5 = malloc(2); free(p1); free(p4); free(p5); p1 p5, p2 p3 p4 0 } 0xffffffff Stack 19

: Dynamic Memory #include <stdlib.h> void *malloc(size_t size); void free(void *ptr); char *p1 = malloc(3); char *p2 = malloc(1); char *p3 = malloc(4); free(p2); char *p4 = malloc(6); free(p3); char *p5 = malloc(2); free(p1); free(p4); free(p5); p1 p5, p2 p3 p4 0 } 0xffffffff Stack 20

: Dynamic Memory #include <stdlib.h> void *malloc(size_t size); void free(void *ptr); char *p1 = malloc(3); char *p2 = malloc(1); char *p3 = malloc(4); free(p2); char *p4 = malloc(6); free(p3); char *p5 = malloc(2); free(p1); free(p4); free(p5); p1 p5, p2 p3 p4 0 } 0xffffffff Stack 21

: Dynamic Memory #include <stdlib.h> void *malloc(size_t size); void free(void *ptr); char *p1 = malloc(3); char *p2 = malloc(1); char *p3 = malloc(4); free(p2); char *p4 = malloc(6); free(p3); char *p5 = malloc(2); free(p1); free(p4); free(p5); p1 p5, p2 p3 p4 0 } 0xffffffff Stack 22

Part 2: How do malloc() and free() work? 23

The Program Break The program break marks the boundary between heap and stack 00000000 program break FFFFFFFF Stack Initially, stack has maximum size 00000000 program break FFFFFFFF Stack 24

Acquiring Memory Q: How does malloc() acquire heap memory? A: Moves the program break downward via sbrk() or brk()system call void *sbrk(intptr_t increment); Increment the program break by the specified amount. Calling the function with an increment of 0 returns the current location of the program break. Return 0 if successful and -1 otherwise. int brk(void *newbreak); Move the program break to the specified address. Return 0 if successful and -1 otherwise. 25

Using Memory Q: Having acquired heap memory, how do malloc() and free() manipulate it? A: Topic of much research; an introduction 26

Goals for malloc() and free() Maximizing throughput Maximize number of requests completed per unit time Need both malloc() and free() to be fast Maximizing memory utilization Minimize the amount of wasted memory Need to minimize size of data structures Strawman #1: free() does nothing Good throughput, but poor memory utilization Strawman #2: malloc() finds the best fit Good memory utilization, but poor throughput 27

Keeping Track of Free Blocks Maintain a list of free blocks of memory Allocate memory from one of the blocks in the free list Deallocate memory by returning the block to the free list When necessary, call sbrk() to ask OS for additional memory, and create a new large block Design questions How to keep track of the free blocks in memory? How to choose an appropriate free block to allocate? What to do with the left-over space in a free block? What to do with a block that has just been freed? free free free 28

Need to Minimize Fragmentation Internal fragmentation Allocated block is larger than malloc() requested E.g., malloc() imposes a minimum size (e.g., 64 bytes) 33 External fragmentation Enough free memory exists, but no block is big enough E.g., malloc() asks for 128 contiguous bytes 64 64 64 29

Simple K&R-Like Approach Memory allocated in multiples of a base size E.g., 16 bytes, 32 bytes, 48 bytes, Linked list of free blocks malloc() and free() walk through the list to allocate and deallocate malloc() allocates the first big-enough block To avoid sequencing further through the list malloc() splits the free block To allocate what is needed, and leave the rest available Linked list is circular To be able to continue where you left off Linked list in the order the blocks appear in memory To be able to coalesce neighboring free blocks 30

Allocate Memory in Multiples of Base Size Allocate memory in multiples of a base size Avoid maintaining very tiny free blocks Align memory on size of largest data type (e.g., double) Requested size is rounded up Allocation in units of base_size Round:(nbytes+base_size 1)/base_size Example: Suppose nbytes is 37 And base_size is 16 bytes Then (37 + 16 1)/16 is 52/16 which rounds down to 3 16 16 5 31

Linked List of Free Blocks Linked list of free blocks malloc() allocates a big-enough block Allocated free() adds newly-freed block to the list Newly freed 32

First-Fit Allocation Handling a request for memory (e.g., malloc()) Find a free block that satisfies the request Must have a size that is big enough, or bigger Simplest approach: first fit Sequence through the linked list Stop upon encountering a big enough free block Example: request for 64 bytes First-fit algorithm stops at the 128-byte block 48 32 128 64 256 33

Splitting an Oversized Free Block Simple case: perfect fit malloc() asks for 128 bytes, free block has 128 bytes Simply remove the free block from the list 48 32 128 64 256 Complex case: splitting the block malloc() asks for 64 bytes, free block has 128 bytes 48 32 64 64 256 64 34

Circular Linked List of Free Blocks Advantages of making free list a circular list Any element in the list can be the beginning Don t have to handle the end of the list as special Performance optimization Make the head be where last block was found More likely to find big enough blocks later in the list new head 48 32 64 64 256 35

Maintaining Free Blocks in Order Keep list in order of increasing addresses Makes it easier to coalesce adjacent free blocks Though, makes calls to free() more expensive Need to insert the newly-freed block in the right place Free list In use In use In use 36

Coalescing Adjacent Free Blocks When inserting a block in the free list Look left and look right for neighboring free blocks In use In use Left In use Right In use In use 37

Conclusion Elegant simplicity of K&R malloc() and free() Simple header with pointer and size in each free block Simple circular linked list of free blocks Relatively small amount of code (~25 lines each) Limitations of K&R functions in terms of efficiency malloc() requires scanning the free list To find the first free block that is big enough free() requires scanning the free list To find the location to insert the to-be-freed block 38