Вопрос

Операционные системы читают с диска больше, чем на самом деле запрашивает программа, поскольку в будущем программе, скорее всего, понадобится близлежащая информация.В моем приложении, когда я извлекаю элемент с диска, я хотел бы показать интервал информации вокруг элемента.Существует компромисс между количеством информации, которую я запрашиваю и показываю, и скоростью.Однако, поскольку ОС уже читает больше, чем я запрашивал, доступ к этим байтам, уже находящимся в памяти, бесплатен.Какой API я могу использовать, чтобы узнать, что находится в кешах ОС?

В качестве альтернативы я мог бы использовать файлы с отображением в памяти.В этом случае задача сводится к выяснению, закачивается страница на диск или нет.Можно ли это сделать в любой распространенной ОС?

РЕДАКТИРОВАТЬ:Сопутствующий документ http://www.azulsystems.com/events/mspc_2008/2008_MSPC.pdf

Это было полезно?

Решение

Вы действительно можете использовать ваш второй метод, по крайней мере, на Linux. mmap() файл, затем используйте mincore() Функция, чтобы определить, какие страницы проживают. От страницы человека:

int mincore(void *addr, size_t length, unsigned char *vec);

mincore() Возвращает вектор, который указывает, являются ли страницы виртуальной памяти вызывающего процесса в Core (RAM), и поэтому не приведет к ссылке доступа к диску (неисправность страниц). Ядро возвращает информацию о резиденте о страницах, начиная с адреса addrи продолжая length Байты.

Здесь, конечно, состояние гонки здесь - mincore() Можете сказать вам, что страница проживает, но тогда она может быть заменена, прежде чем добраться до него. такова жизнь.

Другие советы

Вы исходите из неправильного предположения.По крайней мере, в Linux ОС попытается выяснить шаблоны доступа программы.Если вы читаете файл последовательно, ядро ​​будет выполнять предварительную выборку последовательно.Если вы будете много прыгать по файлу, ядро, вероятно, сначала запутается, но потом перестанет выполнять предварительную выборку.

Так что если вы на самом деле являются обращаясь к вашему файлу последовательно, вы знаете, что, вероятно, предварительно загружено:следующий блок данных.Если вы ищете случайно, вероятно, ничто другое поблизости не выбрано заранее.

Попробуйте подойти к этому по-другому.Прежде чем вызывать read() для получения информации, которую вы нуждаться, вызов фадвайз() чтобы сообщить ОС, что вы хотеть чтобы началась загрузка..

Мне также любопытно узнать, какое приложение вы используете, которое может работать правильно, работая только с данными, которые случайно оказались в файловом кеше.Я чувствую, что мы могли бы найти хороший способ удовлетворить вашу потребность, если бы вы разместили немного больше информации.

Это, безусловно, не может быть сделано в окнах. В Windows поведение прочитанного впереди зависит от ОС, и даже если бы она могла сказать вам, сколько он прочитал впереди, это не сделает вам никакого хорошего, потому что, как только вы узнаете, на страницах памяти, которые используется для кэширования, может быть восстановлено для некоторого другого использования.

То же самое касается, определяя, является ли страница резидентом или нет. Как только вы узнаете, что ответ может измениться, когда какая-то другая нить нуждается в памяти для чего-то еще.

Если вы действительно хотели сделать, Thins в Windows вы можете отключить буферизацию и управлять буферами самостоятельно. Это самый быстрый путь IO, но это также самый сложный - вы должны быть очень осторожны, и часто ОС все еще может сделать это лучше.

Какую API я могу использовать, чтобы узнать, что в кешах ОС?

Конечно, нет стандартного способа сделать это для любой системы POSIX, и я не знаю ни одного нестандартного способа, специфичного для Linux. Единственное, что вы можете знать (почти) наверняка, заключается в том, что файловая система будет прочитать несколько размеров страницы, обычно 4 КБ. Итак, если ваши чтения невелики, вы можете знать с высокой вероятностью (хотя не наверняка), что данные на окружающей странице в памяти.

Вы могли бы, по договорной цене вскайдению, делают Tricksy такие, как время, как долго прочитал систему чтения. Если это быстро, то есть 100 микросекунд или меньше, это, вероятно, был хит кэшем. Как только он встает до миллисекунда или около того, это было, вероятно, мисс кеша. Конечно, это на самом деле не очень помогает вам, и это очень очень хрупко.

Обратите внимание, что, как только файловая система скопировала данные для пользовательских буферов, она свободна немедленно отказаться от буферов, удерживающих данные с диска. Вероятно, это не делает это сразу, но вы не можете сказать наверняка.

Наконец, я второй @ кармастьнское предложение: объяснить, что более широкий конец вы пытаетесь достичь. Вероятно, есть способ сделать это, но тот, который вы предложили, не так ли.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top