Phương Pháp Thu Gom Rác Dựa Trên Xử Lý Song Song - nói dối e blog

Phương Pháp Thu Gom Rác Dựa Trên Xử Lý Song Song

Hệ thống máy ảo đang phát triển gần đây của tôi hoạt động dựa trên cơ chế thu gom rác (garbage collection), sử dụng thuật toán đánh dấu và sắp xếp (mark-compact). Đặc điểm nổi bật của phương pháp này là không yêu cầu lượng bộ nhớ phụ lớn, đồng thời có khả năng loại bỏ hoàn toàn phân mảnh bộ nhớ. Những vùng nhớ được giữ lâu dài sẽ được nén về phía đáy khối bộ nhớ, không cần di chuyển trong quá trình dọn dẹp.

Đối với các ứng dụng server cần vận hành ổn định lâu dài, trên hệ điều hành 32-bit với không gian địa chỉ giới hạn, công nghệ GC vẫn là giải pháp toàn diện và hiệu quả nhất để giải quyết vấn đề phân mảnh bộ nhớ. Tôi dự kiến sẽ xây dựng toàn bộ logic chương trình server trong môi trường máy ảo. Khác với ứng dụng client, chúng ta có thể linh hoạt hơn trong sử dụng bộ nhớ vật lý. Vì vậy, tại thời điểm khởi động, hệ thống sẽ dành sẵn khối bộ nhớ từ 1-2GB cho máy ảo sử dụng. Trước khi khối bộ nhớ này bị cạn kiệt, mọi thao tác phân bổ bộ nhớ sẽ diễn ra cực kỳ nhanh chóng. Tuy nhiên, khi xảy ra quá trình GC, chỉ riêng việc quét toàn bộ bộ nhớ cũng đã tiêu tốn rất nhiều thời gian, điều này buộc tôi phải tìm kiếm giải pháp thay thế.

Giải pháp tự nhiên xuất hiện trong đầu tôi chính là xử lý song song. Nếu có thể thực hiện GC mà không làm gián đoạn luồng xử lý logic, dù thời gian GC có lâu hơn chút đỉnh cũng hoàn toàn chấp nhận được. Trong bối cảnh công nghệ phần cứng đa nhân đang phát triển vượt bậc, việc tối ưu hóa đồng thời khai thác hiệu suất đa CPU sẽ trở thành xu hướng thiết kế phần mềm tất yếu trong tương lai.

Mô hình khả thi mà tôi đề xuất như sau: Giả định quá trình GC trên khối bộ nhớ 2GB mất khoảng 10 giây (con số ước tính, chưa kiểm chứng thực tế - tôi cho rằng với tốc độ bus bộ nhớ hiện đại, việc hoàn thành trong 10 giây là hoàn toàn khả thi). Trong khoảng thời gian này, lượng yêu cầu phân bổ bộ nhớ mới phát sinh không quá lớn, ví dụ khoảng 8MB, hoàn toàn có thể đáp ứng yêu cầu. Vì vậy, chúng ta sẽ dành riêng một vùng bộ nhớ nhỏ này làm vùng dự phòng.

Cần lưu ý rằng ngăn xếp chương trình là thành phần không cần xử lý sắp xếp bộ nhớ, nên có thể tách riêng. Phần còn lại là khối bộ nhớ chính với dung lượng vượt quá 1GB. Thực tế, trong quá trình GC, các thao tác sửa đổi dữ liệu trên khối bộ nhớ này là cực kỳ ít ỏi. Nếu có thể, tại thời điểm kích hoạt GC, chúng ta chia sẻ khối bộ nhớ chính cho tiến trình xử lý GC theo cơ chế copy-on-write. Trên hệ thống Unix có thể thực hiện trực tiếp thông qua lệnh fork(), còn trên Windows sẽ sử dụng kỹ thuật chia sẻ bộ nhớ (shared memory). Tại thời điểm chia sẻ, cần đảm bảo đây là thao tác nguyên tử. Quá trình GC sẽ tiến hành phân tích và sắp xếp trên khối bộ nhớ được chia sẻ mà không ảnh hưởng đến tiến trình logic chính. Mọi yêu cầu phân bổ bộ nhớ từ tiến trình chính sẽ được xử lý trên vùng bộ nhớ dự phòng. Các thao tác ghi/cập nhật lên khối bộ nhớ chính trong lúc GC sẽ được ghi nhận log trên vùng dự phòng.

Khi tiến trình GC hoàn tất công việc, khối bộ nhớ đã được sắp xếp sẽ được chuyển đổi trở lại cho tiến trình chính sử dụng. Lúc này tiến trình chính tạm dừng xử lý, thực hiện tuần tự các thao tác đã được log. (Tại đây, tiến trình GC cần cung cấp bảng ánh xạ địa chỉ cũ-mới sau khi sắp xếp, đồng thời xử lý trước các bản log). Sau đó, dữ liệu từ vùng bộ nhớ dự phòng sẽ được chuyển vào khối bộ nhớ chính. Dù chuỗi thao tác này có phần phức tạp, nhưng lượng dữ liệu xử lý nhỏ hơn rất nhiều so với khối bộ nhớ chính, nên có thể hoàn thành trong thời gian cực ngắn.

Thảo luận chi tiết trên maillist:

0%