Memory Allocation I. CSE 351 Autumn Instructor: Justin Hsia

Similar documents
Memory Allocation I. CSE 351 Autumn Instructor: Justin Hsia

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

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

Dynamic Memory Allocation: Basic Concepts

Dynamic Memory Allocation I Nov 5, 2002

Dynamic Memory Allocation I

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

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

Dynamic Memory Alloca/on: Basic Concepts

Memory Allocation II. CSE 351 Autumn Instructor: Justin Hsia

Dynamic Memory Alloca/on: Basic Concepts

Dynamic Memory Allocation

Memory Allocation II. CSE 351 Autumn Instructor: Justin Hsia

Dynamic Memory Allocation

Data III & Integers I

Dynamic Memory Allocation

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

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

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

CS 153 Design of Operating Systems

Structs and Alignment

Arrays. CSE 351 Autumn Instructor: Justin Hsia

Dynamic Memory Allocation

Cache Example, System Control Flow

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

Memory Allocation III

Java and C. CSE 351 Autumn 2018

Foundations of Computer Systems

Structs & Alignment. CSE 351 Autumn Instructor: Justin Hsia

Data III & Integers I

Integers II. CSE 351 Autumn Instructor: Justin Hsia

Data III & Integers I

ANITA S SUPER AWESOME RECITATION SLIDES

Foundations of Computer Systems

Structs and Alignment CSE 351 Spring

Dynamic Memory Management

Java and C I. CSE 351 Spring Instructor: Ruth Anderson

x86 Programming I CSE 351 Autumn 2016 Instructor: Justin Hsia

10.1. CS356 Unit 10. Memory Allocation & Heap Management

L14: Structs and Alignment. Structs and Alignment. CSE 351 Spring Instructor: Ruth Anderson

Memory, Data, & Addressing I

Virtual Memory I. CSE 351 Spring Instructor: Ruth Anderson

x86-64 Programming III & The Stack

Dynamic Memory Allocation. Zhaoguo Wang

Floating Point. CSE 351 Autumn Instructor: Justin Hsia

Java and C CSE 351 Spring

Binghamton University Dynamic Memory Alloca/on

Roadmap. Java: Assembly language: OS: Machine code: Computer system:

Structs and Alignment

Dynamic Memory Management! Goals of this Lecture!

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

CSE351: Memory, Data, & Addressing I

Caches II. CSE 351 Autumn Instructor: Justin Hsia

Virtual Memory II. CSE 351 Autumn Instructor: Justin Hsia

Review! Lecture 5 C Memory Management !

CS61C : Machine Structures

Assembly Programming IV

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

Dynamic Memory Management

Memory management. Johan Montelius KTH

Arrays. CSE 351 Autumn Instructor: Justin Hsia

Java and C II. CSE 351 Spring Instructor: Ruth Anderson

Assembly Programming IV

Hardware: Logical View

Malloc Lab & Midterm Solutions. Recitation 11: Tuesday: 11/08/2016

We made it! Java: Assembly language: OS: Machine code: Computer system:

CSE351 Spring 2018, Final Exam June 6, 2018

CS24: INTRODUCTION TO COMPUTING SYSTEMS. Spring 2017 Lecture 7

CS61C : Machine Structures

Memory Allocation III

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

Building an Executable

Virtual Memory I. CSE 351 Winter Instructor: Mark Wyse

Dynamic Memory Allocation: Advanced Concepts

Recitation #12 Malloc Lab - Part 2. November 14th, 2017

x86 Programming I CSE 351 Winter

CS61C : Machine Structures

Dynamic Memory Allocation II October 22, 2008

Class Information ANNOUCEMENTS

Floating Point II, x86 64 Intro

Recitation #11 Malloc Lab. November 7th, 2017

Lecture 8 Dynamic Memory Allocation

Today. Dynamic Memory Allocation: Advanced Concepts. Explicit Free Lists. Keeping Track of Free Blocks. Allocating From Explicit Free Lists

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

Operating System Labs. Yuanbin Wu

x86 Programming III CSE 351 Autumn 2016 Instructor: Justin Hsia

Internal Fragmentation

Memory (Stack and Heap)

The Stack & Procedures

Dynamic Memory Allocation

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

CMSC 313 Spring 2010 Exam 3 May 17, 2010

Optimizing Dynamic Memory Management

There are 16 total numbered pages, 7 Questions. You have 2 hours. Budget your time carefully!

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

Memory Allocation III

Lectures 13 & 14. memory management

COSC345 Software Engineering. The Heap And Dynamic Memory Allocation

Transcription:

Memory Allocation I CSE 351 Autumn 2016 Instructor: Justin Hsia Teaching Assistants: Chris Ma Hunter Zahn John Kaltenbach Kevin Bi Sachin Mehta Suraj Bhat Thomas Neuman Waylon Huang Xi Liu Yufang Sun Adapted from https://xkcd.com/1093/

Administrivia Lab 4 due today @ 11:45pm Homework 4 due Friday @ 11:45pm Lab 5 released today (on Mem Alloc), due Dec. 9 Final Exam: Tue, Dec. 13 @ 12:30pm in Kane 120 Combined for both lectures Review Session: Sun, Dec. 11 @ 1:30pm in EEB 105 Cumulative (midterm clobber policy applies) You get TWO double sided handwritten 8.5 sheets 11 cheat Recommended that you reuse or remake your midterm cheat sheet 2

Roadmap C: car *c = malloc(sizeof(car)); c->miles = 100; c->gals = 17; float mpg = get_mpg(c); free(c); Assembly language: Machine code: get_mpg: pushq %rbp movq %rsp, %rbp... popq %rbp ret 0111010000011000 100011010000010000000010 1000100111000010 110000011111101000011111 Java: Car c = new Car(); c.setmiles(100); c.setgals(17); float mpg = c.getmpg(); OS: Memory & data Integers & floats Machine code & C x86 assembly Procedures & stacks Arrays & structs Memory & caches Processes Virtual memory Memory allocation Java vs. C Computer system: 3

Multiple Ways to Store Program Data Static global data Fixed size at compile time Entire lifetime of the program (loaded from executable) Portion is read only (e.g. string literals) Stack allocated data Local/temporary variables Can be dynamically sized (in some versions of C) Known lifetime (deallocated on return) int array[1024]; void foo(int n) { int tmp; int local_array[n]; int* dyn = (int*)malloc(n*sizeof(int)); Dynamic (heap) data Size known only at runtime (i.e. based on user input) Lifetime known only at runtime (long lived data structures) } 4

Memory Allocation Dynamic memory allocation Introduction and goals Allocation and deallocation (free) Fragmentation Explicit allocation implementation Implicit free lists Explicit free lists (Lab 5) Segregated free lists Implicit deallocation: garbage collection Common memory related bugs in C 5

Dynamic Memory Allocation Programmers use dynamic memory allocators to acquire virtual memory at run time For data structures whose size (or lifetime) is known only at runtime Manage the heap of a process virtual memory: Types of allocators Explicit allocator: programmer allocates and frees space Example: malloc and free in C Implicit allocator: programmer only allocates space (no free) Example: garbage collection in Java, Caml, and Lisp 0 User stack Heap (via malloc) Uninitialized data (.bss) Initialized data (.data) Program text (.text) 6

Dynamic Memory Allocation Allocator organizes heap as a collection of variablesized blocks, which are either allocated or free Allocator requests pages in the heap region; virtual memory hardware and OS kernel allocate these pages to the process Application objects are typically smaller than pages, so the allocator manages blocks within pages (Larger objects handled too; ignored here) User stack Heap (via malloc) Uninitialized data (.bss) Initialized data (.data) Program text (.text) Top of heap (brk ptr) 0 7

Allocating Memory in C Need to #include <stdlib.h> void* malloc(size_t size) Allocates a continuous block of size bytes of uninitialized memory Returns a pointer to the beginning of the allocated block; NULL indicates failed request Typically aligned to an 8 byte (x86) or 16 byte (x86 64) boundary Returns NULL if allocation failed (also sets errno) or size==0 Different blocks not necessarily adjacent Good practices: ptr = (int*) malloc(n*sizeof(int)); sizeof makes code more portable void* is implicitly cast into any pointer type; explicit typecast will help you catch coding errors when pointer types don t match 8

Allocating Memory in C Need to #include <stdlib.h> void* malloc(size_t size) Allocates a continuous block of size bytes of uninitialized memory Returns a pointer to the beginning of the allocated block; NULL indicates failed request Typically aligned to an 8 byte (x86) or 16 byte (x86 64) boundary Returns NULL if allocation failed (also sets errno) or size==0 Different blocks not necessarily adjacent Related functions: void* calloc(size_t nitems, size_t size) Zeros out allocated block void* realloc(void* ptr, size_t size) Changes the size of a previously allocated block (if possible) void* sbrk(intptr_t increment) Used internally by allocators to grow or shrink the heap 9

Freeing Memory in C Need to #include <stdlib.h> void free(void* p) Releases whole block pointed to by p to the pool of available memory Pointer p must be the address originally returned by m/c/realloc (i.e. beginning of the block), otherwise throws system exception Don t call free on a block that has already been released or on NULL 10

Memory Allocation Example in C void foo(int n, int m) { int i, *p; p = (int*) malloc(n*sizeof(int)); /* allocate block of n ints */ if (p == NULL) { /* check for allocation error */ perror("malloc"); exit(0); } for (i=0; i<n; i++) /* initialize int array */ p[i] = i; /* add space for m ints to end of p block */ p = (int*) realloc(p,(n+m)*sizeof(int)); if (p == NULL) { /* check for allocation error */ perror("realloc"); exit(0); } for (i=n; i < n+m; i++) /* initialize new spaces */ p[i] = i; for (i=0; i<n+m; i++) /* print new array */ printf("%d\n", p[i]); free(p); /* free p */ } 11

Notation Node (these slides, book, videos) Memory is drawn divided into words Each word can hold an int (32 bits/4 bytes) Allocations will be in sizes that are a multiple of words, i.e. multiples of 4 bytes In pictures in slides, book, videos : = one word, 4 bytes Allocated block (4 words) Free block (3 words) Free word Allocated word 12

Allocation Example = 4 byte word p1 = malloc(16) p2 = malloc(20) p3 = malloc(24) free(p2) p4 = malloc(8) 13

Constraints (interface/contract) Applications Can issue arbitrary sequence of malloc and free requests Must never access memory not currently allocated Must never free memory not currently allocated Also must only use free with previously malloc ed blocks (not, e.g., stack data) Allocators Can t control number or size of allocated blocks Must respond immediately to malloc (i.e. can t reorder or buffer) Must allocate blocks from free memory (i.e. blocks can t overlap Why not?) Must align blocks so they satisfy all alignment requirements Can t move the allocated blocks (i.e. compaction/defragmentation is not allowed Why not?) 14

Performance Goals Goals: Given some sequence of malloc and free requests, maximize throughput and peak memory utilization These goals are often conflicting 1) Throughput Number of completed requests per unit time Example: If 5,000 malloc calls and 5,000 free calls completed in 10 seconds, then throughput is 1,000 operations/second 15

Performance Goals Definition: Aggregate payload malloc(p) results in a block with a payload of p bytes After request has completed, the aggregate payload is the sum of currently allocated payloads Definition: Current heap size Assume is monotonically non decreasing Allocator can increase size of heap using sbrk 2) Peak Memory Utilization Defined as after +1 requests Goal: maximize utilization for a sequence of requests Why is this hard? And what happens to throughput? 16

Fragmentation Poor memory utilization is caused by fragmentation Sections of memory are not used to store anything useful, but cannot satisfy allocation requests Two types: internal and external Recall: Fragmentation in structs Internal fragmentation was wasted space inside of the struct (between fields) due to alignment External fragmentation was wasted space between struct instances (e.g. in an array) due to alignment Now referring to wasted space in the heap inside or between allocated blocks 17

Internal Fragmentation For a given block, internal fragmentation occurs if payload is smaller than the block block Internal fragmentation payload Internal fragmentation Causes: Padding for alignment purposes Overhead of maintaining heap data structures (inside block, outside payload) Explicit policy decisions (e.g., to return a big block to satisfy a small request) Easy to measure because only depends on past requests 18

External Fragmentation = 4 byte word For the heap, external fragmentation occurs when allocation/free pattern leaves holes between blocks That is, the aggregate payload is non continuous Can cause situations where there is enough aggregate heap memory to satisfy request, but no single free block is large enough p1 = malloc(16) p2 = malloc(20) p3 = malloc(24) free(p2) p4 = malloc(24) Oh no! (What would happen now?) Don t know what future requests will be Difficult to impossible to know if past placements will become problematic 19

Implementation Issues How do we know how much memory to free given just a pointer? How do we keep track of the free blocks? How do we pick a block to use for allocation (when many might fit)? 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 reinsert a freed block into the heap? 20

Knowing How Much to Free = 4 byte word (free) = 4 byte word (allocated) Standard method Keep the length of a block in the word preceding the block This word is often called the header field or header Requires an extra word for every allocated block p0 p0 = malloc(16) 20 block size data free(p0) 21

Keeping Track of Free Blocks = 4 byte word (free) = 4 byte word (allocated) 1) Implicit free list using length links all blocks using math No actual pointers, and must check each block if allocated or free 20 16 24 8 2) Explicit free list among only the free blocks, using pointers 20 16 24 8 3) Segregated free list Different free lists for different size classes 4) Blocks sorted by size Can use a balanced binary tree (e.g. red black tree) with pointers within each free block, and the length used as a key 22

Implicit Free Lists For each block we need: size, is allocated? Could store using two words, but wasteful Standard trick If blocks are aligned, some low order bits of size are always 0 Use lowest bit as a allocated/free flag (fine as long as aligning to >1) When reading size, must remember to mask out this bit! 1 word = 4 B e.g. with 8 byte alignment, possible values for size: 00001000 = 8 bytes 00010000 = 16 bytes 00011000 = 24 bytes... Format of allocated and free blocks: size a a = 1: allocated block a = 0: free block If x is first word (header): x = size a; payload size: block size (in bytes) a = x & 1; optional padding payload: application data (allocated blocks only) size = x & ~1; 23

Implicit Free List Example Each block begins with header (size in bytes and allocated bit) Sequence of blocks in heap (size allocated): 8 0, 16 1, 32 0, 16 1 Start of heap 8 0 16 1 32 0 16 1 0 1 8 bytes = 2 word alignment Free word Allocated word Allocated word unused 8 byte alignment for payload May require initial padding (internal fragmentation) Note size: padding is considered part of previous block Special one word marker (0 1) marks end of list Zero size is distinguishable from all other blocks 24

Implicit List: Finding a Free Block First fit Search list from beginning, choose first free block that fits: Can take time linear in total number of blocks In practice can cause splinters at beginning of list (*p) gets the block header (*p & 1) extracts the allocated bit (*p & 2) extracts the size p = heap_start; while ((p < end) && // not past end ((*p & 1) // already allocated (*p <= len))) { // too small p = p + (*p & -2); // go to next block (UNSCALED +) } // p points to selected block or end p = heap_start 8 0 16 1 32 0 16 1 0 1 Free word Allocated word Allocated word unused 25

Implicit List: Finding a Free Block Next fit Like first fit, but search list starting where previous search finished Should often be faster than first fit: avoids re scanning unhelpful blocks Some research suggests that fragmentation is worse Best fit Search the list, choose the best free block: large enough AND with fewest bytes left over Keeps fragments small usually helps fragmentation Usually worse throughput 26

Implicit List: 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 Assume ptr points to a free block and has unscaled pointer arithmetic void split(ptr b, int bytes) { // bytes = desired block size int newsize = ((bytes+7) >> 3) << 3; // round up to multiple of 8 int oldsize = *b; // why not mask out low bit? *b = newsize; // initially unallocated if (newsize < oldsize) *(b+newsize) = oldsize - newsize; // set length in remaining } // part of block (UNSCALED +) malloc(12): ptr b = find(12+4) split(b, 12+4) allocate(b) 8 1 24 0 8 1 b 8 1 16 1 8 0 8 1 Free word Allocated word Newly allocated word 27

Implicit List: Freeing a Block Simplest implementation just clears allocated flag void free(ptr p) {*(p-word) &= -2;} But can lead to false fragmentation free(p) 8 1 16 1 8 0 8 1 p 8 1 16 0 8 0 8 1 Free word Allocated word Block of interest malloc(20) Oops! There is enough free space, but the allocator won t be able to find it 28

Implicit List: Coalescing with Next Join (coalesce) with next block if also free free(p) 8 1 16 1 8 0 8 1 p 8 1 24 0 8 0 8 1 logically gone Free word Allocated word Block of interest void free(ptr p) { // p points to data ptr b = p WORD; // b points to block *b &= -2; // clear allocated bit ptr next = b + *b; // find next block (UNSCALED +) if ((*next & 1) == 0) // if next block is not allocated, *b += *next; // add its size to this block } How do we coalesce with the previous block? 29

Implicit List: Bidirectional Coalescing Boundary tags [Knuth73] Replicate header at bottom (end) of free blocks Allows us to traverse backwards, but requires extra space Important and general technique! 16/0 16/0 16/1 16/124/0 24/0 16/1 16/1 Format of allocated and free blocks: Header size payload and padding a a = 1: allocated block a = 0: free block size: block size (in bytes) Boundary tag (footer) size a payload: application data (allocated blocks only) 30

Constant Time Coalescing Case 1 Case 2 Case 3 Case 4 Block being freed Allocated Allocated Free Free Allocated Free Allocated Free 31

Constant Time Coalescing Case 1 m1 1 m1 1 Case 2 m1 1 m1 1 n 1 m1 1 n 0 m1 1 n 1 m1 1 m1 1 n+m2 0 n 1 m2 1 n 0 m2 1 n 1 m2 0 m2 1 m2 1 m2 0 n+m2 0 Case 3 m1 0 n+m1 0 Case 4 m1 0 m1 0 n 1 m1 0 n 1 n+m1+m2 0 n 1 m2 1 n+m1 0 m2 1 n 1 m2 0 m2 1 m2 1 m2 0 n+m1+m2 0

Implicit Free Lists Summary Implementation is very simple Allocate cost: Linear time (in total number of heap blocks) in the worst case Free cost: constant time worst case, even with coalescing Memory utilization: Will depend on placement policy (first fit, next fit, or best fit) Not used in practice for malloc/free because of linear time allocation Used in some special purpose applications Concepts of splitting and boundary tag coalescing are general to all (?) allocators 33