że następujący problem:zero duża odwzorowanie pamięci w `madvise`
przydzielić sporą część pamięci (wielokrotne listwy) poprzez mmap
z MAP_ANONYMOUS
. Ten fragment zawiera dużą mapę mieszania, która musi być wyzerowana co jakiś czas. Nie całe mapowanie może być użyte w każdej rundzie (nie każda strona jest uszkodzona), więc memset
nie jest dobrym pomysłem - trwa zbyt długo.
Jaka jest najlepsza strategia, aby szybko to zrobić?
Will
madvise(ptr, length, MADV_DONTNEED);
gwarancja mi, że wszelkie późniejsze dostępy dostarczenie nowych pustych stron?
Na stronie Linux man madvise
:
Ta rozmowa nie wpływa semantyki aplikacji (z wyjątkiem przypadku MADV_DONTNEED), ale może mieć wpływ na jego wydajność. Jądro może ignorować porady.
...
MADV_DONTNEED
Kolejne dostępy stron w tym zakresie będzie się uda, ale spowoduje zarówno w przeładunku zawartości pamięci z podstawowej odwzorowanym pliku (patrz mmap (2)) lub strony o zerowym wypełnieniu na żądanie w przypadku odwzorowań bez bazowego pliku.
...
Obecna implementacja Linux (2.4.0) postrzega to jako wywołanie systemowe więcej niż polecenia jako porady ...
Albo muszę munmap
i przemapować region nowo?
To musi działać na Linuksie, a najlepiej mieć takie samo zachowanie w Mac OS X.
Nie mam żadnego sposobu, aby to przetestować, ale FWIW, [OSX] (https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/madvise.2. html) strona man nie wspomina nic o 'madvise'd stronach zero. Wersja [posix] (http://pubs.opengroup.org/onlinepubs/009695399/functions/posix_madvise.html) też nie. Czy koszty są ogromne, aby zmnieszyć pamięć? – Collin
@Collin To nie jest zbyt duża wydajność, ale musiałbym zawiesić moje wątki i jeśli to konieczne zaktualizować wskaźnik do nowego mapowania. To jest bardziej równoległy kod, który może pójść źle ... I jestem ciekawy, jak to połączenie naprawdę działa. –