1. Trang chủ
  2. » Tất cả

TIỂU-LUẬN-NGÔN-NGỮ-LẬP-TRÌNH_NGUYỄN-VĂN-TOÀN_11146219

16 6 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 16
Dung lượng 464,54 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Khi có Garbage Collection, chúng ta có thể cấp phát bộ nhớ cho một đối tượng sau đó sử dụng nó và khi không còn bất kỳ một tham chiếu nào tới đối tượng đó, đối tượng sẽ được đánh dấu để

Trang 1

TRƯỜNG ĐẠI HỌC KINH TẾ QUỐC DÂN VIỆN CÔNG NGHỆ THÔNG TIN – KINH TẾ

*****

TIỂU LUẬN

MÔN HỌC: 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: Ths Lưu Minh Tuấn

Họ và tên: Nguyễn Văn Toàn

Mã sv: 11146219

Lớp: CNTT56B

Hà Nội, ngày 12 tháng 05 năm 2019

Trang 2

MỤC LỤC

LỜI NÓI ĐẦU 3

NỘI DUNG 4

1 Các khái niệm về Garbage Collection (GC - bộ dọn rác) 4

1.1 Các khái niệm cơ bản 4

1.2 Tiến trình hoạt động 5

1.3 Ưu nhược điểm của Garbage Collection 7

2 Biến đếm trong GC 7

3 Mark-Sweep Collection - [McCarthy 1960] 9

4 Mark-Compact Collection (Nén sau khi đánh dấu) 11

5 Copying Garbage Collection 12

KẾT LUẬN 15

TÀI LIỆU THAM KHẢO 16

Trang 3

LỜI NÓI ĐẦU

“Công nghệ thông tin là tập hợp các phương pháp khoa học, các phương tiện

và công cụ kỹ thuật hiện đại – chủ yếu là kỹ thuật máy tính và viễn thông - nhằm tổ chức khai thác và sử dụng có hiệu quả các nguồn tài nguyên thông tin rất phong phú

và tiềm năng trong mọi lĩnh vực hoạt động của con người và xã hội ”

(Nghị quyết Chính phủ 49/CPngày 04/08/1993)

Thế kỷ XXI mở ra cho chúng ta một thời đại mới, thời đại của sự phát triển như vũ bão của khoa học công nghệ đòi hỏi mỗi cá nhân luôn luôn không ngừng tìm tòi học tập để trau dồi, hoàn thiện thêm kinh nghiệm, kỹ năng và phát triển theo xu hướng mới, để có thể hội nhập với các nước tiên tiến hơn Với sự nhảy vọt của khoa học, thật sự là một điều thiếu sót lớn nếu bỏ qua ngành Công nghệ thông tin Với vai trò là một trong những ngành mũi nhọn về lĩnh vực khoa học công nghệ mà Đảng và Nhà nước đã xác định cũng là mãnh đất màu mỡ của hạt giống sáng tạo Chỉ trong thời gian ngắn Công nghệ thông tin đã mang tới những thành tựu to lớn ở hầu hết các lĩnh vực khác nhau trong đời sống xã hội, đặc biệt phải kể đến công nghệ kỹ thuật dọn rác (Garbage Collection) Khi có Garbage Collection, chúng ta có thể cấp phát

bộ nhớ cho một đối tượng sau đó sử dụng nó và khi không còn bất kỳ một tham chiếu nào tới đối tượng đó, đối tượng sẽ được đánh dấu để Garbage Collection giải phóng các bộ nhớ đã được phân bổ và nó cũng đảm bảo rằng mọi đối tượng có tham chiếu

trực tiếp sẽ không bị xóa khỏi bộ nhớ Vấn đề chúng ta cần biết ở đây là, “Làm thế

nào Garbage Collection có thể biết được rằng vùng nhớ đó không còn được sử dụng nữa để mà thu hồi?”

Đó là câu hỏi cần giải đáp khi tìm hiểu về “Kỹ thuật Garbage Collection”

mà em sẽ nói trong bài tiểu luận này

Trang 4

NỘI DUNG

1 Các khái niệm về Garbage Collection (GC - bộ dọn rác)

1.1 Các khái niệm cơ bản

Như chúng ta đã biết, rác (garbage) có nghĩa là các đối tượng không còn được tham chiếu và bộ thu gom rác (garbage collection) được sử dụng để thực hiện quá trình tự động khôi phục lại bộ nhớ Nói cách khác, đó là một cách để phá hủy các đối tượng không sử dụng nữa

Một khái niệm khác cho rằng, Garbage Collection (GC) là một quá trình chạy ngầm để giải phóng vùng nhớ được cấp phát cho đối tượng mà ứng dụng không còn

sử dụng đối tượng này nữa

Trong quá trình lập trình ví dụ như C++ thì chắc hẳn sẽ nhớ đến một trong những điểm mạnh và cũng rất phức tạp của ngôn ngữ này là con trỏ và cấp phát động

bộ nhớ Con trỏ trong C /C++ Con trỏ - Pointer trong ngôn ngữ C /C++ rất dễ học và thú vị Một vài tác vụ trong ngôn ngữ C /C++ được thực hiện dễ dàng hơn nhờ con trỏ, và những tác vụ khác trở nên linh hoạt hơn, như trong việc cấp phát bộ nhớ, không thể thực hiện mà không dùng con trỏ Cấp phát động bộ nhớ là kiểu cấp phát thứ hai trong C++, là một kiểu cấp phát rất quan trọng, bất cứ lập trình viên C++ nào cũng phải thành thạo nó Khi sử dụng cấp phát động, chúng ta buộc phải sử dụng đến biến con trỏ và toán tử new

Giả sử như sau khi kết thúc chương trình mà chúng ta không thu hồi vùng nhớ này thì chuyện gì sẽ xảy ra? Các ô nhớ này sẽ cứ tồn tại trong bộ nhớ trong khi các chương trình khác không thể sử dụng được vùng nhớ này (hay còn gọi là rò rỉ bộ nhớ – memory leak) Vì thế, yêu cầu bắt buộc là sau khi sử dụng xong vùng nhớ đã cấp phát thì phải thu hồi

Trong khoa học máy tính, thu dọn rác (Garbage collection hay GC) là một dạng quản lý bộ nhớ tự động Trong NET (cũng như Java) có một khái niệm là Bộ dọn rác Bộ dọn rác (Garbage collector hay collector), sẽ cố gắng thu hồi rác, hay vùng nhớ bị chiếm dụng bởi đối tượng mà không còn được sử dụng bởi chương trình Thu gom rác được phát minh bởi John McCarthy vào khoảng năm 1959 để đơn giản hóa việc quản lý bộ nhớ thủ công trong Lisp

Trang 5

Bộ dọn rác là một tiến trình đặc biệt có nhiệm vụ duyệt qua các vùng nhớ đã được cấp phát và kiểm tra xem vùng nhớ nào không còn được sử dụng nữa (không còn tham chiếu tới nó nữa) thì sẽ thực hiện thu hồi một cách tự động để có thể cấp phát cho các yêu cầu tiếp theo

1.2 Tiến trình hoạt động

Chúng ta có thể hình dung được tiến trình công việc của Garbage Collection như sau: Khi chương trình khởi chạy thì một vùng nhớ liên tục còn trống sẽ được dành riêng để cấp phát cho các biến trong chương trình (vùng nhớ này được gọi là Managed-heap) Khi chúng ta dùng toán tử new để tạo một đối tượng mới thì chương trình sẽ kiểm tra xem vùng nhớ này còn đủ để cấp phát hay không, nếu không đủ thì

GC sẽ được khởi động Bước đầu tiên mà GC thực hiện là tạm dừng chương trình và thực hiện việc duyệt để đánh dấu tất cả những vùng nhớ đang được sử dụng với khởi đầu tại một điểm nào đó đã biết trước (hay được gọi là điểm gốc) Vì vậy ta có thể hiểu:

* 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 đến GC?

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 việc trao đổi không gian nhớ sẽ không còn

* Rào cản trong quản lý bộ nhớ:

- 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ần

+ Có 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 phân bổ, rất khó gỡ rối

Trang 6

- Nhiề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

- 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ình

- Gâ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 Vì vậy mục đích của GC là giải quyết những các vấn đề trên

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

- 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)

* Hai phase chính của GC:

- Dò tìm rác (garbage detection):

+ Phân biệt những đố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ớ 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

* Ví dụ:

1 var a:Object = {foo:’’bar’’} // tạo object foo có giá trị là bar, sau đó đặt

1 tham chiếu a:

2 var b:Object = a; // sao chép tham chiếu sang b

3 delete (a); // xóa tham chiếu a

4 trace(b.foo); // khi thực hiện trace, kết quả là “bar””-> Kết luận là object foo vẫn tồn tại

Trang 7

Như vậy, vẫn còn 1 tham chiếu đến object foo, để GC được thực hiện thì phải đảm bảo không còn tham chiếu đến foo nữa

5 delete (b);

Sau khi thực hiện dòng lệnh 5, foo sẽ không còn tham chiếu nào nên lúc này

GC sẽ giải phóng foo

1.3 Ưu nhược điểm của Garbage Collection

- Ưu điểm:

+ Giúp 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 phải sử dựng GC), giảm thiểu Memory Leaks

+ Đảm bảo tính toàn vẹn của chương trình, GC cũng là một phần quan trọng trong khả năng bảo mật và tính an toàn

- Nhược điểm:

+ Ả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

2 Biến đếm trong GC

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

Trang 8

Hình 1: Biến đếm trong Garbage Collector

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 việc tìm hiểu biến đếm

Garbage Collection gồm 2 giai đoạn: việc điều chỉnh và kiểm tra biến đếm

sẽ được thực hiện ở giai đoạn đầu, và việc giải phóng sẽ xảy ra khi biến đếm 5 bằng

0, cả 2 thao tác này đều phải được xen vào khi chương trình thực thi Bởi vì chúng có thể xay ra bất cứ khi nào con trỏ được tạo ra hoặc giải phóng

Một ưu điểm của sử dụng biến đếm là việc cập nhật biến đếm được xen vào khi chương trình đang thực thi, việc này có thển thực hiện một cách dễ dàng Rõ ràng việc cập nhật biến đếm không bao giờ liên quan đến các thao tác để chương trình có thể thực thi Việc giải phóng hàng loạt toàn bộ các cấu trúc dữ liệu có thể bị trì hoãn, bởi khi đã có một danh sách các đối tượng garbage mà biến đếm của chúng bằng 0 thì việc giải phóng vẫn chưa được xử lý

Việc thu gom tăng cường này có thể dễ dàng thỏa mãn yêu cầu về thời gian thực, đảm bảo các thao tác quản lý bộ nhớ sẽ không trì hoãn chương trình khi chương trình thực thi Điều này có thể hỗ trợ chương trình khi mà việc đảm bảo về thời gian

là then chốt Đồng thời việc thu gom tăng cường cũng đảm bảo cho chương trình thực

Trang 9

thi 1 cách hiệu quả thông qua việc giảm bớt số lượng các 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 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 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) Khi đó giải pháp được chuyển về cho lập trình viên

* Hiệu quả của biến đếm:

- 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 đếm 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 biến đếm = 0 hay không

- Nhữ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 biến đếm 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 6

* Biến đếm cục bộ:

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 biến đếm 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 biến đếm của con trỏ = 0 thì nó được giải phóng

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

3 Mark-Sweep Collection - [McCarthy 1960]

Kỹ thuật Mark-Sweep giải quyết vấn đề cấu trúc vòng của Reference Counting Collection

Phân biệt đối tượng sống từ rác (Mark phase)

Thực hiện bằng đánh dấu:

Trang 10

- 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 qua + Thu 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ấu 0 : không đánh dấu

* Ví dụ:

* Thuật toán cơ bản

Trang 11

* Tính chất của Mark & amp; Sweep

- Phân mảnh:

+ Khó cấp phát những đối tượng lớn

+ Vài đối tượng nhỏ có thể lấy nhiều khoảng trống kế tiếp

- Chi 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 8 + Đố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)

* Ư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 trong quá trình GC

- Loại bỏ được rác trong 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ất có thể của ô nhớ (integer)

- Tăng khả năng làm phân mảnh vùng nhớ

- Chương trình phải tạm dừng khi GC thực thi

- Giai đoạn sweep tốn chi phí cao (thời gian)

4 Mark-Compact Collection (Né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

- 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ượng

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

Trang 12

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

- Ví dụ: Thứ tự của đối tượ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

Init()=

Tospace=Heap_bottom space_size=Heap_size/2 top_of_space=Tospace+space_si

ze

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 10 return(new-object) collect()=

from-space,to-space=

to-space, from-space//swap

scan=free=Tospace

copy(P)=

ifforwarded(P) returnforwarding_address( P)

else addr=free

Trang 13

top_of_space=Tospace+space_size

forRinRoots

R=copy(R) whilescan<free

forPinchildren(scan)

*P=copy(P) scan=scan+s

mem-copy(P,free) free=free+size(P) forwarding_address(P)=ad

dr

return(addr)

* 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 tốn bộ nhớ để lưu trường đếm

* Nhược điểm:

- Vùng nhớ dùng cho chương trình bị 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

* 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 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ử

Ngày đăng: 13/05/2019, 12:44

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w