Ipoteticamente, supponiamo di voler eseguire la scrittura sequenziale su un file potenzialmente molto grande.Madvise (___, ___, MADV_DONTNEED) istruisce il sistema operativo a scrivere pigramente sul disco?
Se I mmap() è una regione gigantesca e madvise (MADV_SEQUENTIAL) in tutta la regione, posso scrivere in memoria in modo relativamente efficiente. Questo ho ottenuto di lavorare bene.
Ora, per liberare varie risorse del sistema operativo mentre sto scrivendo, eseguo occasionalmente un munmap() su piccoli pezzi di memoria che sono già stati scritti. La mia preoccupazione è che munmap() e msync() blocchino il mio thread, in attesa che i dati vengano fisicamente trasferiti sul disco. Non posso affatto rallentare il mio scrittore, quindi ho bisogno di trovare un altro modo.
Sarebbe meglio usare madvise (MADV_DONTNEED) sul piccolo blocco di memoria già scritto? Voglio dire al sistema operativo di scrivere quella memoria sul disco pigramente, e non per bloccare il mio thread chiamante.
La pagina di manuale su madvise() ha questo da dire, che è piuttosto ambigua:
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.
Non ci proverei; 'MADV_DONTNEED' su un mapping di file può essere interpretato nel senso che vuoi che il SO * passi via * le modifiche al file. – zwol
@Zack, hai un riferimento per MADV_DONTNEED che ignora le modifiche a un file? – Anton
@antonm http://man7.org/tlpi/code/online/dist/vmem/madvise_dontneed.c.html ha un programma che lo dimostra (non autonomo, sfortunatamente, ma abbastanza facile da modificare). Vedi anche https://www.gnu.org/software/libc/manual/html_node/Memory_002dmapped-I_002fO.html ("' MADV_DONTNEED': La regione non è più necessaria. Il kernel può liberare queste pagine, * causando eventuali modifiche a le pagine da perdere * "(enfasi mia)) e questo thread LKML del 2005: https://lkml.org/lkml/2005/6/28/188. – zwol