Giả thuyết, tôi muốn thực hiện việc viết tuần tự cho một tệp có khả năng rất lớn.Có madvise (___, ___, MADV_DONTNEED) hướng dẫn hệ điều hành để lười biếng ghi vào đĩa?
Nếu tôi mmap() một khu vực khổng lồ và madvise (MADV_SEQUENTIAL) trên toàn bộ khu vực đó, sau đó tôi có thể ghi vào bộ nhớ một cách tương đối hiệu quả. Điều này tôi đã nhận được để làm việc tốt.
Bây giờ, để giải phóng tài nguyên hệ điều hành khác nhau khi tôi đang viết, tôi thỉnh thoảng thực hiện một munmap() trên các phần nhỏ của bộ nhớ đã được ghi vào. Mối quan tâm của tôi là munmap() và msync() sẽ chặn luồng của tôi, chờ dữ liệu được cam kết vật lý vào đĩa. Tôi không thể làm chậm nhà văn của mình chút nào, vì vậy tôi cần phải tìm cách khác.
Sẽ tốt hơn nếu sử dụng madvise (MADV_DONTNEED) trên đoạn bộ nhớ nhỏ, đã viết? Tôi muốn nói với hệ điều hành để viết bộ nhớ đó vào đĩa một cách uể oải, và không để chặn luồng gọi của tôi.
Các manpage trên madvise() đã cho biết, đó là khá mơ hồ:
MADV_DONTNEED
Do not expect access in the near future. (For the time being, the
application is finished with the given range, so the kernel can free
resources associated with it.) Subsequent accesses of pages in this
range will succeed, but will result either in re-loading of the memory
contents from the underlying mapped file (see mmap(2)) or
zero-fill-on-demand pages for mappings without an underlying file.
Tôi sẽ không thử điều này; 'MADV_DONTNEED' trên một ánh xạ tệp có thể được hiểu là có nghĩa là bạn muốn hệ điều hành * bỏ đi * thay đổi đối với tệp. – zwol
@Zack, bạn có tham chiếu cho MADV_DONTNEED loại bỏ các thay đổi đối với tệp không? – Anton
@antonm http://man7.org/tlpi/code/online/dist/vmem/madvise_dontneed.c.html có một chương trình thể hiện nó (không độc lập, không may, nhưng dễ dàng, đủ để sửa đổi). Xem thêm https://www.gnu.org/software/libc/manual/html_node/Memory_002dmapped-I_002fO.html ("' MADV_DONTNEED': Khu vực không còn cần thiết. Hạt nhân có thể miễn phí các trang này, * gây ra bất kỳ thay đổi nào các trang bị mất * "(nhấn mạnh mỏ)) và chuỗi LKML này từ năm 2005: https://lkml.org/lkml/2005/6/28/188. – zwol