Hệ thống của tôi: bộ nhớ vật lý: 3GB
Windows XP Service Pack 3 (32bit) Swap kích thước tập tin: 30GB
kích thước phân bổ bản đồ bộ nhớ lớn nhất?
Mục tiêu: Để biết kích thước bản đồ bộ nhớ có thể lớn nhất tôi có thể phân bổ trên máy tính của tôi.
Khi tôi chạy đoạn mã sau để cấp phát tệp bản đồ bộ nhớ 2GB, cuộc gọi không thành công.
handle = CreateFileMapping (INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, INT_MAX, NULL);
Tôi đã rất bối rối bởi điều này, bởi vì tôi có thể phân bổ một tệp bản đồ bộ nhớ lên đến kích thước tệp hoán đổi hệ thống là 30GB bằng cách liên tục gọi CreateFileMapping với 100mb tại một thời điểm.
Sau khi khởi động lại máy và chạy lại ứng dụng yêu cầu 2GB tệp ánh xạ bộ nhớ để CreateFileMapping nó hoạt động và nó trả về một xử lý hợp lệ. Vì vậy, điều này dẫn tôi một chút bối rối những gì đang xảy ra dưới mui xe với các cửa sổ?
Vì vậy, tình huống này, tôi có thể tạo nhiều tệp ánh xạ bộ nhớ nhỏ bằng cách sử dụng tất cả tệp trang hệ thống (30GB), nhưng khi yêu cầu phân bổ duy nhất 2gb cuộc gọi không thành công. Khi khởi động lại máy và chạy cùng một ứng dụng, cuộc gọi thành công!
Một số ghi chú:
1) Tệp ánh xạ bộ nhớ không được tải vào không gian địa chỉ ảo quá trình, không có chế độ xem nào cho tệp.
2) Hệ điều hành có thể cấp phát các tệp ánh xạ bộ nhớ 100MB nhỏ lên 30gb tệp trang của hệ thống! Ngay bây giờ là kết luận duy nhất tôi có thể đến, là người quản lý bộ nhớ ảo Windows XP SP3 (32bit) không thể dự trữ thành công 2gb được yêu cầu trong tệp trang hệ thống và sau đó không thành công do phân mảnh bộ nhớ hệ thống (nó bị lỗi). có vẻ như nó cần phải dự trữ phân bổ bộ nhớ tiếp tục, mặc dù tệp trang là 4kb mỗi bộ nhớ). Sau khi khởi động lại, tôi cho rằng phân mảnh bộ nhớ hệ thống ít hơn, do đó cho phép cùng một cuộc gọi thành công và phân bổ một tệp ánh xạ bộ nhớ có kích thước 2GB.
Tôi đã chạy một số thử nghiệm, sau khi chạy máy trong một ngày, tôi bắt đầu một ứng dụng nhỏ sẽ cấp phát một tệp bản đồ bộ nhớ 300MB và sau đó phát hành nó. Sau đó nó sẽ tăng kích thước lên 1mb và thử lại. Cuối cùng nó dừng lại ở 700mb và báo cáo (không đủ tài nguyên hệ thống). Sau đó tôi sẽ đi qua và đóng cửa mỗi ứng dụng và điều này sẽ lần lượt ngăn chặn các thông báo lỗi và nó cuối cùng tiếp tục phân bổ một tập tin ánh xạ bộ nhớ của kích thước 3.5gb!
Vì vậy, câu hỏi của tôi là những gì đang xảy ra ở đây? Phải có một số loại phân mảnh bộ nhớ xảy ra trong nội bộ với trình quản lý bộ nhớ ảo, bởi vì phân bổ 100MB bộ nhớ ánh xạ tập tin sẽ tiêu thụ lên đến 30gb của tập tin trang hệ thống (cam kết giới hạn).
Cập nhật
Kết luận là nếu bạn đang đi để tạo ra một bộ nhớ ánh xạ tập tin lớn được hỗ trợ bởi các tập tin trang hệ thống với INVALID_HANDLE_VALUE, sau đó các tập tin hệ thống trang (swap file) cần phải được thay đổi kích thước với kích thước yêu cầu và ở trong trạng thái không bị phân mảnh cho số phân bổ lớn> 2gb! Mặc dù dưới tải IO nặng nó vẫn có thể thất bại. Để khắc phục tất cả những vấn đề này, bạn có thể tạo tệp của riêng mình với kích thước cần thiết (tôi đã làm 1tb) và bản đồ bộ nhớ cho tệp đó thay thế.
Cập nhật cuối cùng
Tôi chạy cái test tương tự trên 7 hộp Windows, và trước sự ngạc nhiên của tôi nó hoạt động mỗi lần duy nhất (lên đến kích thước tập tin trang hệ thống) mà không cần chạm bất cứ điều gì. Vì vậy, tôi đoán đây chỉ là một lỗi, phân bổ bộ nhớ lớn có thể không thường xuyên hơn trên Windows XP so với Windows 7.
Kết luận duy nhất tôi có thể đến, là bảng chứa 2gb tệp trang 4kb quá lớn để bộ nhớ hệ thống có thể xử lý sao cho không thành công. – Chad
Đây là một bí ẩn. Bất kể bộ nhớ ảo và vật lý của bạn lớn đến mức nào, cho dù bạn đang chạy bao nhiêu tiến trình, bạn không thể tạo tệp ánh xạ mem lớn hơn ~ 300MB trên Windows 32 bit. –