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] Cấp phát bộ nhớ — Next-Fit có giải phóng và hợp nhất khối trống

    Khác với First-Fit (luôn bắt đầu tìm từ đầu danh sách), chiến lược Next-Fit ghi nhớ vị trí đã cấp phát lần trước và lần tìm kiếm tiếp theo bắt đầu ngay sau đó (kiểu vòng tròn / circular), tránh quét lại nhiều lần các khối nhỏ ở đầu danh sách.

    Cho một vùng nhớ liên tục kích thước NNN byte (địa chỉ 0..N−10..N-10..N−1), ban đầu là một khối trống duy nhất. Có QQQ thao tác lần lượt:

    • ALLOC size: cấp phát sizesizesize byte liên tục bằng Next-Fit. Gọi ppp là địa chỉ ngay sau vùng nhớ được cấp ở lần ALLOC thành công gần nhất (ban đầu p=0p=0p=0). Xét danh sách khối trống hiện tại theo thứ tự địa chỉ tăng dần; bắt đầu quét từ khối trống đầu tiên có địa chỉ bắt đầu ≥p\ge p≥p (nếu không có khối nào như vậy, coi như quay vòng về khối đầu danh sách); quét vòng tròn qua tất cả khối trống, chọn khối đầu tiên gặp có kích thước ≥size\ge size≥size; cấp phát từ đầu khối đó, cập nhật ppp = địa chỉ ngay sau vùng vừa cấp. Nếu không có khối nào đủ lớn, in FAIL (giữ nguyên ppp). Mỗi lần ALLOC thành công được gán id tăng dần 1,2,3,…1,2,3,\dots1,2,3,… (không tính các lần FAIL).
    • FREE id: giải phóng vùng nhớ đã cấp cho lần ALLOC thành công thứ ididid (đảm bảo đang được cấp, chưa free trước đó), đưa vùng đó về danh sách khối trống, rồi hợp nhất (coalesce) ngay với khối trống liền kề bên trái và/hoặc bên phải (nếu "chạm" địa chỉ) thành một khối lớn hơn. FREE không tạo output.

    Yêu cầu: với mỗi thao tác ALLOC theo đúng thứ tự, in địa chỉ được cấp phát hoặc FAIL.

    Ví dụ: N=30N=30N=30. ALLOC 10 → 000; ALLOC 10 → 101010; FREE 1 (trả lại [0,10)[0,10)[0,10)); ALLOC 10 → vì p=20p=20p=20 (sau lần cấp gần nhất tại địa chỉ 101010 kích thước 101010), Next-Fit tìm khối đầu tiên có start ≥20\ge 20≥20, tức [20,30)[20,30)[20,30), nên cấp tại 20\mathbf{20}20 — không quay lại [0,10)[0,10)[0,10) dù nó trống và đủ lớn; đây là điểm khác biệt so với First-Fit.

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

      Dòng 1: NNN (0≤N≤1090 \le N \le 10^90≤N≤109). Dòng 2: QQQ (0≤Q≤5000 \le Q \le 5000≤Q≤500). QQQ dòng tiếp theo, mỗi dòng là ALLOC size (1≤size≤1091 \le size \le 10^91≤size≤109) hoặc FREE id.

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

      Với mỗi thao tác ALLOC (theo thứ tự), một dòng là địa chỉ cấp phát hoặc FAIL.

    Ví dụ:

    Đầu vào:

    0
    1
    ALLOC 1
    

    Đầu ra:

    FAIL
    

    Đầu vào:

    30
    4
    ALLOC 10
    ALLOC 10
    FREE 1
    ALLOC 10
    

    Đầu ra:

    0
    10
    20
    

    Đang tải editor...