Animation of the Lisp2 GC · STEP 2 computeAddresses(): for each visited array, compute a new...
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