tiểu luận môn Nguyên lý các ngôn ngữ lập trình. Đề tài tìm hiểu Các kỹ thuật dọn rác nhớ

17 949 8
tiểu luận môn Nguyên lý các ngôn ngữ lập trình. Đề tài tìm hiểu Các kỹ thuật dọn rác nhớ

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG  BÀI TẬP LỚN Môn: NGUYÊN LÝ CÁC NGÔN NGỮ LẬP TRÌNH Giáo viên hướng dẫn: TS Nguyễn Hữu Đức Học viên thực hiện: Nguyễn Văn Chiến CB121349 Lê Thị Trang CB120118 Đố Tiến Dũng CB121351 MỤC LỤC Tổng Quan Về Dọn Rác Nhớ (Garbage Collection) 1.1 Khái niệm Garbage Collection .2 1.2 Chức Garbage Collection 1.3 Ưu điểm Garbage Collection 1.4 Nhược điểm Garbage Collection Các Kỹ Thuật Dọn Rác Nhớ (Garbage Collection Techniques) 2.1 Reference Counting collection 2.2 Mark-Sweep collection .5 2.3 Mark-Compact collection 2.4 Copying collection 11 2.5 Non-Copy Implicit collection 13 Kết Luận 14 Tài Liệu Tham Khảo .15 2 Tổng Quan Về Dọn Rác Nhớ (Garbage Collection) Trong NET (cũng Java) có khái niệm Bộ dọn rác (Garbage Collector) Đây tiến trình đặc biệt có nhiệm vụ duyệt qua vùng nhớ cấp phát kiểm tra xem vùng nhớ không sử dụng (không tham chiếu tới nữa) thực thu hồi cách tự động để cấp phát cho yêu cầu Việc xây dựng game hay ứng dụng mà không quan tâm đến loại bỏ đối tượng không cần thiết gây số vấn đề lớn, chương trình ngốn tài nguyên hệ thống (Ram, CPU), dẫn đến việc chương trình chạy chậm chạp, nặng nề, gây treo chí bắt người dùng phải khởi động lại máy tính 1.1 Khái niệm Garbage Collection Garbage Collection (GC) trình chạy ngầm để giải phóng vùng nhớ cấp phát cho đối tượng mà ứng dụng không sử dụng đối tượng 1.2 Chức Garbage Collection - Tự động khôi phục nhớ; - Chức GC tìm đối tượng liệu không sử dụng giải phóng chúng chương trình chạy Dưới ví dụ hoạt động Garbage Collection var a:Object = {foo:"bar"} // tạo object foo có giá trị bar, sau đặt tham chiếu a: var b:Object = a; // chép tham chiếu sang b delete(a); // xóa tham chiếu a trace(b.foo); // thực trace, kết "bar" -> kết luận object foo tồn Như tham chiếu đến object foo, để GC thực hiện, ta phải đảm bảo không tham chiếu đến foo 3 delete(b); Sau thực dòng lệnh 5, foo không tham chiếu nên lúc GC giải phóng foo 1.3 Ưu điểm Garbage Collection - Giúp lập trình viên xử lý giải phóng nhớ lập trình (vốn gây lỗi ngôn ngữ không sử dụng Garbage Collector), giảm thiểu Memory leaks - Bảo đảm tính toàn vẹn chương trình, GC phần quan trọng khả bảo mật tính an toàn 1.4 Nhược điểm Garbage Collection : - Ảnh hưởng tới hiệu chương trình JVM phải theo dõi đối tượng tham chiếu trình thực thi mã, sau phải finalize giải phóng đối tượng 4 Các Kỹ Thuật Dọn Rác Nhớ (Garbage Collection Techniques) 2.1 Reference Counting Collection Reference Counting cách đơn giản để theo dõi xem đối tượng tham chiếu hoạt động hay không Mỗi đối tượng kết hợp với biến đếm số tham chiếu đến Mỗi có tham chiếu đến đối tượng tạo, biến đếm tham chiếu tăng lên 1, tổng số tham chiếu = Garbage Collector hoạt động đối tượng bị xóa Hiệu RC Khi trỏ tạo, biến đếm tham chiếu đối tượng mà trỏ đến phải điều chỉnh Nếu giá trị biến trỏ chuyển từ trỏ đến trỏ khác(phép gán), hai biến RC hai trỏ phải cập nhật, biến RC đối tượng tăng biến giảm Sau phải kiểm tra RC=0 hay không Những biến ngăn xếp mà có thời gian sống ngắn phải chịu chi phí lớn cho mô hình RC Trong trường hợp biến đếm tham chiếu tăng lên giảm trở lại nhanh chóng Phần lớn chi phí tối ưu cách sử dụng biến cục Tham chiếu từ biến cục không cần giữ lại Chúng ta cần điều chỉnh RC heap Tuy nhiên bỏ qua hoàn toàn trỏ stack Vì stack quét trước đối tượng giải phóng RC trỏ=0 giải phóng Hạn chế cập nhật RC trỏ stack giảm đáng kể chi phí RC Recap RC không phù hợp với ứng dụng cần performance cao Khá phổ biến ứ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 disk blocks Kỹ thuật Reference Counting cách phổ biến có số nhược điểm, có số trường hợp dù ta xóa đối tượng số tham chiếu đến đối tượng lớn Garbage Collector không hoạt động 5 Ví dụ đối tượng tham chiếu chéo lẫn chúng không bị xóa thật var a:Object = {} var b:Object = {foo:a}; a.foo = b; delete(a); delete(b); Reference Counting Collection phương pháp đơn giản không chiếm tài nguyên CPU, nhiên phương pháp áp dụng cho tham chiếu vòng (Circular Reference) ví dụ var a:Object = {} var b:Object = {foo:a}; // tạo tham chiếu b thứ hai - trỏ đến tham chiếu thứ a a.foo = b; // cho tham chiếu a trỏ vào b delete(a); // xóa tham chiếu a delete(b); // xóa tham chiếu b Trong trường hợp trên, dù a b bị xóa chẳng cách truy cập objects trên, số lượng tham chiếu chúng tham chiếu qua lại lẫn Trường hợp phức tạp ta có danh sách vòng ( ví dụ: a->b, b->c, c->a …) RC thất bại 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 không chương trình ngày nay: Cây; Cấu trúc liệu vòng 2.2 Mark-Sweep collection Kỹ thuật Mark-Sweep giải vấn đề cấu trúc vòng RC Phân biệt đối tượng sống từ rác ( Mark phase ) 6 - Thực đánh dấu: Nó bắt đầu nút gốc root set duyệt qua đồ thị trỏ đến - Đánh dấu đối tượng qua Thu hồi vùng nhớ rác ( Sweep phase) Sau Mark phase, nhớ kiểm tra kỹ lưỡng để tìm đối tượng không đánh dấu (rác) thu hồi chúng Dùng bit làm mark-bit : đánh dấu; : không đánh dấu Ví dụ: Hình 7 Hình Thuật toán bản: New(A)= Mark(Obj)= If free_list is empty If mark_bit(Obj) == unmarked mark_sweep() for C in Children(Obj) if free_list is empty mark(C) return (“out-of-memory”) pointer = allocate(A) return (pointer) mark_sweep()= sweep()= for Ptr in Roots p = Heap_bottom mark(Ptr) while (ptop_of_space space_size=Heap_size/2 Collect() top_of_space=Tospace+space_size fromspace=top_of_space+1 if free+n>top_of_space abort”Memoryexhausted” free=Tospace new-object=free free=free+n return(new-object) Collect()= Copy(P)= from-space,to-space= ifforwarded(P) to-space,from-space//swap returnforwarding_address(P) scan=free=Tospace else top_of_space=Tospace+space_size addr=free forRinRoots mem-copy(P,free) R=copy(R) free=free+size(P) whilescan[...]... nặng 15 15 3 Kết Luận Qua phần trình bày trên ta thấy, có 5 kỹ thuật dọn rác nhớ và mỗi kỹ thuật đều có những ưu nhược điểm khác nhau Nhờ các kỹ thuật dọn rác nhớ mà các lập trình viên không phải xử lý giải phóng bộ nhớ khi lập trình (vốn gây ra lỗi trên các ngôn ngữ không sử dụng Garbage Collector), giảm thiểu Memory leaks Bảo đảm tính toàn vẹn của chương trình, GC cũng là một phần quan trọng trong... 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 15 15 3 Kết Luận Qua phần trình bày trên ta thấy, có 5 kỹ thuật dọn rác nhớ và mỗi kỹ thuật. .. collection Kỹ thuật này 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... thước đối tượng - Thứ tự các đối tượng được bảo vệ 12 - Chậm: 3 passes Cần thêm khoảng trống – một con trỏ trên một đối tượng 2.4 Copying collection Kỹ thuật này giống kỹ thuật 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ụ Stop-and-Copy Collector Bộ nhớ heap được chia làm... điểm kể trên thì, garbage collection sẽ dẫn đến một số hạn chế như ảnh hưởng tới hiệu năng chương trình do JVM phải theo dõi các đối tượng khi đang được tham chiếu trong quá trình thực thi mã, sau đó phải finalize và giải phóng các đối tượng không còn tham chiếu trực tiếp 16 16 4 Tài liệu tham khảo [1] http://www.slideshare.net/khuonganpt/basic-garbage-collection-techniquesvi [2] http://www.ibm.com/developerworks/vn/library/j-nativememorylinux/index.html...Hình 4 Phần II: Fix Pointers Duyệ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 Compacted area free area Hình 5 Tính chất của Two finger: - Đơn giản -... là một ví dụ Stop-and-Copy Collector 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ụng - Chương trình sẽ dừng và copying GC được gọi để thu hồi khoảng trống Hình 8 Cheney breath-first copying Hình 9 Thuật toán: 13 13 Init()= New(n)= Tospace=Heap_bottom if free+n>top_of_space space_size=Heap_size/2 Collect() top_of_space=Tospace+space_size... thước bằng nhau - Thứ tự đối tượng output là tùy ý 11 11 - Đ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 Thuật toán Lisp2 - Cả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ượng Hình 6 Thuật toán Lisp2 - Pass1: Tính toán địa chỉ Giữa địa chỉ mới trong object field mới được thêm vào - Pass2: Cập nhật con trỏ - Pass3: ... 2. 1 Reference Counting collection 2. 2 Mark-Sweep collection .5 2. 3 Mark-Compact collection 2. 4 Copying collection 11 2. 5 Non-Copy Implicit collection 13... .2 1 .2 Chức Garbage Collection 1.3 Ưu điểm Garbage Collection 1.4 Nhược điểm Garbage Collection Các Kỹ Thuật Dọn Rác Nhớ (Garbage Collection Techniques) 2. 1 Reference... Lisp2 - Cải tiến: Sử dụng cho biến khác kích thước, giữ thứ tự - Đòi hỏi thêm pointer field cho đối tượng Hình Thuật toán Lisp2 - Pass1: Tính toán địa Giữa địa object field thêm vào - Pass2: Cập

Ngày đăng: 17/04/2016, 21:22

Từ khóa liên quan

Mục lục

  • 2. Các Kỹ Thuật Dọn Rác Nhớ (Garbage Collection Techniques)

Tài liệu cùng người dùng

Tài liệu liên quan