Tôi có vấn đề sau đây:Zero, một ánh xạ bộ nhớ lớn với `madvise`
tôi bố trí một mảng lớn của bộ nhớ (nhiều GiB) thông qua mmap
với MAP_ANONYMOUS
. Chunk đó giữ một bản đồ băm lớn mà cần phải được zeroed mỗi bây giờ và sau đó. Không phải toàn bộ ánh xạ có thể được sử dụng trong mỗi vòng (không phải mọi trang đều bị lỗi), do đó, memset
không phải là một ý tưởng hay - mất quá nhiều thời gian.
Chiến lược tốt nhất để thực hiện điều này nhanh chóng là gì?
Will
madvise(ptr, length, MADV_DONTNEED);
bảo đảm với tôi rằng bất kỳ truy cập tiếp theo cung cấp các trang trống mới?
Từ trang Linux man madvise
:
Cuộc gọi này không ảnh hưởng đến ngữ nghĩa của các ứng dụng (ngoại trừ trong trường hợp MADV_DONTNEED), nhưng có thể ảnh hưởng đến hiệu quả của nó. Hạt nhân được tự do bỏ qua lời khuyên.
...
MADV_DONTNEED
truy cập tiếp theo của trang trong phạm vi này sẽ thành công, nhưng sẽ dẫn đến hoặc trong tải lại các nội dung bộ nhớ từ cơ bản tập tin ánh xạ (xem mmap (2)) hoặc các trang không theo yêu cầu cho ánh xạ mà không có tệp cơ bản.
...
Linux thực hiện (2.4.0) xem cuộc gọi hệ thống này nhiều hơn như một lệnh hơn là lời khuyên ...
Hoặc tôi phải munmap
và remap khu vực một lần nữa?
Nó phải làm việc trên Linux và lý tưởng có hành vi tương tự trên OS X.
Tôi không có cách nào để kiểm tra điều này, nhưng FWIW, [OSX] (https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/madvise.2. html) trang người đàn ông không đề cập đến bất cứ điều gì về các trang 'madvise'd là số không. Phiên bản [posix] (http://pubs.opengroup.org/onlinepubs/009695399/functions/posix_madvise.html) cũng không. Là chi phí rất lớn để tái phân bổ không gian bộ nhớ? – Collin
@Collin Nó không phải là hiệu suất quá lớn khôn ngoan, nhưng tôi sẽ cần phải đình chỉ chủ đề của tôi và nếu cần thiết cập nhật con trỏ đến một bản đồ mới. Đó là mã song song hơn mà có thể đi sai ... Và tôi là loại tò mò như thế nào cuộc gọi này thực sự hoạt động. –