Оптимизаторы памяти для Windows NT/2000/XP: мысли вслух
Компьютеры в современной жизни заняли своё твёрдое место, и
уже трудно вспомнить, как без них обходились лет десять назад. Но
компьютер без программного обеспечения - это только груда железа, из
которого можно извлечь немного драгоценных металлов. Я
уверен, что программный рынок гораздо больше рынка компьютерного
железа. Наряду с действительно полезными программами, пользователям
предлагают и абсолютные пустышки. Но, разумеется, денег за них
просят. Можно понять, если какой-нибудь молодой да ранний набрался
поверхностных знаний из популярных книжек и начал выдавать программы
"на гора". Может быть, со временем наберётся мастерства... Но
довольно часто для того, чтоб пользователи отдавали за пустышки
деньги добровольно и с "чувством глубокого удовлетворения",
запускается и раскручивается какой-нибудь миф. Самым большим таким
надувательством в компьютерных технологиях, конечно же, была
"проблема" 2000 года. Но и более мелкие "утки" продолжают летать и
приносить деньги.
Первое, что из таких пернатых мне приходит на ум, это
программы, "увеличивающие скорость передачи данных через аналоговые
модемы на 300%". Даже комментировать не хочется...
Вот
и программы, оптимизирующие память компьютера - из той же стаи. И
просят за них от 10$ и до бесконечности (в зависимости от жадности и
технических знаний). Не вдаваясь в подробности, на процессорах х86
под управлением Windows, программа, более точно - процесс, работает
с виртуальной памятью, которую ему отводит операционная система.
Фрагменты виртуальной памяти могут находиться в физической памяти
компьютера (RAM), занимать часть файла подкачки (swap, он же paging
file) и располагаться в кэш-памяти (cache).
Виртуальная память процесса, хотя и имеет непрерывную
адресацию, разбивается на Страницы (page). Обычно, на 32-битных
процессорах х86, размер Страницы равен 4096 байт. Размер 4096 байт
определён архитектурой железа. В специальных случаях размер может
быть и 4 Мбайта. В
качестве аналогии доступа к физической памяти: RAM можно
представить, как ленту (а ещё лучше - логарифмическую линейку :), а
страницу - как окно (визир), которое перемещается по ленте.
Прочитать или записать можно только в то место, над которым
располагается окно и только страницу целиком. Управлением страницами
виртуальной памяти занимается Менеджер памяти (Windows Memory
Manager). Он входит в ядро операционной системы.
Менеджер памяти ведёт несколько списков состояния Страниц,
которые используют процессы и операционная система. Это список
Рабочих Страниц (Working Set) - тех, которые используются
операционной системой, драйверами, процессами и программами. Если
процесс пытается обратиться к странице, которой нет в списке Рабочих
Страниц процесса, то генерируется ошибка на уровне железа (Page
Fault) и Менеджер памяти может отвести ему новую страницу. Если
процесс освобождает Страницу, то Менеджер памяти убирает её из
списка Рабочих Страниц и, если она была изменена, то помещает её в
список Модифицированных Страниц (Modified Page List) для дальнейшей
обработки, а после неё - в "Отстойник" (Standby List). В противном
случае, Страница сразу отправляется в "Отстойник". Список
Модифицированных Страниц и "Отстойник" могут выполнять функции кэша
для процесса, но это отдаётся на усмотрение Менеджера
памяти.
Менеджер памяти ведёт ещё два списка - Список Свободных
Страниц (Free List) и список Пустых Страниц (Zeroed Page List). В
список Свободных Страниц помещаются Страницы, которые освободились
после окончания процесса. В список Пустых Страниц помещаются
Страницы, которые заполнила нулями специальная подпрограмма
Менеджера памяти (Zero Page Thread).
Теперь стоит обратить внимание на числа, которые показывает
Task Manager.
Available - свободное место RAM. Это сумма объёмов
"Отстойника", Пустых Страниц и Свободных Страниц. System Cache -
RAM, занятая системным кэшем. Это сумма "Отстойника" и Рабочих
Страниц операционной системы (System working set), которые
управляются специальным кэш-менеджером (Cache Manager), входящим в
ядро операционной системы.
Все
оптимизаторы RAM построены на одном принципе. Заставить Менеджер
памяти отдать оптимизатору как можно больше памяти. Если оптимизатор
- очень настырный, то ему удастся заполучить и Страницы из
"Отстойников" процессов и Рабочие Страницы операционной системы.
После чего оптимизатор торжественно рапортует о проделанной работе и
закрывается, освобождая всё захваченное место в памяти. После чего в лучшем случае производительность не
изменяется, а в худшем - упадёт. Как только Менеджер памяти дойдет
до некоего предела в выделении памяти оптимизатору, он начинает
сбрасывать Страницы в файл подкачки на диске. А некоторые из этих
Страниц надо будет потом вернуть с диска в память, если в них
кэшировались данные или программный код. Особенно это актуально для
серверных приложений. И всё равно Менеджер памяти всё перекроит
по-своему.
Программы, которые сидят в системном трее, управляются
Менеджером памяти как фоновые процессы, т.е. с минимизацией
используемой памяти.
Особенно меня порадовали оптимизаторы, которые грозятся
произвести дефрагментацию виртуальной памяти. Оптимизатор никогда не
знает, в каком физическом устройстве располагается тот или иной
адрес его собственной памяти. И кто ж ему позволит залезть в память
другой программы и там что-то передвигать...
В
общем, оптимизаторы RAM - сплошная маниловщина...
P.S.
Окончательным толчком к появлению этого материала послужила статья
одного из самых сведущих в операционных системах Windows людей в
мире Марка Руссиновича (Mark Russinovich) "The Memory-Optimization
Hoax. RAM optimizers make false promises", опубликованной в
январском номере "Windows & .NET Magazine", January
2004. И я
не могу не согласиться с ним в том, что как бы не относились к
Microsoft, но если бы эти оптимизаторы работали как надо, их
алгоритмы уже давно бы включили в ядра операционных систем
Windows...
|