Animation of the Lisp2 GC · STEP 2 computeAddresses(): for each visited array, compute a new...

61
Animation of the Lisp2 GC (CGO Chapter 10)

Transcript of Animation of the Lisp2 GC · STEP 2 computeAddresses(): for each visited array, compute a new...

  • Animation of the Lisp2 GC

    (CGO Chapter 10)

  • STEP 1

    mark(addr): recursively mark all arrays that are reachable from the array beginning at address addr.

  • mark(1)

    10 7

    1: 2: 3:

    2 2

    4:

    31 7

    5: 6:

    3 11

    8: 7: 9: 10:

    40 11 2 62

    12: 13: 11:

    0

    Heap

  • mark(1)

    10 7

    1: 2: 3:

    2 2

    4:

    31 7

    5: 6:

    3 11

    8: 7: 9: 10:

    40 11 2 62

    12: 13: 11:

    0

    Heap

  • mark(1)

    10 7

    1: 2: 3:

    2 2

    4:

    31 7

    5: 6:

    3 11

    8: 7: 9: 10:

    40 11 2 62

    12: 13: 11:

    0

    Heap

  • mark(1)

    10 7

    1: 2: 3:

    2 2

    4:

    31 7

    5: 6:

    3 11

    8: 7: 9: 10:

    40 11 2 62

    12: 13: 11:

    0

    Heap

  • mark(7)

    10 7

    1: 2: 3:

    2 2

    4:

    31 7

    5: 6:

    3 11

    8: 7: 9: 10:

    40 11 2 62

    12: 13: 11:

    0

    Heap

  • mark(7)

    10 7

    1: 2: 3:

    2 2

    4:

    31 7

    5: 6:

    3 11

    8: 7: 9: 10:

    40 11 2 62

    12: 13: 11:

    0

    Heap

  • mark(11)

    10 7

    1: 2: 3:

    2 2

    4:

    31 7

    5: 6:

    3 11

    8: 7: 9: 10:

    40 11 2 62

    12: 13: 11:

    0

    Heap

  • mark(11)

    10 7

    1: 2: 3:

    2 2

    4:

    31 7

    5: 6:

    3 11

    8: 7: 9: 10:

    40 11 2 62

    12: 13: 11:

    0

    Heap

  • mark(11)

    10 7

    1: 2: 3:

    2 2

    4:

    31 7

    5: 6:

    3 11

    8: 7: 9: 10:

    40 11 2 62

    12: 13: 11:

    0

    Heap

  • mark(11), done!

    10 7

    1: 2: 3:

    2 2

    4:

    31 7

    5: 6:

    3 11

    8: 7: 9: 10:

    40 11 2 62

    12: 13: 11:

    0

    Heap

  • Resume mark(7) after recursive call completes

    10 7

    1: 2: 3:

    2 2

    4:

    31 7

    5: 6:

    3 11

    8: 7: 9: 10:

    40 11 2 62

    12: 13: 11:

    0

    Heap

  • mark(7)

    10 7

    1: 2: 3:

    2 2

    4:

    31 7

    5: 6:

    3 11

    8: 7: 9: 10:

    40 11 2 62

    12: 13: 11:

    0

    Heap

  • mark(11), already visited

    10 7

    1: 2: 3:

    2 2

    4:

    31 7

    5: 6:

    3 11

    8: 7: 9: 10:

    40 11 2 62

    12: 13: 11:

    0

    Heap

  • mark(7), done!

    10 7

    1: 2: 3:

    2 2

    4:

    31 7

    5: 6:

    3 11

    8: 7: 9: 10:

    40 11 2 62

    12: 13: 11:

    0

    Heap

  • mark(1), done!

    10 7

    1: 2: 3:

    2 2

    4:

    31 7

    5: 6:

    3 11

    8: 7: 9: 10:

    40 11 2 62

    12: 13: 11:

    0

    Heap

  • STEP 2

    computeAddresses(): for each visited array, compute a new address for the array in the compacted heap.

  • computeAddresses()

    10 7

    1: 2: 3:

    2 2

    4:

    31 7

    5: 6:

    3 11

    8: 7: 9: 10:

    40 11 2 62

    12: 13: 11:

    0

    Heap

    scan

    new = 1

  • Set forwarding address

    10 7

    1: 2: 3:

    2 1 2

    4:

    31 7

    5: 6:

    3 11

    8: 7: 9: 10:

    40 11 2 62

    12: 13: 11:

    0

    Heap

    scan

    new = 1

  • new ← new + 3

    10 7

    1: 2: 3:

    2 1 2

    4:

    31 7

    5: 6:

    3 11

    8: 7: 9: 10:

    40 11 2 62

    12: 13: 11:

    0

    Heap

    scan

    new = 4

  • Advance scan pointer

    10 7

    1: 2: 3:

    2 1 2

    4:

    31 7

    5: 6:

    3 11

    8: 7: 9: 10:

    40 11 2 62

    12: 13: 11:

    0

    Heap

    scan

    new = 4

  • Advance scan pointer

    10 7

    1: 2: 3:

    2 1 2

    4:

    31 7

    5: 6:

    3 11

    8: 7: 9: 10:

    40 11 2 62

    12: 13: 11:

    0

    Heap

    scan

    new = 4

  • Set forwarding address

    10 7

    1: 2: 3:

    2 1 2

    4:

    31 7

    5: 6:

    3 4 11

    8: 7: 9: 10:

    40 11 2 62

    12: 13: 11:

    0

    Heap

    scan

    new = 4

  • new ← new + 4

    10 7

    1: 2: 3:

    2 1 2

    4:

    31 7

    5: 6:

    3 4 11

    8: 7: 9: 10:

    40 11 2 62

    12: 13: 11:

    0

    Heap

    scan

    new = 8

  • Advance scan pointer

    10 7

    1: 2: 3:

    2 1 2

    4:

    31 7

    5: 6:

    3 4 11

    8: 7: 9: 10:

    40 11 2 62

    12: 13: 11:

    0

    Heap

    scan

    new = 8

  • Set forwarding address

    10 7

    1: 2: 3:

    2 1 2

    4:

    31 7

    5: 6:

    3 4 11

    8: 7: 9: 10:

    40 11 2 8 62

    12: 13: 11:

    0

    Heap

    scan

    new = 8

  • new ← new + 3

    10 7

    1: 2: 3:

    2 1 2

    4:

    31 7

    5: 6:

    3 4 11

    8: 7: 9: 10:

    40 11 2 8 62

    12: 13: 11:

    0

    Heap

    scan

    new = 11

  • STEP 3

    updatePointers(): update pointers to point to the forwarding addresses.

  • updatePointers()

    10 7

    1: 2: 3:

    2 1 2

    4:

    31 7

    5: 6:

    3 4 11

    8: 7: 9: 10:

    40 11 2 8 62

    12: 13: 11:

    0

    Heap

    scan

  • updatePointers()

    10 7

    1: 2: 3:

    2 1 2

    4:

    31 7

    5: 6:

    3 4 11

    8: 7: 9: 10:

    40 11 2 8 62

    12: 13: 11:

    0

    Heap

    scan

  • updatePointers()

    10 7

    1: 2: 3:

    2 1 2

    4:

    31 7

    5: 6:

    3 4 11

    8: 7: 9: 10:

    40 11 2 8 62

    12: 13: 11:

    0

    Heap

    scan

  • updatePointers()

    10 4

    1: 2: 3:

    2 1 2

    4:

    31 7

    5: 6:

    3 4 11

    8: 7: 9: 10:

    40 11 2 8 62

    12: 13: 11:

    0

    Heap

    scan

  • updatePointers()

    10 4

    1: 2: 3:

    2 1 2

    4:

    31 7

    5: 6:

    3 4 11

    8: 7: 9: 10:

    40 11 2 8 62

    12: 13: 11:

    0

    Heap

    scan

  • updatePointers()

    10 4

    1: 2: 3:

    2 1 2

    4:

    31 7

    5: 6:

    3 4 11

    8: 7: 9: 10:

    40 11 2 8 62

    12: 13: 11:

    0

    Heap

    scan

  • updatePointers()

    10 4

    1: 2: 3:

    2 1 2

    4:

    31 7

    5: 6:

    3 4 11

    8: 7: 9: 10:

    40 11 2 8 62

    12: 13: 11:

    0

    Heap

    scan

  • updatePointers()

    10 4

    1: 2: 3:

    2 1 2

    4:

    31 7

    5: 6:

    3 4 11

    8: 7: 9: 10:

    40 11 2 8 62

    12: 13: 11:

    0

    Heap

    scan

  • updatePointers()

    10 4

    1: 2: 3:

    2 1 2

    4:

    31 7

    5: 6:

    3 4 8

    8: 7: 9: 10:

    40 11 2 8 62

    12: 13: 11:

    0

    Heap

    scan

  • updatePointers()

    10 4

    1: 2: 3:

    2 1 2

    4:

    31 7

    5: 6:

    3 4 8

    8: 7: 9: 10:

    40 11 2 8 62

    12: 13: 11:

    0

    Heap

    scan

  • updatePointers()

    10 4

    1: 2: 3:

    2 1 2

    4:

    31 7

    5: 6:

    3 4 8

    8: 7: 9: 10:

    40 11 2 8 62

    12: 13: 11:

    0

    Heap

    scan

  • updatePointers()

    10 4

    1: 2: 3:

    2 1 2

    4:

    31 7

    5: 6:

    3 4 8

    8: 7: 9: 10:

    40 8 2 8 62

    12: 13: 11:

    0

    Heap

    scan

  • updatePointers()

    10 4

    1: 2: 3:

    2 1 2

    4:

    31 7

    5: 6:

    3 4 8

    8: 7: 9: 10:

    40 8 2 8 62

    12: 13: 11:

    0

    Heap

    scan

  • updatePointers()

    10 4

    1: 2: 3:

    2 1 2

    4:

    31 7

    5: 6:

    3 4 8

    8: 7: 9: 10:

    40 8 2 8 62

    12: 13: 11:

    0

    Heap

    scan

  • updatePointers()

    10 4

    1: 2: 3:

    2 1 2

    4:

    31 7

    5: 6:

    3 4 8

    8: 7: 9: 10:

    40 8 2 8 62

    12: 13: 11:

    0

    Heap

    scan

  • STEP 4

    relocate(): relocate each array to its forwarding addresses.

  • updatePointers()

    10 4

    1: 2: 3:

    2 1 2

    4:

    31 7

    5: 6:

    3 4 8

    8: 7: 9: 10:

    40 8 2 8 62

    12: 13: 11:

    0

    Heap

    scan

  • updatePointers()

    10 4

    1: 2: 3:

    2 1 2

    4:

    31 7

    5: 6:

    3 4 8

    8: 7: 9: 10:

    40 8 2 8 62

    12: 13: 11:

    0

    Heap

    scan

    relocate to address 1

  • updatePointers()

    10 4

    1: 2: 3:

    2 2

    4:

    31 7

    5: 6:

    3 4 8

    8: 7: 9: 10:

    40 8 2 8 62

    12: 13: 11:

    0

    Heap

    scan

  • updatePointers()

    10 4

    1: 2: 3:

    2 2

    4:

    31 7

    5: 6:

    3 4 8

    8: 7: 9: 10:

    40 8 2 8 62

    12: 13: 11:

    0

    Heap

    scan

  • updatePointers()

    10 4

    1: 2: 3:

    2 2

    4:

    31 7

    5: 6:

    3 4 8

    8: 7: 9: 10:

    40 8 2 8 62

    12: 13: 11:

    0

    Heap

    scan

  • updatePointers()

    10 4

    1: 2: 3:

    2 2

    4:

    31 7

    5: 6:

    3 4 8

    8: 7: 9: 10:

    40 8 2 8 62

    12: 13: 11:

    0

    Heap

    scan

    relocate to address 4

  • updatePointers()

    10 4

    1: 2: 3:

    2 3

    4:

    31 7

    5: 6:

    3 4 8

    8: 7: 9: 10:

    40 8 2 8 62

    12: 13: 11:

    0

    Heap

    scan

  • updatePointers()

    10 4

    1: 2: 3:

    2 3

    4:

    8 7

    5: 6:

    3 4 8

    8: 7: 9: 10:

    40 8 2 8 62

    12: 13: 11:

    0

    Heap

    scan

  • updatePointers()

    10 4

    1: 2: 3:

    2 3

    4:

    8 40

    5: 6:

    3 4 8

    8: 7: 9: 10:

    40 8 2 8 62

    12: 13: 11:

    0

    Heap

    scan

  • updatePointers()

    10 4

    1: 2: 3:

    2 3

    4:

    8 40

    5: 6:

    8

    8: 7: 9: 10:

    40 8 2 8 62

    12: 13: 11:

    0

    Heap

    scan

    8

  • updatePointers()

    10 4

    1: 2: 3:

    2 3

    4:

    8 40

    5: 6:

    8

    8: 7: 9: 10:

    40 8 2 8 62

    12: 13: 11:

    0

    Heap

    scan

    8

  • updatePointers()

    10 4

    1: 2: 3:

    2 3

    4:

    8 40

    5: 6:

    8

    8: 7: 9: 10:

    40 8 2 8 62

    12: 13: 11:

    0

    Heap

    scan

    8

    relocate to address 8

  • updatePointers()

    10 4

    1: 2: 3:

    2 3

    4:

    8 40

    5: 6: 8: 7: 9: 10:

    40 8 2 8 62

    12: 13: 11:

    0

    Heap

    scan

    8 2

  • updatePointers()

    10 4

    1: 2: 3:

    2 3

    4:

    8 40

    5: 6: 8: 7: 9: 10:

    62 8 2 8 62

    12: 13: 11:

    0

    Heap

    scan

    8 2

  • updatePointers()

    10 4

    1: 2: 3:

    2 3

    4:

    8 40

    5: 6: 8: 7: 9: 10:

    62 0 2 8 62

    12: 13: 11:

    0

    Heap

    scan

    8 2

  • updatePointers()

    10 4

    1: 2: 3:

    2 3

    4:

    8 40

    5: 6: 8: 7: 9: 10:

    62 0

    Heap

    8 2