12

Nếu bạn đang thiết kế một ngôn ngữ lập trình có tính năng quản lý bộ nhớ tự động, việc sử dụng tính tham chiếu cho phép xác định chắc chắn rằng không thể thực hiện với bộ thu gom rác?Đối với lập trình thời gian thực, việc tính toán tham chiếu có lợi thế hơn so với việc thu thập rác theo định nghĩa không?

Có câu trả lời nào khác cho câu hỏi này cho các ngôn ngữ chức năng và mệnh lệnh không?

Trả lời

14

Việc sử dụng tính toán tham chiếu có cho phép đảm bảo tính xác định không thể thực hiện với bộ thu gom rác không?

Từ đảm bảo là hình thức mạnh nhất.Dưới đây là các đảm bảo bạn có thể cung cấp với tính tham chiếu:

  • Chi phí liên tục trên một bài tập để điều chỉnh số lượng tham chiếu.

  • Thời gian không đổi để giải phóng một đối tượng có số tham chiếu đến 0. (Điều quan trọng là bạn không phải giảm giá trị của trẻ em đối tượng đó ngay lập tức;. Thay vào đó bạn phải làm điều đó uể oải khi đối tượng được sử dụng để đáp ứng yêu cầu phân bổ tương lai)

  • liên tục thời gian để phân bổ một đối tượng mới khi danh sách miễn phí có liên quan không được để trống. Bảo lãnh này có điều kiện và không đáng giá nhiều.

Dưới đây là một số điều bạn không thể đảm bảo với tính tham khảo:

  • thời gian cố định để phân bổ một đối tượng mới. (Trong trường hợp xấu nhất, heap có thể đang phát triển, và tùy thuộc vào hệ thống chậm trễ để tổ chức bộ nhớ mới có thể là đáng kể. Hoặc thậm chí tệ hơn, bạn có thể điền vào đống và không thể phân bổ.)

  • Tất cả không thể truy cập các đối tượng được khai hoang và sử dụng lại trong khi duy trì thời gian liên tục cho các hoạt động khác. (Tham chiếu ngược tiêu chuẩn không thể thu thập rác cyclic. Có rất nhiều cách giải quyết khéo léo, nhưng nhìn chung họ làm mất hiệu lực bảo đảm ổn định thời gian cho các hoạt động đơn giản.)

Hiện nay có một số người thu gom rác thời gian thực cung cấp bảo đảm khá thú vị về thời gian tạm dừng, và trong 5 năm qua đã có những phát triển khá thú vị trong cả tính toán tham chiếu và thu gom rác thải. Từ nơi tôi ngồi như một người ngoài cuộc, không có người chiến thắng rõ ràng.

Một số công việc gần đây nhất về tính tham khảo là bởi David Bacon của IBM và bởi Erez Petrank of Technion. Nếu bạn muốn tìm hiểu những gì một hệ thống tính toán tham chiếu tinh vi, hiện đại có thể thực hiện, hãy tìm kiếm các tài liệu của họ. Trong số những thứ khác, họ đang sử dụng nhiều bộ xử lý theo những cách tuyệt vời.

Để biết thông tin về quản lý bộ nhớ và đảm bảo thời gian thực nói chung hơn, hãy xem International Symposium on Memory Management.

Có câu trả lời nào khác cho câu hỏi này cho các ngôn ngữ chức năng và mệnh lệnh không?

Vì bạn đã hỏi về đảm bảo, không. Nhưng đối với quản lý bộ nhớ nói chung, sự cân bằng hiệu suất là khá khác nhau đối với một ngôn ngữ bắt buộc (rất nhiều đột biến nhưng tỷ lệ phân bổ thấp), một ngôn ngữ chức năng không tinh khiết (hầu như không có đột biến nhưng tỷ lệ phân bổ cao). đột biến — tất cả những người được cho là cập nhật — và tỷ lệ phân bổ cao).

+1

"Tất cả các đối tượng không thể truy cập được khai hoang và sử dụng lại trong khi duy trì thời gian liên tục cho các hoạt động khác". Cho rằng câu hỏi là tạo một ngôn ngữ mới, bạn có thể chọn để thực thi một đống đơn hướng (ví dụ như Erlang và Mathematica) để bạn có thể đảm bảo rằng tất cả các đối tượng không thể truy cập được khai hoang và sử dụng lại trong khi duy trì thời gian liên tục cho các hoạt động khác. –

+0

Có thể thực hiện đếm tham chiếu thời gian thực khó khăn (ở mức giá): xem "Tính toán tham chiếu cho các hệ thống thời gian thực cứng", bởi T Ritzau –

2

Trong bộ sưu tập rác lập trình thời gian thực có thể có hại, bởi vì bạn không biết khi bộ thu gom rác sẽ thu thập ... vì vậy, tính tham chiếu chắc chắn tốt hơn trong ngữ cảnh này.

Là một lưu ý phụ, thường trong hệ thống thời gian thực chỉ một số phần cần xử lý thời gian thực, vì vậy bạn có thể tránh thu gom rác chỉ trong các thành phần nhạy cảm. Một ví dụ thế giới thực là một chương trình C# chạy trên một mục tiêu Windows CE.

+0

Có nhiều cách để thực hiện thu gom rác để không yêu cầu hành vi "ngừng thế giới". Những yêu cầu này thường được kích hoạt trong khi vẫn còn đủ dung lượng để đáp ứng bất kỳ yêu cầu nào có thể đến trước khi thu gom rác hoàn thành, và chúng cũng làm giảm hiệu suất ở một mức độ nào đó ngay cả khi thu gom rác không được tiến hành. bộ thu gom rác có thể vượt trội hơn một hệ thống dựa trên tham chiếu không nén trong một số kịch bản thời gian thực. – supercat

+0

Ví dụ, một hệ thống có thể yêu cầu mỗi khi một tham chiếu đối tượng được lưu trữ ở đâu đó và đích không được đánh dấu là "trực tiếp", nó phải được thêm vào danh sách các đối tượng trực tiếp mới; giai đoạn "đánh dấu" của GC sẽ khởi tạo danh sách để trỏ đến tất cả các đối tượng gốc, và sau đó đi qua danh sách và thêm vào danh sách mọi mục lồng nhau chưa được đánh dấu là "trực tiếp". Khi danh sách trống, giai đoạn "quét" có thể di chuyển từng đối tượng không được đánh dấu là "hoạt động", tạm dừng bất kỳ lúc nào nó sẽ di chuyển một đối tượng đang bị hủy đăng ký tích cực. – supercat

4

Nếu bạn nhìn vào đặc tả RTSJ (JSR-1), bạn sẽ thấy chúng đã kết thúc xung quanh vấn đề bằng cách cung cấp các luồng thời gian thực không có đống. Bằng cách có một loại chủ đề riêng biệt không được phép chạm vào bất kỳ đối tượng nào có thể yêu cầu dừng lại để thu thập rác, bên JSR-1 đã giải quyết vấn đề. Hiện tại không có nhiều triển khai RTSJ, nhưng khu vực thu gom rác thời gian thực là một chủ đề nóng trong cộng đồng đó.

+0

Bằng cách "chạm" bạn có nghĩa là "viết", hoặc "viết bất cứ điều gì khác ngoài các trường nguyên thủy", hoặc "kiểm tra theo bất kỳ cách nào"? Hoặc có một số loại lưu trữ được lập chỉ mục không phải heap mà cả luồng thời gian thực và không theo thời gian thực đều có thể truy cập? Tôi sẽ không nghĩ rằng các chủ đề thời gian thực sẽ rất hữu ích nếu chúng bị giới hạn đọc và viết các nguyên thủy có kích thước cố định, nhưng tôi có thể tưởng tượng nhiều cơ chế mà qua đó những thứ như mảng có thể được cho phép một cách hữu ích. – supercat

+0

@supercat - tất nhiên là tôi đã không chạm vào rtsj trong một vài năm vì vậy tôi cũng có thể được tắt trong này, nhưng ở đây đi - bằng cách 'chạm' Tôi tin rằng tôi có nghĩa là 'truy cập'. Về cơ bản, các đối tượng heap bị cấm đối với các luồng NHRT. Những gì bạn có thể * truy cập với các luồng NHRT là các đối tượng được cấp phát từ bộ nhớ 'bất tử bộ nhớ' hoặc (tôi nghĩ) 'phạm vi'. RTSJ loại bộ nhớ trong Java loại phức tạp, liên quan đến không RTSJ. – JustJeff

0

Từ một số sự tham gia trong các dự án khác nhau di chuyển các đoạn mã đáng kể từ C++ (với các lớp con trỏ thông minh khác nhau, bao gồm cả tính tham chiếu) đến thu gom rác thải Java/C#, tôi quan sát thấy những điểm đau lớn nhất dường như liên quan đến các lớp với các bộ hủy không rỗng (đặc biệt khi được sử dụng cho RAII). Đây là một lá cờ khá lớn mà việc dọn dẹp xác định được mong đợi.

Vấn đề chắc chắn là giống nhau đối với bất kỳ ngôn ngữ nào có đối tượng; Tôi không nghĩ rằng các ngôn ngữ OO-chức năng lai như Scala hay Ocaml được hưởng bất kỳ lợi thế cụ thể nào trong lĩnh vực này. Tình huống có thể khác với nhiều ngôn ngữ chức năng "thuần túy" hơn.

+0

-1 Xác định dọn dẹp dễ dàng được thực hiện bằng bất kỳ ngôn ngữ chức năng nào và nó không liên quan gì đến thời gian thực. –

7

sẽ sử dụng tính toán tham chiếu cho phép đảm bảo xác định rằng không thể thực hiện với bộ thu gom rác?

Tôi không hiểu cách thực hiện. Quá trình giảm số lượng tham chiếu của đối tượng không bị giới hạn thời gian, vì đối tượng đó có thể là gốc đơn cho biểu đồ đối tượng lớn tùy ý.

Cách duy nhất để tiếp cận vấn đề GC cho hệ thống thời gian thực là sử dụng bộ thu đồng thời hoặc bộ thu đồng thời - và không có vấn đề gì nếu hệ thống sử dụng tính tham chiếu hay không; theo ý kiến ​​của tôi, sự khác biệt giữa tính toán tham chiếu và "bộ sưu tập" không chính xác, ví dụ: các hệ thống sử dụng tính năng tham chiếu đôi khi vẫn có thể thực hiện một số lần quét bộ nhớ (ví dụ, để xử lý các chu kỳ).

Bạn có thể quan tâm đến IBM's Metronome và tôi cũng biết rằng Microsoft đã thực hiện một số nghiên cứu theo hướng quản lý bộ nhớ thời gian thực tốt.

2

Để lập trình thời gian thực, tính toán tham chiếu có lợi thế hơn thu gom rác về mặt định nghĩa không?

Có. Ưu điểm chính của tính tham chiếu là sự đơn giản.

Nếu bạn đang thiết kế một ngôn ngữ lập trình có tính năng quản lý bộ nhớ tự động, việc sử dụng tính tham chiếu cho phép đảm bảo xác định rằng không thể thực hiện với bộ thu gom rác?

Một GC như Máy chạy bộ của Baker sẽ đạt được cùng một mức độ bảo đảm liên quan đến tính xác định tham chiếu đến tính toán tham chiếu.

Có câu trả lời nào khác cho câu hỏi này cho các ngôn ngữ chức năng và mệnh lệnh không?

Có. Chỉ tính tham khảo không xử lý chu kỳ. Một số ngôn ngữ chức năng làm cho nó không thể tạo chu kỳ bằng thiết kế (ví dụ: Erlang và Mathematica) để chúng tầm thường cho phép tính tham chiếu một mình như một cách tiếp cận chính xác đến GC.

Các vấn đề liên quan