Hipotetycznie, przypuśćmy, że chcę wykonać sekwencyjne zapisywanie do potencjalnie bardzo dużego pliku.Czy madvise (___, ___, MADV_DONTNEED) instruuje system operacyjny, aby leniwie zapisywał na dysk?
Jeśli I mmap() gigantyczny region i madvise (MADV_SEQUENTIAL) na cały region, to mogę pisać do pamięci w stosunkowo efektywny sposób. To mi się udało do pracy.
Teraz, aby zwolnić różne zasoby systemu operacyjnego podczas pisania, od czasu do czasu wykonuję munmap() na małych porcjach pamięci, które zostały już napisane. Obawiam się, że munmap() i msync() zablokują mój wątek, czekając, aż dane zostaną fizycznie przekazane na dysk. Nie mogę zwolnić mojego pisarza, więc muszę znaleźć inny sposób.
Czy lepiej użyć madvise (MADV_DONTNEED) na małym, już napisanym kawałku pamięci? Chcę, żeby system operacyjny zapisał tę pamięć na dysk leniwie i nie blokował mojego wątku wywołującego.
manpage na madvise() ma do powiedzenia, co jest dość niejednoznaczna:
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.
Nie spróbowałbym tego; 'MADV_DONTNEED' na mapowaniu pliku może być interpretowane jako oznaczające, że system ma * wyrzucać * zmiany do pliku. – zwol
@Zack, czy masz odniesienie do MADV_DONTNEED, odrzucając zmiany w pliku? – Anton
@antonm http://man7.org/tlpi/code/online/dist/vmem/madvise_dontneed.c.html ma program, który to demonstruje (nie jest samowystarczalny, niestety, ale łatwy do modyfikacji). Zobacz także https://www.gnu.org/software/libc/manual/html_node/Memory_002dmapped-I_002fO.html ("' MADV_DONTNEED': Region nie jest już potrzebny. Jądro może zwolnić te strony, * powodując wszelkie zmiany w strony do zaginięcia * "(podkreślenie moje)) i ten wątek LKML z 2005 roku: https://lkml.org/lkml/2005/6/28/188. – zwol