Presentation is loading. Please wait.

Presentation is loading. Please wait.

CS703 - Advanced Operating Systems

Similar presentations


Presentation on theme: "CS703 - Advanced Operating Systems"— Presentation transcript:

1 CS703 - Advanced Operating Systems
By Mr. Farhan Zaidi

2 Lecture No. 20

3 Overview of today’s lecture
Goals of a good allocator Memory Fragmentation Internal and external Implementation issues of memory allocators Knowing how much to free Tracking free blocks Implicit list based allocator details

4 Goals of Good malloc/free
Primary goals Good time performance for malloc and free Ideally should take constant time (not always possible) Should certainly not take linear time in the number of blocks Good space utilization User allocated structures should be large fraction of the heap. Want to minimize “fragmentation”.

5 Goals of Good malloc/free ( cont.)
Some other goals Good locality properties Structures allocated close in time should be close in space “Similar” objects should be allocated close in space Robust Can check that free(p1) is on a valid allocated object p1 Can check that memory references are to allocated space

6 Internal Fragmentation
Poor memory utilization caused by fragmentation. Comes in two forms: internal and external fragmentation Internal fragmentation For some block, internal fragmentation is the difference between the block size and the payload size. Caused by overhead of maintaining heap data structures, padding for alignment purposes, or explicit policy decisions (e.g., not to split the block). Depends only on the pattern of previous requests, and thus is easy to measure. block Internal fragmentation Internal fragmentation payload

7 External Fragmentation
Occurs when there is enough aggregate heap memory, but no single free block is large enough p1 = malloc(4) p2 = malloc(5) p3 = malloc(6) free(p2) p4 = malloc(6) oops! External fragmentation depends on the pattern of future requests, and thus is difficult to measure.

8 Impossible to “solve” fragmentation
If you read allocation papers or books to find the best allocator(!?!?!) it can be frustrating: all discussions revolve around tradeoffs the reason? There cannot be a best allocator Theoretical result: for any possible allocation algorithm, there exist streams of allocation and deallocation requests that defeat the allocator and force it into severe fragmentation. “pretty well” = ~20% fragmentation under many workloads

9 p1 = malloc(1) p0 free(p0)

10 Knowing How Much to Free
Standard method Keep the length of a block in the word preceding the block. This word is often called the header field or header free(p0) p0 = malloc(4) p0 Block size data 5

11 Keeping Track of Free Blocks
Method 1: Implicit list using lengths -- links all blocks Method 2: Explicit list among the free blocks using pointers within the free blocks Method 3: Segregated free list Different free lists for different size classes Method 4: Blocks sorted by size Can use a balanced tree (e.g. Red-Black tree) with pointers within each free block, and the length used as a key 5 4 2 6 5 4 2 6

12 Method 1: Implicit List Need to identify whether each block is free or allocated 1 word a = 1: allocated block a = 0: free block size: block size payload: application data (allocated blocks only) size a payload Format of allocated and free blocks optional padding

13 Implicit List: Finding a Free Block
First fit: Search list from beginning, choose first free block that fits Next fit: Like first-fit, but search list from location of end of previous search Best fit: Search the list, choose the free block with the closest size that fits

14 Implicit List: Allocating in Free Block
Allocating in a free block - splitting p 4 2 6 void addblock(ptr p, int len) { int newsize = ((len + 1) >> 1) << 1; // add 1 and round up int oldsize = *p & -2; // mask out low bit *p = newsize | 1; // set new length if (newsize < oldsize) *(p+newsize) = oldsize - newsize; // set length in remaining } // part of block 4 2 addblock(p, 4)

15 Implicit List: Freeing a Block
Simplest implementation: Only need to clear allocated flag void free_block(ptr p) { *p = *p & -2} 4 4 4 2 2 p free(p) 4 4 4 2 2 malloc(5) Oops!

16 Implicit List: Coalescing
Join (coelesce) with next and/or previous block if they are free Coalescing with next block void free_block(ptr p) { *p = *p & -2; // clear allocated flag next = p + *p; // find next block if ((*next & 1) == 0) *p = *p + *next; // add to this block if } // not allocated 4 4 4 2 2 p free(p) 4 4 6 2

17 Implicit List: Bidirectional Coalescing
Boundary tags [Knuth73] Replicate size/allocated word at bottom of free blocks Allows us to traverse the “list” backwards, but requires extra space 4 6


Download ppt "CS703 - Advanced Operating Systems"

Similar presentations


Ads by Google