Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [Trình biên dịch] Bộ thu gom rác theo thế hệ (generational GC)

    Bộ thu gom rác thế hệ (generational garbage collector) dựa trên quan sát thực nghiệm "hầu hết đối tượng chết trẻ": đối tượng mới được tạo thuộc thế hệ 0 (non); mỗi lần một đợt thu gom quét qua mà đối tượng vẫn còn sống (còn truy cập được từ gốc), số lần sống sót của nó tăng thêm 111; khi số lần sống sót đạt ngưỡng TTT, đối tượng được thăng cấp (promote) lên thế hệ 1 vĩnh viễn (không bao giờ bị thu gom trở lại về thế hệ 0). Khác với đếm tham chiếu, thuật toán mark-and-sweep dùng ở đây duyệt đúng theo khả năng truy cập nên thu gom chính xác cả các chu trình tham chiếu.

    Có nnn biến gốc v1,…,vnv_1,\dots,v_nv1​,…,vn​ (ban đầu null) và mmm lệnh:

    • NEW id size: tạo đối tượng id kích thước size byte, thuộc thế hệ 000, số lần sống sót =0=0=0.
    • ASSIGN v id: cho biến gốc vvv trỏ tới id (id=0 nghĩa là gán null). Không làm thay đổi refcount/trạng thái sống chết ngay lập tức — chỉ ảnh hưởng tới lần GC tiếp theo.
    • LINK id field target: đặt trường con trỏ field của id trỏ tới target (ghi đè nếu đã tồn tại).
    • UNLINK id field: gỡ trường con trỏ field khỏi id (nếu có).
    • GC: thực hiện một đợt thu gom: tính tập các đối tượng còn truy cập được bằng cách duyệt (BFS/DFS) từ tất cả biến gốc hiện tại, đi theo các trường con trỏ hiện có, chỉ qua các đối tượng chưa từng bị thu gom. Với mỗi đối tượng còn truy cập được: tăng số lần sống sót thêm 111; nếu đang ở thế hệ 000 và số lần sống sót ≥T\ge T≥T thì thăng cấp lên thế hệ 111. Với mỗi đối tượng chưa từng bị thu gom nhưng không còn truy cập được: thu gom ngay (đánh dấu đã giải phóng, cộng dồn vào tổng số byte đã giải phóng).

    Đối tượng chỉ thực sự được giải phóng khi có lệnh GC chạy qua và phát hiện nó không còn truy cập được (không tự động giải phóng ngay khi mất tham chiếu).

    Ví dụ: n=1n=1n=1, T=2T=2T=2, các lệnh NEW 1 10, ASSIGN 1 1, GC (obj1 sống sót lần 1, vẫn thế hệ 0), GC (obj1 sống sót lần 2 ≥T\ge T≥T, thăng cấp thế hệ 1).

    • Định dạng đầu vào:

      Dòng đầu tiên gồm ba số nguyên nnn, mmm, TTT (0≤n≤2000 \le n \le 2000≤n≤200, 0≤m≤20000 \le m \le 20000≤m≤2000, 1≤T≤1091 \le T \le 10^91≤T≤109).

      mmm dòng tiếp theo, mỗi dòng là một trong: NEW id size, ASSIGN v id, LINK id field target, UNLINK id field, GC. Dữ liệu đảm bảo hợp lệ.

    • Định dạng đầu ra:

      In ra 333 dòng, phản ánh trạng thái khi kết thúc chương trình (sau lệnh cuối cùng, không tự động chạy thêm GC):

      • Dòng 1: hai số nguyên cách nhau một khoảng trắng — số đối tượng còn sống thuộc thế hệ 000 và số đối tượng còn sống thuộc thế hệ 111.
      • Dòng 2: tổng số byte của tất cả đối tượng còn sống (cả hai thế hệ).
      • Dòng 3: tổng số byte đã được giải phóng, cộng dồn qua tất cả các lệnh GC đã thực hiện.

    Ví dụ:

    Đầu vào:

    0 0 1
    

    Đầu ra:

    0 0
    0
    0
    

    Đầu vào:

    1 8 2
    NEW 1 5
    ASSIGN 1 1
    GC
    GC
    NEW 2 9
    GC
    ASSIGN 1 0
    GC
    

    Đầu ra:

    0 0
    0
    14
    

    Đang tải editor...