Carnegie Mellon 1 Malloc Recitation Ben Spinelli Recitation 11: November 9, 2015.

Slides:



Advertisements
Similar presentations
Malloc Recitation By sseshadr. Agenda Macros in C Pointer declarations Casting and Pointer Arithmetic Malloc.
Advertisements

An introduction to pointers in c
Dynamic Memory Management
Process, Pointers, and Heap Manager COMPSCI210 Recitation 31 Aug 2012 Vamsi Thummala.
Kernighan/Ritchie: Kelley/Pohl:
Malloc Recitation Section K (Kevin Su) November 5 th, 2012.
Carnegie Mellon 1 Debugging : Introduction to Computer Systems Recitation 12: Monday, Nov. 9 th, 2013 Yixun Xu Section K.
Binghamton University CS-220 Spring 2015 Binghamton University CS-220 Spring 2015 Heap Management.
1 Pointers A pointer variable holds an address We may add or subtract an integer to get a different address. Adding an integer k to a pointer p with base.
Lab 3: Malloc Lab. “What do we need to do?”  Due 11/26  One more assignment after this one  Partnering  Non-Honors students may work with one other.
1 1 Lecture 4 Structure – Array, Records and Alignment Memory- How to allocate memory to speed up operation Structure – Array, Records and Alignment Memory-
Memory Arrangement Memory is arrange in a sequence of addressable units (usually bytes) –sizeof( ) return the number of units it takes to store a type.
1 Optimizing Malloc and Free Professor Jennifer Rexford
1 Inner Workings of Malloc and Free Professor Jennifer Rexford COS 217.
1 Pointers, Dynamic Data, and Reference Types Review on Pointers Reference Variables Dynamic Memory Allocation –The new operator –The delete operator –Dynamic.
Pointers Applications
Memory Allocation CS Introduction to Operating Systems.
L6: Malloc Lab Writing a Dynamic Storage Allocator October 30, 2006
CS 11 C track: lecture 5 Last week: pointers This week: Pointer arithmetic Arrays and pointers Dynamic memory allocation The stack and the heap.
IT253: Computer Organization Lecture 3: Memory and Bit Operations Tonga Institute of Higher Education.
CMPSC 16 Problem Solving with Computers I Spring 2014 Instructor: Tevfik Bultan Lecture 12: Pointers continued, C strings.
1 C - Memory Simple Types Arrays Pointers Pointer to Pointer Multi-dimensional Arrays Dynamic Memory Allocation.
Stack and Heap Memory Stack resident variables include:
Computer Science and Software Engineering University of Wisconsin - Platteville 2. Pointer Yan Shi CS/SE2630 Lecture Notes.
University of Washington Today Finished up virtual memory On to memory allocation Lab 3 grades up HW 4 up later today. Lab 5 out (this afternoon): time.
1 C++ Classes and Data Structures Jeffrey S. Childs Chapter 4 Pointers and Dynamic Arrays Jeffrey S. Childs Clarion University of PA © 2008, Prentice Hall.
1 Dynamic Memory Allocation: Basic Concepts. 2 Today Basic concepts Implicit free lists.
CS 376b Introduction to Computer Vision 01 / 23 / 2008 Instructor: Michael Eckmann.
Agenda Attack Lab C Exercises C Conventions C Debugging
CS 241 Discussion Section (11/17/2011). Outline Review of MP7 MP8 Overview Simple Code Examples (Bad before the Good) Theory behind MP8.
+ Dynamic memory allocation. + Introduction We often face situations in programming where the data is dynamics in nature. Consider a list of customers.
Computer Organization and Design Pointers, Arrays and Strings in C Montek Singh Sep 18, 2015 Lab 5 supplement.
Computer Graphics 3 Lecture 1: Introduction to C/C++ Programming Benjamin Mora 1 University of Wales Swansea Pr. Min Chen Dr. Benjamin Mora.
Carnegie Mellon Dynamic Memory Allocation : Introduction to Computer Systems Monday March 30th,
Consider Starting with 160 k of memory do: Starting with 160 k of memory do: Allocate p1 (50 k) Allocate p1 (50 k) Allocate p2 (30 k) Allocate p2 (30 k)
Dynamic Memory Allocation II
Carnegie Mellon 1 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Dynamic Memory Allocation: Basic Concepts :
CS 241 Discussion Section (2/9/2012). MP2 continued Implement malloc, free, calloc and realloc Reuse free memory – Sequential fit – Segregated fit.
Malloc Lab : Introduction to Computer Systems Recitation 11: Nov. 4, 2013 Marjorie Carlson Recitation A.
CS 241 Discussion Section (12/1/2011). Tradeoffs When do you: – Expand Increase total memory usage – Split Make smaller chunks (avoid internal fragmentation)
CSE 351 Dynamic Memory Allocation 1. Dynamic Memory Dynamic memory is memory that is “requested” at run- time Solves two fundamental dilemmas: How can.
Carnegie Mellon 1 Malloc Lab : Introduction to Computer Systems Friday, July 10, 2015 Shen Chen Xu.
University of Washington 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.
Announcements Assignment 2 Out Today Quiz today - so I need to shut up at 4:25 1.
Debugging Malloc Lab Detecting Memory-Related Errors.
Carnegie Mellon Dynamic Memory Allocation : Introduction to Computer Systems Recitation 11: Monday, Nov 3, 2014 SHAILIN DESAI SECTION L 1.
DYNAMIC MEMORY ALLOCATION. Disadvantages of ARRAYS MEMORY ALLOCATION OF ARRAY IS STATIC: Less resource utilization. For example: If the maximum elements.
Memory Management What if pgm mem > main mem ?. Memory Management What if pgm mem > main mem ? Overlays – program controlled.
Overview Working directly with memory locations is beneficial. In C, pointers allow you to: change values passed as arguments to functions work directly.
Dynamic Allocation in C
Object Lifetime and Pointers
Section 10: Memory Allocation Topics
ENEE150 Discussion 07 Section 0101 Adam Wang.
Memory Management I: Dynamic Storage Allocation Oct 7, 1999
Dynamic Memory Allocation
CSCI206 - Computer Organization & Programming
The Hardware/Software Interface CSE351 Winter 2013
Circular Buffers, Linked Lists
Optimizing Malloc and Free
CS Introduction to Operating Systems
Memory Allocation CS 217.
Pointers.
CSCI 380: Operating Systems Lecture #11 Instructor: William Killian
Optimizing Dynamic Memory Management
Pointers The C programming language gives us the ability to directly manipulate the contents of memory addresses via pointers. Unfortunately, this power.
Memory Allocation II CSE 351 Autumn 2017
Memory Allocation II CSE 351 Winter 2018
Memory Allocation II CSE 351 Winter 2018
CSCI 380: Operating Systems Instructor: William Killian
Malloc Lab CSCI 380: Operating Systems
Presentation transcript:

Carnegie Mellon 1 Malloc Recitation Ben Spinelli Recitation 11: November 9, 2015

Carnegie Mellon 2 Agenda Macros / Inline functions Quick pointer review Malloc

Carnegie Mellon 3 Macros / Inline Functions

Carnegie Mellon 4 Macros Pre-compile time Define constants:  #define NUM_ENTRIES 100  OK Define simple operations:  #define twice(x) 2*x  Not OK  twice(x+1) becomes 2*x+1  #define twice(x) (2*(x))  OK  Always wrap in parentheses; it’s a naive search-and-replace!

Carnegie Mellon 5 Macros Why macros?  “Faster” than function calls  Why?  For malloc  Quick access to header information (payload size, valid) Drawbacks  Less expressive than functions  Arguments are not typechecked, local variables  This can easily lead to errors that are more difficult to find

Carnegie Mellon 6 Inline Functions What’s the keyword inline do?  At compile-time replaces “function calls” with code More efficient than a normal function call  Less overhead – no need to set up stack/function call  Useful for functions that are  Called frequently  Small, e.g., int add(int x, int y);

Carnegie Mellon 7 Differences Macros done at pre-compile time Inline functions done at compile time  Stronger type checking / Argument consistency Macros cannot return anything (why not?) Macros can have unintended side effects  #define xsquared(x) (x*x)  What happens when xsquared(x++) is called? Hard to debug macros – errors generated on expanded code, not code that you typed

Carnegie Mellon 8 Macros / Inline Functions You will likely use both in malloc lab Macros are good for small tasks  Saves work in retyping tedious calculations  Can make code easier to understand  HEADER(ptr) versus doing the pointer arithmetic Some things are hard to code in macros, so this is where inline functions come into play  More efficient than normal function call  More expressive than macros

Carnegie Mellon 9 Pointers: casting, arithmetic, and dereferencing

Carnegie Mellon 10 Pointer casting Cast from  * to *  Gives back the same value  Changes the behavior that will happen when dereferenced  * to integer/ unsigned int  Pointers are really just 8-byte numbers  Taking advantage of this is an important part of malloc lab  Be careful, though, as this can easily lead to errors  integer/ unsigned int to *

Carnegie Mellon 11 Pointer arithmetic The expression ptr + a doesn’t mean the same thing as it would if ptr were an integer. Example: type_a* pointer = …; (void *) pointer2 = (void *) (pointer + a); This is really computing:  pointer2 = pointer + (a * sizeof(type_a))  lea (pointer, a, sizeof(type_a)), pointer2; Pointer arithmetic on void* is undefined

Carnegie Mellon 12 Pointer arithmetic int * ptr = (int *)0x ; int * ptr2 = ptr + 1; char * ptr = (char *)0x ; char * ptr2 = ptr + 1; int * ptr = (int *)0x ; int * ptr2 = ((int *) (((char *) ptr) + 1)); char * ptr = (char *)0x ; void * ptr2 = ptr + 1; char * ptr = (int *)0x ; void * ptr2 = ptr + 1;

Carnegie Mellon 13 Pointer arithmetic int * ptr = (int *)0x ; int * ptr2 = ptr + 1; //ptr2 is 0x char * ptr = (char *)0x ; char * ptr2 = ptr + 1; //ptr2 is 0x int * ptr = (int *)0x ; int * ptr2 = ((int *) (((char *) ptr) + 1)); //ptr2 is 0x char * ptr = (char *)0x ; void * ptr2 = ptr + 1; //ptr2 is 0x char * ptr = (int *)0x ; void * ptr2 = ptr + 1; //ptr2 is still 0x

Carnegie Mellon 14 More pointer arithmetic int ** ptr = (int **)0x ; int * ptr2 = (int *) (ptr + 1); char ** ptr = (char **)0x ; short * ptr2 = (short *) (ptr + 1); int * ptr = (int *)0x ; void * ptr2 = &ptr + 1; int * ptr = (int *)0x ; void * ptr2 = ((void *) (*ptr + 1)); This is on a 64-bit machine!

Carnegie Mellon 15 More pointer arithmetic int ** ptr = (int **)0x ; int * ptr2 = (int *) (ptr + 1); //ptr2 = 0x char ** ptr = (char **)0x ; short * ptr2 = (short *) (ptr + 1); //ptr2 = 0x int * ptr = (int *)0x ; void * ptr2 = &ptr + 1;//ptr2 = ?? //ptr2 is actually 8 bytes higher than the address of the variable ptr, which is somewhere on the stack int * ptr = (int *)0x ; void * ptr2 = ((void *) (*ptr + 1)); //ptr2 = ?? //ptr2 is one plus the value at 0x  (so undefined, but it probably segfaults)

Carnegie Mellon 16 Pointer dereferencing Basics  It must be a POINTER type (or cast to one) at the time of dereference  Cannot dereference expressions with type void*  Dereferencing a t* evaluates to a value with type t

Carnegie Mellon 17 Pointer dereferencing What gets “returned?” int * ptr1 = malloc(sizeof(int)); *ptr1 = 0xdeadbeef; int val1 = *ptr1; int val2 = (int) *((char *) ptr1); What are val1 and val2?

Carnegie Mellon 18 Pointer dereferencing What gets “returned?” int * ptr1 = malloc(sizeof(int)); *ptr1 = 0xdeadbeef; int val1 = *ptr1; int val2 = (int) *((char *) ptr1); //val1 = 0xdeadbeef; //val2 = 0xffffffef; What happened??

Carnegie Mellon 19 Malloc

Carnegie Mellon 20 Malloc basics What is dynamic memory allocation? Terms you will need to know  malloc/ calloc / realloc  free  sbrk  payload  fragmentation (internal vs. external)  coalescing  Bi-directional  Immediate vs. Deferred

Carnegie Mellon 21

Carnegie Mellon 22 Fragmentation Internal fragmentation  Result of payload being smaller than block size.  void * m1 = malloc(3); void * m1 = malloc(3);  m1,m2 both have to be aligned to 8 bytes… External fragmentation

Carnegie Mellon 23

Carnegie Mellon 24 Implementation Hurdles How do we know where the blocks are? How do we know how big the blocks are? How do we know which blocks are free? Remember: can’t buffer calls to malloc and free… must deal with them real-time. Remember: calls to free only takes a pointer, not a pointer and a size. Solution: Need a data structure to store information on the “blocks”  Where do I keep this data structure?  We can’t allocate a space for it, that’s what we are writing!

Carnegie Mellon 25 The data structure Requirements:  The data structure needs to tell us where the blocks are, how big they are, and whether they’re free  We need to be able to CHANGE the data structure during calls to malloc and free  We need to be able to find the next free block that is “a good fit for” a given payload  We need to be able to quickly mark a block as free/allocated  We need to be able to detect when we’re out of blocks.  What do we do when we’re out of blocks?

Carnegie Mellon 26 The data structure It would be convenient if it worked like: malloc_struct malloc_data_structure; … ptr = malloc(100, &malloc_data_structure); … free(ptr, &malloc_data_structure); … Instead all we have is the memory we’re giving out.  All of it doesn’t have to be payload! We can use some of that for our data structure.

Carnegie Mellon 27 The data structure The data structure IS your memory! A start:   What goes in the header?  That’s your job!  Lets say somebody calls free(p2), how can I coalesce?  Maybe you need a footer? Maybe not?

Carnegie Mellon 28 The data structure Common types  Implicit List  Root -> block1 -> block2 -> block3 -> …  Explicit List  Root -> free block 1 -> free block 2 -> free block 3 -> …  Segregated List  Small-malloc root -> free small block 1 -> free small block 2 -> …  Medium-malloc root -> free medium block 1 -> …  Large-malloc root -> free block chunk1 -> …

Carnegie Mellon 29 Implicit List From the root, can traverse across blocks using headers Can find a free block this way Can take a while to find a free block  How would you know when you have to call sbrk?

Carnegie Mellon 30 Explicit List Improvement over implicit list From a root, keep track of all free blocks in a (doubly) linked list  Remember a doubly linked list has pointers to next and previous When malloc is called, can now find a free block quickly  What happens if the list is a bunch of small free blocks but we want a really big one?  How can we speed this up?

Carnegie Mellon 31 Segregated List An optimization for explicit lists Can be thought of as multiple explicit lists  What should we group by? Grouped by size – let’s us quickly find a block of the size we want What size/number of buckets should we use?  This is up to you to decide

Carnegie Mellon 32 Design Considerations I found a chunk that fits the necessary payload… should I look for a better fit or not? (First fit vs. Best fit) Splitting a free block: void* ptr = malloc(200); free(ptr); ptr = malloc(50); //use same space, then “mark” remaining bytes as free void* ptr = malloc(200); free(ptr); ptr = malloc(192);//use same space, then “mark” remaining bytes as free??

Carnegie Mellon 33 Design Considerations Free blocks: address-ordered or LIFO  What’s the difference?  Pros and cons? Coalescing  When do you coalesce? You will need to be using an explicit list at minimum score points  But don’t try to go straight to your final design, build it up iteratively.

Carnegie Mellon 34 Heap Checker Part of the assignment is writing a heap checker  This is here to help you.  Write the heap checker as you go, don’t think of it as something to do at the end  A good heap checker will make debugging much, much easier Heap checker tips  Heap checker should run silently until it finds an error  Otherwise you will get more output than is useful  You might find it useful to add a “verbose” flag, however  Consider using a macro to turn the heap checker on and off  This way you don’t have to edit all of the places you call it  There is a built-in macro called __LINE__ that gets replaced with the line number it’s on  You can use this to make the heap checker tell you where it failed

Carnegie Mellon 35 Demo Running Traces Heap checker Using gprof to profile