Теория
Предположим, что существует N страниц данных, которые включают:
- все данные, принадлежащие всем процессам
- все файл данных на диске (который может быть предварительно извлечен в кэш виртуальной файловой системы)
- вся информация поиска DNS (которая может быть предварительно извлечена в некоторый кеш DNS)
- все данные c HTML страниц, изображений и т. Д. c (которые могут быть предварительно извлечены в какой-то кеш веб-страниц)
- что-либо еще, что вы можете предварительно выбрать, прежде чем программное обеспечение захочет его
- все данные, которые могут быть предварительно сгенерированы программным обеспечением (например, такие как сита простых чисел, кэшированные данные пикселей, сгенерированные из шрифтов, mipmaps, ...)
Цель состоит в заполнении ОЗУ с «вероятнее всего, будут необходимы следующие» данные из всех возможных источников. Обратите внимание, что это может включать (например, отправку недавно использованных данных, принадлежащих процессу, из ОЗУ в пространство подкачки, чтобы вы могли использовать эту ОЗУ для предварительной выборки данных из inte rnet, который не был запрошен (если вы знаете данные скорее всего понадобится раньше, чем данные процесса).
Существует 3 основных проблемы:
некоторые данные контролируются обычными процессами, а не ОС; и не существует стандартного способа позволить нормальным процессам участвовать в схеме операционной системы «заполняйте ОЗУ наиболее вероятными необходимыми данными».
часто вы не можете точно предсказать будущее. Обратите внимание, что вы можете посмотреть на такие вещи, как, когда процесс проснется после вызова «sleep()
», чтобы точно предсказать крошечную часть будущего; и вы можете отслеживать статистику, чтобы неточно предсказывать другие вещи (например, если вы знаете, что пользователь проверял определенный веб-сайт во время обеда 9 из предыдущих 10 дней, то вы можете предсказать, что есть 90% -ная вероятность, что он проверит этот веб-сайт по адресу время обеда сегодня). Конечно (в некоторых случаях) «последнее использованное» является разумным предиктором «скорее всего, скоро понадобится снова»; что приводит к «сохранению последнего использованного в ОЗУ», откуда и происходит «выселение последнего использованного» (LRU).
есть затраты, связанные с передачей данных, где стоимость зависит от того, где сейчас находятся данные и насколько загружено оборудование, необходимое для извлечения данных в настоящее время (например, выборка данных из быстрого соединения Inte rnet может быть дешевой, если сетевая карта в любом случае ничего не делает, но дорогой, когда сетевая карта занят выполнением множества других вещей)
Практика
Вы можете попытаться решить все проблемы (например, отслеживать множество вещей и иметь причудливые алгоритмы прогнозирования, и принимать во внимание стоимость передачи и / или генерации данных при принятии решения о том, что делать, и предоставлять своего рода «текущее уведомление о нехватке памяти», которое обычные процессы могут использовать для участия в «хранении оперативной памяти» операционной системы. заполнены «наиболее вероятными данными» (схема); но все это сложно и сложно (например, вы хотите убедиться, что затраты на вычисление того, что должно / не должно быть в ОЗУ, не будет стоить больше производительности, чем вы получаете), поэтому операционные системы часто делают что-то намного проще и меньше вступает в силу.
В частности; очень простая операционная система может только «исключить наименее использованное» (без предварительной выборки, без учета стоимости переносов и без участия обычных процессов вообще); и это может считаться «достаточно хорошим», несмотря на то, что оно ужасно плохое.
Если произошла ошибка страницы, то мы должны заменить наименее недавно использованную страницу процесса, который запрашивает фрейм, или мы должны заменить страницу, которая реже всего используется во всей основной памяти?
В идеале, вы должны попытаться удалить из «памяти с наименьшей вероятностью, которая скоро понадобится» всю память (возможно, включая данные, принадлежащие самому ядру); но компромиссы неизбежны, и нечего сказать, что «достаточно хорошая, хотя и ужасно плохая» ОС не может просто выселить наименее недавно использованную страницу из текущего процесса.