Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 13 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
13
Dung lượng
173,78 KB
Nội dung
TRƯỜNG ĐẠI HỌC KINH TẾ QUỐC DÂN VIỆN CÔNG NGHỆ THÔNG TIN – KINH TẾ *********************** TIỂULUẬN MÔN HỌC: NGUN LÝ NGƠN NGỮ LẬP TRÌNH ĐỀ TÀI: KỸTHUẬTGARBAGECOLLECTION Họ tên: Nguyễn Văn Toàn Mã sv: 11146219 Lớp: CNTT56B Nguyễn Văn Toàn – 11146219 LỜI MỞ ĐẦU Thế kỷ 21 mở thời đại mới, thời đại khoa học cơng nghệ đòi hỏi người ln ln khơng ngừng tìm tòi học tập để tiến Với nhảy vọt khoa học, kỹthuật thực ngành Công nghệ thông tin ngày phát triển, thời gian ngắn đạt thành tựu to lớn hầu hết lĩnh vực khác đời sống xã hội Kỹthuật dọn rác (Garbage Collector) 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 Vấn đề cần biết là, “làm Garbage Collector biết vùng nhớ khơng sử dụng thu hồi?” Trong tiểuluận này, em xin trình bày “Kỹ thuậtGarbage Collection” Nguyễn Văn Toàn – 11146219 MỤC LỤC LỜI MỞ ĐẦU Các khái niệm GarbageCollection (GC- dọn rác) Biến đếm GC Mark-Sweep Collection - [McCarthy 1960] Mark-Compact Collection (Nén sau đánh dấu) Copying GarbageCollection .10 LỜI KẾT 11 TÀI LIỆU THAM KHẢO .11 Nguyễn Văn Toàn – 11146219 Các khái niệm GarbageCollection (GC- dọn rác) Trong q trình lập trình ví dụ C+ + hẳn nhớ đến điểm mạnh phức tạp ngôn ngữ trỏ cấp phát động nhớ Giả sử sau kết thúc chương trình mà khơng thu hồi vùng nhớ chuyện xảy ra? Các ô nhớ tồn nhớ chương trình khác khơng thể sử dụng vùng nhớ (hay gọi rò rỉ nhớ – memory leak) Vì thế, yêu cầu bắt buộc sau sử dụng xong vùng nhớ cấp phát phải thu hồi 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 u cầu Chúng ta hình dung công việc Garbage Collector sau: Khi chương trình khởi chạy vùng nhớ liên tục trống dành riêng để cấp phát cho biến chương trình (vùng nhớ gọi managed-heap) Khi dùng toán tử new để tạo đối tượng chương trình kiểm tra xem vùng nhớ đủ để cấp phát hay khơng, khơng đủ GC khởi động Bước mà GC thực tạm dừng chương trình thực việc duyệt để đánh dấu tất vùng nhớ sử dụng với khởi đầu điểm biết trước (hay gọi điểm gốc) Vì ta hiểu: * GarbageCollection (GC): - 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 * Tại cần GC? Nếu tiến trình khơng giải phóng nhớ sử dụng, khoảng trống không sử dụng ngày tăng tiến trình chấm dứt việc trao đổi không gian nhớ không * Rào cản quản lý nhớ: - Lỗi lập trình dẫn đến lỗi quản lý nhớ: + Có thể giải phóng vùng nhớ sớm cần + Có thể khơng giải phóng hết vùng nhớ có thể, nguyên nhân gây thiếu nhớ Nguyễn Văn Toàn – 11146219 - Những lỗi đặc biệt nguy hiểm thường xuất sau phân bổ, khó gỡ rối - Nhiều lập trình viên cấp phát object tĩnh, tránh cấp phát heap để khỏi quan tâm giải phóng chúng - Trong nhiều hệ thống lớn, GC thực thi đối tượng hệ thống (system’s objects) - GC khơng hỗ trợ ngơn ngữ lập trình - Gây lỗi khơng tin cậy, dọn rác riêng lẻ thường không sử dụng ứng dụng khác Vì mục đích GC giải vấn đề * Tính phức tạp GC: - GC đơi xem có chi phí rẻ việc giải phóng tường minh - Một GC tốt làm chương trình chậm 10% - Dù nhiều giá thấp để trả cho: + Sự tiện lợi (Convenience); + Thời gian phát triển (Development time); + Độ tin cậy (Reliability) * Hai phase GC: - Dò tìm rác (garbage detection): + Phân biệt đối tượng sống (live objects) từ rác - Giải phóng rác (garbage reclamation) + Giải phóng vùng nhớ đối tượng rác, để chương trình chạy sử dụng Trong thực tế phase xen kẽ Nguyễn Văn Toàn – 11146219 Biến đếm GC 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 ngược lại Khi biến đếm tham chiếu 0, vùng nhớ dành cho đối tượng giải phóng Khi đối tượng giải phóng, biến đếm tham chiếu đối tượng mà đối tương trỏ đến giảm xuống Việc giải phóng đối tượng kéo theo việc giải phóng hàng loại đối tượng khác Đó vấn đề việc tìm hiểu biến đếm GarbageCollection gồm giai đoạn: việc điều chỉnh kiểm tra biến đếm thực giai đoạn đầu, việc giải phóng xảy biến đếm 0, thao tác phải xen vào chương trình thực thi Bởi chúng xay trỏ tạo giải phóng Một ưu điểm sử dụng biến đếm việc cập nhật biến đếm xen vào chương trình thực thi, việc có thển thực cách dễ dàng Rõ ràng việc cập nhật biến đếm không liên quan đến thao tác để chương trình thực thi Việc giải phóng hàng loạt tồn cấu trúc liệu bị trì hỗn, có danh sách đối tượng garbage mà biến đếm chúng việc giải phóng chưa xử lý Việc thu gom tăng cường dễ dàng thỏa mãn yêu cầu thời gian thực, đảm bảo thao tác quản lý nhớ khơng trì hỗn chương trình chương trình thực thi Điều hỗ trợ chương trình mà việc đảm bảo thời gian then chốt Đồng thời việc Nguyễn Văn Toàn – 11146219 thu gom tăng cường đảm bảo cho chương trình thực thi cách hiệu thông qua việc giảm bớt số lượng cơng việc mà người lập trình cần phải làm(thu gom rác) * Vấn đề cấu trúc vòng: Biến đếm 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) Khi giải pháp chuyển cho lập trình viên * Hiệu biến đếm: - 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 đếm 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 biến đếm=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 biến đếm Trong trường hợp biến đếm tham chiếu tăng lên giảm trở lại nhanh chóng * Biến đếm cục bộ: Phần lớn chi phí tối ưu cách sử dụng biến cục bộ: - Tham chiếu từ biến cục không cần giữ lại Chúng ta cần điều chỉnh biến đếm heap Tuy nhiên khơng thể bỏ qua hồn tồn trỏ stack Vì stack quét trước đối tượng giải phóng biến đếm trỏ =0 giải phóng Hạn chế cập nhật biến đếm trỏ stack giảm đáng kể chi phí biến đếm Nguyễn Văn Toàn – 11146219 Mark-Sweep Collection - [McCarthy 1960] Phân biệt đối tượng sống từ rác (Mark phase) Thực đánh dấu: - bắt đầu root set duyệt qua đồ thị trỏ đến được: + Đá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ụ: * Thuật tốn Nguyễn Văn Tồn – 11146219 * Tính chất Mark & Sweep - Phân mảnh: + Khó cấp phát đối tượng lớn + Vài đối tượng nhỏ lấy nhiều khoảng trống - Chi phí: + Tỉ lệ với kích thước heap, gồm đối tượng sống rác - Locality of reference: + Không di chuyển đối tượng + Đối tượng đặt lẫn lộn nguyên nhân nhiều page swaps (Thông thường đối tượng cluster thường active lúc) * Ưu điểm: - Không cần cấp thêm vùng nhớ để lưu trữ trường count - Các object không cần di chuyển trình GC - Loại bỏ rác trường hợp có tham chiếu vòng (cyclic structures) * Nhược điểm: - Giới hạn giá trị lớn nhớ (integer) - Tăng khả làm phân mảnh vùng nhớ - Chương trình phải tạm dừng GC thực thi - Giai đoạn sweep tốn chi phí cao (thời gian) Mark-Compact Collection (Nén sau đánh dấu) - Mark-Compact giải vấn đề phân mảnh cấp phát mark-sweep - Bộ dọn rác duyệt qua đồ thị trỏ thực chép đối tượng sống sau bước - Kết vùng trống liên tục Đối tượng sống phía rác vùng trống phía - Những đối tượng rác nén cuối nhớ - Tiến trình trải qua số bước nhớ: + Một để tính vị trí đối tượng (địa chỉ) + Cập nhật con trỏ di chuyển đối tượng - Thuật toán chậm đáng kể so với Mark-Sweep Nguyễn Văn Toàn – 11146219 - Hai thuật tốn ví dụ Mark-Compact: + Two-finger Alg– cho đối tượng có kích thước + Lisp Alg Copying GarbageCollection - Giống Mark-Compact, thuật toán di chuyển tất live objects vào khu vực, phần lại heap giải phóng - Có vài phương thức cho copying GC, “Stop and-Copy” ví dụ * Stop-and-Copy Collector: - Bộ nhớ heap chia làm phần - Khi chương trình chạy yêu cầu cấp phát mà khơng đủ vùng nhớ chưa sử dụng - Chương trình dừng copying GC Được gọi để thu hồi khoảng trống * Thuật toán Init()= New(n)= Tospace=Heap_bottom space_size=Heap_size/2 top_of_space=Tospace+space_size Fromspace=top_of_space+1 free=Tospace If free+n >top_of_space Collect() if free+n >top_of_space abort“Memoryexhausted” new-object=free free=free+n 10 return(new-object) copy(P)= collect()= from-space,to-space= to-space, from-space//swap ifforwarded(P) returnforwarding_address(P) scan=free=Tospace else top_of_space=Tospace+space_size addr=free forRinRoots R=copy(R) whilescan