0% found this document useful (0 votes)
22 views

17 Allocation Basic

Uploaded by

Việt Phạm
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
22 views

17 Allocation Basic

Uploaded by

Việt Phạm
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 33

Carnegie Mellon

Dynamic  Memory  Alloca/on:    


Basic  Concepts  
15-­‐213:  Introduc0on  to  Computer  Systems    
17th  Lecture,  Oct.  21,  2010  

Instructors:    
Randy  Bryant  and  Dave  O’Hallaron  

1
Carnegie Mellon

Today  
 Basic  concepts  
 Implicit  free  lists  

2
Carnegie Mellon

Dynamic  Memory  Alloca/on    


 Programmers  use   Applica/on  
dynamic  memory   Dynamic  Memory  Allocator  
allocators  (such  as  
Heap  
malloc)  to  acquire  VM  
at  run  /me.    
 For  data  structures  whose   User  stack  
size  is  only  known  at  
run0me.  
Top  of  heap  
 Dynamic  memory    (brk ptr)  
Heap  (via  malloc)  
allocators  manage  an  
area  of  process  virtual   Unini/alized  data  (.bss)  
memory  known  as  the   Ini/alized  data  (.data)  
heap.     Program  text  (.text)  

0  
3
Carnegie Mellon

Dynamic  Memory  Alloca/on  

 Allocator  maintains  heap  as  collec/on  of  variable  sized  


blocks,  which  are  either  allocated  or  free  
 Types  of  allocators  
 Explicit  allocator:    applica0on  allocates  and  frees  space    
E.g.,    malloc  and  free  in  C  

 Implicit  allocator:  applica0on  allocates,  but  does  not  free  space  
 E.g.  garbage  collec0on  in  Java,  ML,  and  Lisp  

 Will  discuss  simple  explicit  memory  alloca/on  today  

4
Carnegie Mellon

The  malloc  Package  


#include <stdlib.h>
void *malloc(size_t size)
 Successful:  
 Returns  a  pointer  to  a  memory  block  of  at  least  size  bytes  
(typically)  aligned  to  8-­‐byte  boundary  
 If  size == 0,  returns  NULL  
 Unsuccessful:  returns  NULL  (0)  and  sets  errno
void free(void *p)
 Returns  the  block  pointed  at  by  p  to  pool  of  available  memory  
 p  must  come  from  a  previous  call  to  malloc or  realloc
Other  func/ons  
 calloc:  Version  of  malloc  that  ini0alizes  allocated  block  to  zero.    
 realloc:  Changes  the  size  of  a  previously  allocated  block.  
 sbrk:  Used  internally  by  allocators  to  grow  or  shrink  the  heap  
5
Carnegie Mellon

malloc  Example  
void foo(int n, int m) {
int i, *p;

/* Allocate a block of n ints */


p = (int *) malloc(n * sizeof(int));
if (p == NULL) {
perror("malloc");
exit(0);
}

/* Initialize allocated block */


for (i=0; i<n; i++)
p[i] = i;

/* Return p to the heap */


free(p);
}

6
Carnegie Mellon

Assump/ons  Made  in  This  Lecture  


 Memory  is  word  addressed  (each  word  can  hold  a  
pointer)  

Allocated  block   Free  block  


(4  words)   (3  words)   Free  word  
Allocated  word  

7
Carnegie Mellon

Alloca/on  Example  
p1 = malloc(4)

p2 = malloc(5)

p3 = malloc(6)

free(p2)

p4 = malloc(2)

8
Carnegie Mellon

Constraints  
 Applica/ons  
 Can  issue  arbitrary  sequence  of  malloc  and  free  requests  
 free  request  must  be  to  a  malloc’d    block  

 Allocators  
 Can’t  control  number  or  size  of  allocated  blocks  
 Must  respond  immediately  to  malloc  requests  
 i.e.,  can’t  reorder  or  buffer  requests  
 Must  allocate  blocks  from  free  memory  
 i.e.,  can  only  place  allocated  blocks  in  free  memory  
 Must  align  blocks  so  they  sa0sfy  all  alignment  requirements  
 8  byte  alignment  for  GNU  malloc  (libc  malloc)  on  Linux  boxes  
 Can  manipulate  and  modify  only  free  memory  
 Can’t  move  the  allocated  blocks  once  they  are  malloc’d  
 i.e.,  compac0on  is  not  allowed  
9
Carnegie Mellon

Performance  Goal:  Throughput  


 Given  some  sequence  of  malloc  and  free  requests:  
  R0,  R1,  ...,  Rk,  ...  ,  Rn-­‐1  

 Goals:  maximize  throughput  and  peak  memory  u/liza/on  


 These  goals  are  o]en  conflic0ng  

 Throughput:  
 Number  of  completed  requests  per  unit  0me  
 Example:  
 5,000    malloc  calls  and  5,000  free  calls  in  10  seconds    
 Throughput  is  1,000  opera0ons/second  

10
Carnegie Mellon

Performance  Goal:  Peak  Memory  U/liza/on  


 Given  some  sequence  of  malloc  and  free  requests:  
  R0,  R1,  ...,  Rk,  ...  ,  Rn-­‐1  
 Def:  Aggregate  payload  Pk    
  malloc(p)  results  in  a  block  with  a  payload  of  p  bytes  
 A]er  request  Rk  has  completed,  the  aggregate  payload  Pk    is  the  sum  of  
currently  allocated  payloads  

 Def:  Current  heap  size  Hk  


 Assume  Hk  is  monotonically  nondecreasing  
 i.e.,  heap  only  grows  when  allocator  uses  sbrk

 Def:  Peak  memory  u@liza@on  aAer  k  requests    


 Uk  =  (  maxi<k  Pi  )    /    Hk  

11
Carnegie Mellon

Fragmenta/on  
 Poor  memory  u/liza/on  caused  by  fragmenta@on  
 internal  fragmenta0on  
 external  fragmenta0on  

12
Carnegie Mellon

Internal  Fragmenta/on  
 For  a  given  block,  internal  fragmenta@on  occurs  if  payload  is  
smaller  than  block  size  

Block  

Internal     Internal    
Payload  
fragmenta/on   fragmenta/on  

 Caused  by    
 Overhead  of  maintaining  heap  data  structures  
 Padding  for  alignment  purposes  
 Explicit  policy  decisions    
(e.g.,  to  return  a  big  block  to  sa0sfy  a  small  request)  

 Depends  only  on  the  paUern  of  previous  requests  


 Thus,  easy  to  measure  
13
Carnegie Mellon

External  Fragmenta/on  
 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!  (what  would  happen  now?)  

 Depends  on  the  paUern  of  future  requests  


 Thus,  difficult  to  measure  
14
Carnegie Mellon

Implementa/on  Issues  
 How  do  we  know  how  much  memory  to  free  given  just  a  
pointer?  

 How  do  we  keep  track  of  the  free  blocks?  

 What  do  we  do  with  the  extra  space  when  alloca/ng  a  
structure  that  is  smaller  than  the  free  block  it  is  placed  in?  

 How  do  we  pick  a  block  to  use  for  alloca/on  -­‐-­‐  many  
might  fit?  

 How  do  we  reinsert  freed  block?  


15
Carnegie Mellon

Knowing  How  Much  to  Free  


 Standard  method  
 Keep  the  length  of  a  block  in  the  word  preceding  the  block.  
This  word  is  o]en  called  the  header  field  or  header  

 Requires  an  extra  word  for  every  allocated  block  

p0

p0 = malloc(4) 5  

block  size   data  

free(p0)

16
Carnegie Mellon

Keeping  Track  of  Free  Blocks  


 Method  1:  Implicit  list  using  length—links  all  blocks  

5 4   6   2  

 Method  2:  Explicit  list  among  the  free  blocks  using  pointers  

5 4   6   2  

 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  
17
Carnegie Mellon

Today  
 Basic  concepts  
 Implicit  free  lists  

18
Carnegie Mellon

Method  1:  Implicit  List  


 For  each  block  we  need  both  size  and  alloca/on  status  
 Could  store  this  informa0on  in  two  words:  wasteful!  
 Standard  trick  
 If  blocks  are  aligned,  some  low-­‐order  address  bits  are  always  0  
 Instead  of  storing  an  always-­‐0  bit,  use  it  as  a  allocated/free  flag  
 When  reading  size  word,  must  mask  out  this  bit  
1  word  

Size   a   a  =  1:  Allocated  block      


a  =  0:  Free  block  
Format  of  
allocated  and   Size:  block  size  
Payload  
free  blocks  
Payload:  applica/on  data  
(allocated  blocks  only)  
Op/onal  
padding  
19
Carnegie Mellon

Detailed  Implicit  Free  List  Example  

Unused  
Start    
of     8/0   16/1   32/0   16/1   0/1  
heap  

Double-­‐word   Allocated  blocks:  shaded  


aligned   Free  blocks:  unshaded  
Headers:  labeled  with  size  in  bytes/allocated  bit  

20
Carnegie Mellon

Implicit  List:  Finding  a  Free  Block  


 First  fit:  
 Search  list  from  beginning,  choose  first  free  block  that  fits:  
p = start;
while ((p < end) && \\ not passed end
((*p & 1) || \\ already allocated
(*p <= len))) \\ too small
p = p + (*p & -2); \\ goto next block (word addressed)

 Can  take  linear  0me  in  total  number  of  blocks  (allocated  and  free)  
 In  prac0ce  it  can  cause  “splinters”  at  beginning  of  list  
 Next  fit:  
 Like  first  fit,  but  search  list  star0ng  where  previous  search  finished  
 Should  o]en  be  faster  than  first  fit:  avoids  re-­‐scanning  unhelpful  blocks  
 Some  research  suggests  that  fragmenta0on  is  worse  
 Best  fit:  
 Search  the  list,  choose  the  best  free  block:  fits,  with  fewest  bytes  le]  over  
 Keeps  fragments  small—usually  helps  fragmenta0on  
 Will  typically  run  slower  than  first  fit   21
Carnegie Mellon

Implicit  List:  Alloca/ng  in  Free  Block  


 Alloca/ng  in  a  free  block:  spliOng  
 Since  allocated  space  might  be  smaller  than  free  space,  we  might  want  
to  split  the  block  

4   4   6   2  

p  

addblock(p, 4)

4   4   4   2   2  

void addblock(ptr p, int len) {


int newsize = ((len + 1) >> 1) << 1; // round up to even
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
22
Carnegie Mellon

Implicit  List:  Freeing  a  Block  


 Simplest  implementa/on:  
 Need  only  clear  the  “allocated”  flag  
void free_block(ptr p) { *p = *p & -2 }

 But  can  lead  to  “false  fragmenta0on”    

4   4   4   2   2  

free(p) p

4   4   4   2   2  

malloc(5) Oops!  

There is enough free space, but the allocator won’t be able to find it

23
Carnegie Mellon

Implicit  List:  Coalescing  


 Join  (coalesce)  with  next/previous  blocks,  if  they  are  free  
 Coalescing  with  next  block  

4   4   4   2   2  
logically  
p
free(p) gone  
4   4   6   2   2  

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

 But  how  do  we  coalesce  with  previous  block?  

24
Carnegie Mellon

Implicit  List:  Bidirec/onal  Coalescing    


 Boundary  tags  [Knuth73]  
 Replicate  size/allocated  word  at  “bomom”  (end)  of  free  blocks  
 Allows  us  to  traverse  the  “list”  backwards,  but  requires  extra  space  
 Important  and  general  technique!  

4   4   4   4   6   6   4   4  

Header   Size   a   a  =  1:  Allocated  block      


a  =  0:  Free  block  
Format  of  
Size:  Total  block  size  
allocated  and   Payload  and  
free  blocks   padding  
Payload:  Applica/on  data  
(allocated  blocks  only)  
Boundary  tag   Size   a  
(footer)  
25
Carnegie Mellon

Constant  Time  Coalescing  

Case  1   Case  2   Case  3   Case  4  

Allocated   Allocated   Free   Free  


Block  being  
freed  
Allocated   Free   Allocated   Free  

26
Carnegie Mellon

Constant  Time  Coalescing  (Case  1)  

m1   1   m1   1  

m1   1   m1   1  
n   1   n   0  

n   1   n   0  
m2   1   m2   1  

m2   1   m2   1  

27
Carnegie Mellon

Constant  Time  Coalescing  (Case  2)  

m1   1   m1   1  

m1   1   m1   1  
n   1   n+m2   0  

n   1  
m2   0  

m2   0   n+m2   0  

28
Carnegie Mellon

Constant  Time  Coalescing  (Case  3)  

m1   0   n+m1   0  

m1   0  
n   1  

n   1   n+m1   0  
m2   1   m2   1  

m2   1   m2   1  

29
Carnegie Mellon

Constant  Time  Coalescing  (Case  4)  

m1   0   n+m1+m2   0  

m1   0  
n   1  

n   1  
m2   0  

m2   0   n+m1+m2   0  

30
Carnegie Mellon

Disadvantages  of  Boundary  Tags  


 Internal  fragmenta/on  

 Can  it  be  op/mized?  


 Which  blocks  need  the  footer  tag?  
 What  does  that  mean?  

31
Carnegie Mellon

Summary  of  Key  Allocator  Policies  


 Placement  policy:  
 First-­‐fit,  next-­‐fit,  best-­‐fit,  etc.  
 Trades  off  lower  throughput  for  less  fragmenta0on    
 Interes@ng  observa@on:  segregated  free  lists  (next  lecture)  
approximate  a  best  fit  placement  policy  without  having  to  search  en0re  
free  list  

 Splifng  policy:  
 When  do  we  go  ahead  and  split  free  blocks?  
 How  much  internal  fragmenta0on  are  we  willing  to  tolerate?  
 Coalescing  policy:  
 Immediate  coalescing:  coalesce  each  0me  free  is  called    
 Deferred  coalescing:  try  to  improve  performance  of  free  by  deferring  
coalescing  un0l  needed.  Examples:  
 Coalesce  as  you  scan  the  free  list  for  malloc  
 Coalesce  when  the  amount  of  external  fragmenta0on  reaches  
some  threshold   32
Carnegie Mellon

Implicit  Lists:  Summary  


 Implementa/on:  very  simple  
 Allocate  cost:    
 linear  0me  worst  case  
 Free  cost:    
 constant  0me  worst  case  
 even  with  coalescing  
 Memory  usage:    
 will  depend  on  placement  policy  
 First-­‐fit,  next-­‐fit  or  best-­‐fit  

 Not  used  in  prac/ce  for  malloc/free because  of  linear-­‐


/me  alloca/on  
 used  in  many  special  purpose  applica0ons  

 However,  the  concepts  of  splifng  and  boundary  tag  


coalescing  are  general  to  all  allocators  
33

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy