Мне нужно заставить ОС очищать страницы, используемые для сопоставленного файла. У меня нет дескриптора файла, поэтому posix_fadvise не может быть использован.
Наше приложение кэширует множество файлов, отображая их в памяти. После сопоставления файла (т. Е. У нас есть указатель от mmap()
), мы закрываем файл. Когда на более позднем этапе мы должны очистить кеш, мы хотим также очистить страницы в кеше ОС. То есть мы хотим разархивировать файл и сделать что-то вроде posix_fadvise(POSIX_FADV_DONTNEED)
, но дескриптор файла на данный момент недоступен.
Поток выглядит так:
//caching stage
fd = open("file");
data = mmap(fd, <mmap flags>);
close(fd);
//clean-up stage
munmap(data);
// posix_fadvise(???, POSIX_FADV_DONTNEED);
Есть ли способ очистить кэшированные страницы без дескриптора файла?
Я подумал о следующих двух обходных путях:
- Сохраняя файлы открытыми, чтобы у меня были действительные дескрипторы во время очистки. Однако файлов может быть несколько десятков тысяч, и сохранение их всех открытыми может повлиять на производительность ОС.
- Сохраните путь к файлу и откройте его, чтобы получить дескриптор и вызвать
posix_fadvise()
. Но вопрос в том, будет ли старая сопоставленная область связана с тем же файлом? И будет ли fadvise()
очищать кэшированные страницы в этом сценарии?