tiểu luận môn Nguyên lý các ngôn ngữ lập trình. Đề tài tìm hiểu Kỹ thuật Garbage collection

14 985 1
tiểu luận môn Nguyên lý các ngôn ngữ lập trình. Đề tài tìm hiểu Kỹ thuật Garbage collection

Đ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 & TRUYỀN THÔNG BÀI TẬP LỚN MÔN: NGUYÊN LÝ NGÔN NGỮ LẬP TRÌNH ĐỀ TÀI: KỸ THUẬT GARBAGE COLLECTION GIẢNG VIÊN HƯỚNG DẪN: TS NGUYỄN HỮU ĐỨC HỌC VIÊN: NGUYỄN MẠNH HÀ CB111398 NGUYỄN VĂN CƯỜNG CB121350 NGÔ THANH TÂN CB121356 ĐINH VĂN VIỆT CB121363 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 luôn 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ểu luận này, chúng em xin trình bày “Kỹ thuật Garbage Collection” Em xin chân thành cảm ơn thầy TS.Nguyễn Hữu Đức hướng dẫn tạo điều kiện tốt để nhóm em hoàn thành tốt tiểu luận MỤC LỤC Các khái niệm Garbage Collection (GC- dọn rác) Biến đếm GC Mark-Sweep Collection - [McCarthy 1960] Mark-Compact Collection (Nén sau đánh dấu) 10 Copying Garbage Collection 10 Non-Copying Implicit Collection 12 LỜI KẾT 13 TÀI LIỆU THAM KHẢO 14 Các khái niệm Garbage Collection (GC- dọn rác) Trong 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 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 yê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: * Garbage Collection (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ớ - 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 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ẽ 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 Garbage Collection 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 toàn cấu trúc liệu bị trì hoã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ì hoã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 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 - 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 biến đếm 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 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 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ụ: root ro Free_li Before Mark phase *Thuật toán New(A)= mark(Obj)= if free_list is empty if mark_bit(Obj) == unmarked mark_sweep() mark_bit(Obj)=marked if free_list is empty for C in Children(Obj) return (“out-of-memory”) mark(C) pointer = allocate(A) return (pointer) mark_sweep()= for Ptr in Roots mark(Ptr) sweep() 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) * 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 - Hai thuật toán ví dụ Mark-Compact: + Two-finger Alg– cho đối tượng có kích thước + Lisp Alg Copying Garbage Collection - 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 New(n)= Init()= Tospace=Heap_bottom If free+n>top_of_space space_size=Heap_size/2 Collect() if free+n>top_of_space top_of_space=Tospace+space_size abort“Memoryexhausted” Fromspace=top_of_space+1 new-object=free free=Tospace free=free+n 10 return(new-object) collect()= from-space,to-space= to-space,fromspace//swap scan=free=Tospace copy(P)= ifforwarded(P) returnforwarding_address(P) else addr=free mem-copy(P,free) free=free+size(P) forwarding_address(P)=addr return(addr) top_of_space=Tospace+space_size forRinRoots R=copy(R) whilescan[...]... những công việc đòi hỏi sự tỉ mỉ, cẩn thận với ngôn ngữ lập trình mà chỉ cần tập trung vào giải quyết các vấn đề của khách hàng đưa ra 12 Một lần nữa, chúng em xin chân thành cảm ơn thầy TS Nguyễn Hữu Đức đã tạo mọi điều kiện tốt nhất để chúng em hoàn thành tốt bài tiểu luận này TÀI LIỆU THAM KHẢO 1 TS Nguyễn Hữu Đức - Bài giảng Nguyên lý các ngôn ngữ lập trình 2 http://www.ibm.com/developerworks/vn/library/j-nativememory-linux/index.html... 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ư... chi phí phân mảnh có thể quá nặng *Ưu điểm: - Chi phí dò tìm( duyệt- tracing processing) không cao - Vùng nhớ không cần phải chia đôi, nhưng tốn thêm vùng nhớ để lưu trữ 2 biến con trỏ và trường field color - LỜI KẾT Quá trình thực hiện dọn dẹp bộ nhớ của kỹ thuật Garbage Collector thật sự khiến cho chương trình của chúng ta sẽ chạy chậm hơn so với các chương trình viết bằng C/C++ Tuy nhiên, năng suất... chia đôi (fromspace – tospace) - Các đối tượng phải di chuyển trong vùng nhớ trong suốt quá trình thu gom rác, do vậy các tham chiếu đến các đối tượng cũng phải cập nhật - Chương trình phải tạm dừng khi bộ thu gom rác thực thi 11 6 Non-Copying Implicit Collection - 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... scan=scan+s *Hiệu quả Copying Collection - 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 không gian lớn - Không thực tế nếu không đủ RAM và phân trang xuất hiện * Ưu điểm: - Giảm khả năng phân mảnh vùng nhớ heap - Thời gian thực hiện công việc thì tỉ lệ với các đối tượng sống - Có thể xử lý được rác chứa các tham chiếu vòng - Không...5 Copying Garbage Collection - 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 phương thức cho copying GC, “Stop and-Copy” 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 * Thuật toán New(n)= Init()= Tospace=Heap_bottom If free+n>top_of_space space_size=Heap_size/2 Collect() if free+n>top_of_space top_of_space=Tospace+space_size abort“Memoryexhausted” Fromspace=top_of_space+1 ... đối tượng - Thuật toán chậm đáng kể so với Mark-Sweep - Hai thuật toán ví dụ Mark-Compact: + Two-finger Alg– cho đối tượng có kích thước + Lisp Alg Copying Garbage Collection - Giống Mark-Compact,... 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 -. .. (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

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

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

  • Đang cập nhật ...

Tài liệu liên quan