basic garbage collection techniques [ vi]

39
[email protected] Basic Garbage Collection Techniques 1

Upload: an-khuong

Post on 19-Jun-2015

1.398 views

Category:

Technology


6 download

TRANSCRIPT

Page 1: Basic  Garbage  Collection  Techniques [ Vi]

[email protected]

Basic Garbage Collection Techniques

1

Page 2: Basic  Garbage  Collection  Techniques [ Vi]

Contents1. What is Garbage Collection2. Reference Counting3. Mark-Sweep Collection4. Mark-Compact Collection5. Copying Garbage Collection6. Non-Copy Implicit Collection7. Choosing Among Basic Tracing Techniques8. Problems with Simple Tracing Collectors9. Conservatism in GC

2

Tracing

Page 3: Basic  Garbage  Collection  Techniques [ Vi]

1. Bộ dọn rác (Garbage Collection)

3

Garbage Collection (GC) Tự động khôi phục bộ nhớChức năng của GC là tìm những đối tượng dữ liệu

không còn sử dụng nữa và giải phóng chúng bởi chương trình đang chạy

Tại sao cần GC?A software routine operating on a data structure

should not have to depend what other routines may be operating on the same structure

Nếu tiến trình không giải phóng bộ nhớ đã sử dụng, khoảng trống không sử dụng sẽ ngày càng tăng cho đến khi tiến trình chấm dứt hoặc swap space không còn

Page 4: Basic  Garbage  Collection  Techniques [ Vi]

Explicit Storage Management Hazards

4

Lỗi lập trình có thể dẫn đến lỗi trong quản lý bộ nhớ:Có thể giải phóng vùng nhớ sớm hơn khi cầnCó thể không giải phóng hết vùng nhớ có thể, là

nguyên nhân gây ra thiếu bộ nhớNhững lỗi này đặc biệt nguy hiểm vì thường

xuất hiện sau khi delivery, rất khó debugNhiều lập trình viên cấp phát object tĩnh, tránh

cấp phát trên heap để khỏi quan tâm khi nào giải phóng chúng

Page 5: Basic  Garbage  Collection  Techniques [ Vi]

Explicit Storage Management Hazards

5

Trong nhiều hệ thống lớn, GC được thực thi trong những đối tượng hệ thống (system’s objects)

GC thì không được hỗ trợ bởi ngôn ngữ lập trìnhGây ra lỗi và không tin cậy, những bộ dọn rác

riêng lẽ thường không được sử dụng bởi những ứng dụng khác

Mục đích của GC là giải quyết những issues trên

Page 6: Basic  Garbage  Collection  Techniques [ Vi]

Tính phức tạp của GC

6

GC đôi khi được xem là có chi phí rẻ hơn việc giải phóng tường minh

Một GC tốt làm chương trình chậm 10%Dù có vẻ nhiều nhưng đó là một cái giá thấp để

trả cho:Sự tiện lợi (Convenience)Thời gian phát triển (Development time)Độ tin cậy (Reliability)

Page 7: Basic  Garbage  Collection  Techniques [ Vi]

2 phase chính của GC

7

Dò tìm rác (garbage detection)Phân biệt những đối tượng sống (live objects) từ

rácGiải phóng rác (garbage reclamation)

Giải phóng vùng nhớ của các đối tượng rác, để chương trình đang chạy có thể sử dụng nó

Trong thực tế thì 2 phase này xen kẽ nhau

Page 8: Basic  Garbage  Collection  Techniques [ Vi]

2. Reference Counting

8

Mỗi đối tượng kết hợp với 1 biến đếm số tham chiếu đến nó

Mỗi khi có 1 tham chiếu đến đối tượng được tạo, biến đếm tham chiếu sẽ tăng lên 1 và ngược lại

Khi biến đếm tham chiếu bằng 0, vùng nhớ dành cho đối tượng có thể được giải phóng

Page 9: Basic  Garbage  Collection  Techniques [ Vi]

Reference Counting (RC)

9

Khi đối tượng được giải phóng, thì biến đếm tham chiếu của những đối tượng mà đối tương này trỏ đến sẽ giảm xuống

Việc giải phóng một đối tượng có thể kéo theo việc giải phóng của hàng loại đối tượng khác

Đó là 2 vấn đề chính của RC

Page 10: Basic  Garbage  Collection  Techniques [ Vi]

Vấn đề cấu trúc vòng

10

RC thất bại khi giải phóng cấu trúc vòng

Nguyên nhân từ việc xác định rác

Cấu trúc vòng Cấu trúc vòng không

hiếm trong các chương trình ngày nay:Cây Cấu trúc dữ liệu vòng

Giải pháp được chuyển về cho lập trình viên

Page 11: Basic  Garbage  Collection  Techniques [ Vi]

Hiệu quả của RC

11

Khi một con trỏ được tạo, biến đếm tham chiếu của đối tượng mà nó trỏ đến phải được điều chỉnh. Nếu giá trị của biến con trỏ được chuyển từ con trỏ

này đến con trỏ khác(phép gán), thì hai biến RC của cả hai con trỏ phải được cập nhật, một biến RC của 1 đối tượng sẽ tăng còn biến kia sẽ giảm.

Sau đó phải kiểm tra RC=0 hay khôngNhững biến ngăn xếp mà có thời gian sống ngắn

sẽ phải chịu chi phí lớn cho mô hình RC. Trong trường hợp này biến đếm tham chiếu được tăng lên và giảm trở lại nhanh chóng.

Page 12: Basic  Garbage  Collection  Techniques [ Vi]

Deferred Reference Counting (DRC)

12

Phần lớn chi phí có thể tối ưu bằng cách sử dụng biến cục bộ

Tham chiếu từ biến cục bộ không cần giữ lại. Chúng ta chỉ cần điều chỉnh RC trong heap.

Tuy nhiên chúng ta không thể bỏ qua hoàn toàn các con trỏ trong stack. Vì vậy stack được quét trước khi đối tượng được giải phóng và chỉ khi RC của con trỏ=0 thì nó được giải phóng.

Hạn chế cập nhật RC của đối với con trỏ trong stack sẽ giảm đáng kể chi phí của RC

Page 13: Basic  Garbage  Collection  Techniques [ Vi]

Reference Counting - Recap

13

RC thì không phù hợp với những ứng dụng cần performance cao

Khá phổ biến trong những ứng dụng không sử dụng cấu trúc vòng

Hầu hết file hệ thống sử dụng RC to quản lý file hoặc disk blocks

Mô hình đơn giản

Page 14: Basic  Garbage  Collection  Techniques [ Vi]

3. Mark-Sweep Collection - [McCarthy 1960]Phân biệt đối tượng sống từ rác(Mark phase)

Thực hiện bằng đánh dấu – bắt đầu ở root set và duyệt qua đồ thị các con trỏ có thể đến được

Đánh dấu những đối tượng đi quaThu hồi vùng nhớ rác (Sweep phase)

Sau Mark phase, bộ nhớ sẽ được kiểm tra kỹ lưỡng để tìm ra những đối tượng không được đánh dấu(rác) và thu hồi chúng

Dùng 1 bit làm mark-bit. 1 : đánh dấu0 : không đánh dấu

14

Page 15: Basic  Garbage  Collection  Techniques [ Vi]

Ví dụ

rootroot root

Free_list

Mark phase Sweep phaseBefore

Heap

15

Page 16: Basic  Garbage  Collection  Techniques [ Vi]

Ví dụ

Free list

r1

Free list r1

p

p

Free list r1

16 Live object Marked objectGarbage

Page 17: Basic  Garbage  Collection  Techniques [ Vi]

Thuật toán cơ bản

New(A)= if free_list is empty mark_sweep() if free_list is empty return (“out-of-memory”) pointer = allocate(A) return (pointer)

mark_sweep()= for Ptr in Roots mark(Ptr) sweep()

mark(Obj)= if mark_bit(Obj) == unmarked mark_bit(Obj)=marked for C in Children(Obj) mark(C)

Sweep()= p = Heap_bottom while (p < Heap_top) if (mark_bit(p) == unmarked) then free(p) else mark_bit(p) = unmarked; p=p+size(p)

17

Page 18: Basic  Garbage  Collection  Techniques [ Vi]

Tính chất của Mark & SweepPhân mảnh

Khó cấp phát những đối tượng lớnVài đối tượng nhỏ có thể lấy nhiều khoảng trống

kế tiếpChi phí

Tỉ lệ với kích thước heap, gồm cả đối tượng sống và rác

Locality of reference: Không di chuyển đối tượngĐối tượng được đặt lẫn lộn là nguyên nhân nhiều

page swaps (Thông thường thì những đối tượng trong cluster thường được active cùng lúc)

18

Page 19: Basic  Garbage  Collection  Techniques [ Vi]

Standard Engineering TechniquesMark:

Explicit mark-stack (avoid recursion)Pointer reversalUsing bitmaps

Sweep:Using bitmapsLazy sweep

19

Page 20: Basic  Garbage  Collection  Techniques [ Vi]

4. Mark-Compact CollectionNén sau khi đánh dấu

Mark-Compact giải quyết vấn đề phân mảnh và cấp phát của mark-sweep

Bộ dọn rác sẽ duyệt qua đồ thị con trỏ và thực hiện sao chép từng đối tượng sống sau bước này

Kết quả là một vùng trống liên tục tiếp theo. Đối tượng sống ở một phía và rác ở cũng như vùng trống ở một phía

20

Page 21: Basic  Garbage  Collection  Techniques [ Vi]

Mark-Compact Collection

21

Những đối tượng rác được nén về cuối bộ nhớTiến trình sẽ trải qua một số bước trên bộ nhớ:

Một để tính vị trí mới của đối tượng (địa chỉ)Cập nhật con các con trỏ và di chuyển các đối

tượngThuật toán này chậm hơn đáng kể so với Mark-

Sweep2 thuật toán ví dụ về Mark-Compact:

Two-finger Alg– cho những đối tượng có cùng kích thước

Lisp 2 Alg

Page 22: Basic  Garbage  Collection  Techniques [ Vi]

Thứ tự của đối tượng

22

1 2 3 4

Linearizing

4 1 2 3

Arbitrary

Worst

1 3 4 2 Good

1 2 3 4

Sliding

Best

Arbitrary –thứ tự không được bảo vệ (tùy ý)

Linearizing–đối tượng trỏ đến đối tượng khác được di chuyển về vị trí kề (tuyến tính)

Sliding–các đối tượng được trượt về cuối heap giữ nguyên thứ tự cấp phát

Page 23: Basic  Garbage  Collection  Techniques [ Vi]

Thuật toán Two Finger [Edwards 1974]

Thuật toán đơn giản: Thiết kế cho những đối tượng cùng kích thướcThứ tự của đối tượng sau thuật toán là tùy

ý(arbitrary). 2 phần chính: nén và cập nhật các con trỏ

23

Page 24: Basic  Garbage  Collection  Techniques [ Vi]

Phần I: Nén (Compact)Sử dụng 2 con trỏ:

free: Duyệt từ cuối heap để tìm những đối tượng rỗng (free/empty objects)

live:Duyệt từ đầu heap tìm những đối tượng sống (live objects)

Khi con trỏ free tìm được một free spot và con trỏ live tìm được một đối tượng sống, đối tượng được di chuyển đến free spot.

Khi một đối tượng được di chuyển, con trỏ sẽ trỏ đến ô nhớ ở bên trái ô nhớ cũ

24

Page 25: Basic  Garbage  Collection  Techniques [ Vi]

Two finger, phần I – Ví dụ

25

Page 26: Basic  Garbage  Collection  Techniques [ Vi]

Phần II: Fix PointersDuyệt qua các đối tượng sống trong heap

Duyệt thông qua các con trỏNếu con trỏ trỏ đến vùng khu vực rỗng, fix nó ứng

với con trỏ chuyển tiếp đến đối tượng đích

26

Compacted area free area

Page 27: Basic  Garbage  Collection  Techniques [ Vi]

Đơn giản!Tương đối nhanh: 2 lần duyệtKhông đòi hỏi thêm khoảng trống

Đối tượng phải có kích thước bằng nhau Thứ tự đối tượng output là tùy ýĐiều này làm giảm hiệu quả chương trình! Do

đó không được sử dụng ngày nay

Two finger – Tính chất

27

Page 28: Basic  Garbage  Collection  Techniques [ Vi]

Thuật toán Lisp2Cải tiến: sử dụng cho những biến khác kích thước,

giữ đúng thứ tự. Đòi hỏi thêm pointer field cho mỗi đối tượngMinh họa:

Ghi chú: không đơn giản để giữ forwarding pointer trong địa chỉ gốc. Nó có thể bị ghi đè trong khi di chuyển đối tượng

28

Free

Page 29: Basic  Garbage  Collection  Techniques [ Vi]

Thuật toán Lisp2Pass 1: Tính toán địa chỉ. Giữa địa chỉ mới trong

object field mới được thêm vào. Pass 2: cập nhật con trỏPass 3: 2 con trỏ (free & live) chạy từ cuối. Live

objects được di chuyển đến free space giữ đúng thứ tự gốc.

29

Free

Page 30: Basic  Garbage  Collection  Techniques [ Vi]

Lisp 2 – Tính chất

Tương đối đơng giảnKhông phụ thuộc kích thước đối tượng Thứ tự các đối tượng được bảo vệ

30

Chậm: 3 passes. Cần thêm khoảng trống – một con trỏ trên một đối tượng.

Page 31: Basic  Garbage  Collection  Techniques [ Vi]

5. Copying Garbage Collection

31

Giống Mark-Compact, thuật toán di chuyển tất cả live objects vào một khu vực, phần còn lại của heap được giải phóng

Có một vài schemes cho copying GC, “Stop and-Copy” GC là một ví dụ

In this scheme the heap is divided into two contiguous semispaces. During normal program execution, only one of them is in use

Page 32: Basic  Garbage  Collection  Techniques [ Vi]

Stop-and-Copy Collector

32

Bộ nhớ heap được chia làm 2 phần Khi chương trình đang chạy yêu cầu cấp phát

mà không còn đủ vùng nhớ chưa sử dụngChương trình sẽ dừng và copying GC Được gọi

để thu hồi khoảng trống

Page 33: Basic  Garbage  Collection  Techniques [ Vi]

Cheney breath-first copying

33

Page 34: Basic  Garbage  Collection  Techniques [ Vi]

Thuật toán

34

Init()= Tospace=Heap_bottom space_size=Heap_size/2 top_of_space=Tospace+space_size Fromspace=top_of_space+1 free=Tospace

New(n)= If free+n>top_of_space Collect() if free+n>top_of_space abort“Memoryexhausted” new-object=free free=free+n return(new-object)collect()=

from-space,to-space= to-space,from-space//swap scan=free=Tospace top_of_space=Tospace+space_size forRinRoots R=copy(R) whilescan<free forPinchildren(scan) *P=copy(P) scan=scan+size(scan)

copy(P)=ifforwarded(P)returnforwarding_address(P)elseaddr=freemem-copy(P,free)free=free+size(P)forwarding_address(P)=addrreturn(addr)

1 2

4

3

Page 35: Basic  Garbage  Collection  Techniques [ Vi]

Efficiency of Copying Collection

35

Thứ tự đối tượng là tùy ýCông việc hoàn thành phụ thuộc số lượng đối

tượng sốngĐể giảm tần suất của GC, cần cấp phát

semispaces lớnKhông thực tế nếu không đủ RAM và paging

xuất hiện

Page 36: Basic  Garbage  Collection  Techniques [ Vi]

6. Non-Copying Implicit Collection

36

Cần thêm 2 trường con trỏ và một trường màu cho mỗi đối tượng. Những trường này phục vụ cho việc liên kết giữa các vùng nhớ trong một danh sách liên kết đôi. Trường màu xác định đối tượng thuộc về tập live objects hay tập rác

Duyệt tất cả các đối tượng trong vùng nhớ heap Các đối tượng live object sẽ linking đến tập toset, và màu chuyển sang màu khác. Sau khi di chuyển các live object từ fromset sang thì các object còn lại trong fromset là garbage và có thể sử dụng như một free list. Sau đó tập hợp fromset sẽ hoán đổi thành toset(giống như fromspace và tospace trong copying collector)

Trong hầu hết trường hợp thì chi phí nhỏ hơn copying collector nhưng trong vài trường hợp thì chi phí phân mảnh có thể quá nặng

Page 37: Basic  Garbage  Collection  Techniques [ Vi]

7. Choosing Among Basic Tracing Techniques

37

A common criterion for high-performance garbage collection is that the cost of collecting objects be comparable, on average, to the cost of allocating objects

While current copying collectors appear to be more efficient than mark-sweep collectors, the difference is not high for state-of-the art implementations

When the overall memory capacity is small, reference counting collectors are more attractive

Simple Garbage Collection Techniques:Too much space, too much time

Page 38: Basic  Garbage  Collection  Techniques [ Vi]

8. Problems with Simple Tracing Collectors

38

Page 39: Basic  Garbage  Collection  Techniques [ Vi]

9. Conservatism in GC

39

The first conservative assumption most collectors make is that any variable in the stack, globals or registers is live. There may be interactions between the compiler's optimizations and the garbage collector's view of the reachability graph.

Tracing collectors introduce a major temporal form of conservatism, simply by allowing garbage to go un collected between collection cycles

Reference counting collectors are conservative topologically failing to distinguish between different paths that share an edge in the graph of pointer relationships