Кеширование файлов в Windows

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

Итак, попробуйте ответить на несколько вопросов в уме, а потом загляните под кат и сравните ответы.
1. Когда вы запускаете exe файл, то Windows загружает весь exe в память или нет? И почему?
2. Когда exe загружает dll, то загружает ли он всю dll или нет? И почему?
3. Когда вы запускаете игру в первый раз, потом выходите и запускаете ее второй раз - почему во второй раз она запускается намного быстрее?
4. Если у вас Vista - посмотрите сколько у вас свободной памяти в данный момент? Меньше 100 мб, даже если у вас установлено 4 гб памяти, угадал? Почему?

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

В реальности же все немного сложнее - оперативной памяти всегда меньше, чем дисковой, поэтому приходится часть файлов выгружать, чтобы подгрузить новый, когда память заканчивается. Во всех версиях Windows до Vista, не было приоритетов кешированных файлов, а значит какой-нибудь антивирус или фоновый индексатор диска (утилита для быстрого поиска, например), портили кеш, так как все время открывали новые ненужные файлы и старые нужные файлы выгружались из памяти. В Vista введены приоритеты закешированных файлов и поток, открывающий файлы с приоритетом 0 не вытеснит из кеша файлы с приоритетом больше 0, а только файлы с приоритетом 0.

А что же происходит, когда вы запускаете приложение? Windows не загружает весь exe файл и все его dll в память, так как это неэффективно - большая часть exe и dll никогда не будет вызвана и нечего им делать в оперативной памяти. Программисты знают, что есть такая вещь, как Memory Mapped files - это некий набор операций, поддерживаемый на уровне процессора, который позволяет отображать файлы на оперативную память. Общий смысл их работы в том, что программист говорит "Отобрази мне файл MSPaint.exe в память и дай указатель на него", а потом работает с этим указателем, как просто в областью памяти, куда уже загружен файл. А на самом деле он еще не загружен и будет грузиться только кусочками. Каждый кусочек будет загружен только при первом обращении к нему. Соответственно те куски файлов, к которым никогда не обращаются, не попадают в оперативную память, а остаются на диске.

А что происходит, когда оперативная память кончилась и Windows решает выгрузить из памяти часть exe файла в swap файл? Swap файл - это файл, который Windows использует, как добавку к оперативной памяти. Она выгружает в него области памяти, которые редко используются и потом при обращении к ним грузит обратно. Этот файл по умолчанию включен и он довольно большой и выключать его не советуют. Но у меня он отключен.

Оказывается Windows достаточно умна, чтобы понять, что кусок памяти, который она решила выгрузить, не был изменен с момента загрузки его из файла, а значит его незачем сохранять в swap - она просто удаляет из памяти и оставляет только ссылку на файл, из которого была загружена эта память. Таким образом, в swap попадают только изменяемые области памяти - та память, которую выделяют приложения и потом долго не используют.

Когда exe файл загружает dll, то система менеджмента памяти в Windows просто создает в Memory mapped file для этого файла и, соответственно, загружается только нужная часть файла в память при обращении к этой части. Это легко проверить - практически любой ехе файл в Windows загружает множество dll, но если сложить их размер и посмотреть размер приложения в памяти, то приложение может занимать гораздо меньше памяти (я не говорю про те приложения, которые кучу памяти выделяют для своей работы и занимают по сотне мегабайт).
Во всех версиях Windows, начиная с WinXP, есть еще механизм Prefetch файлов (загляните в свой каталог C:\WINDOWS\Prefetch - там лежат файлы для Prefetch). Не буду вдаваться в подробности, и так уже много написал, но грубо говоря, там хранятся файлы, в которых есть информация о программах, что вы запускали и о том, какие файлы вы потом ими открывали. Тем самым, Windows знает, какие файлы вам могут понадобиться при запуске какой-то программы и грузит их тоже на всякий случай. Например, вы запустили Блокнот, создали там файл и сохранили его, Windows запишет в Prefetch файл инфу об этом. При следующем запуске блокнота, она загрузит и этот созданный вами текстовый файл в память.

В чем плюсы кеширования и что вам может дать это знание?

1. Если у вас достаточно много памяти, чтобы вместить кешированные копии большинства частоиспользуемых файлов, то у вас все при втором запуске будет работать гораздо быстрее (вы замечали это, правда?)

2. Не перегружайте компьютер без надобности. Это самый простой совет, но многие им не пользуются. Используйте режим сна - в этом режиме компьютер почти не потребляет энергии и не шумит, зато вся его память и кешированные файлы остаются на месте, а значит вы получите полностью готовый быстрый компьютер сразу после включения. Помните, что после перезагрузки Windows должен опять начать кешировать все ваши файлы заново. На это уходит ужасно много времени. Любое приложение запускается в разы медленнее - оно вам надо? Едиснтвенная причина, по которой стоит перегружаться - это то, что некоторые программы после инсталяции требуют перезагрузки или то, что иногда драйверы разных устройств могут глючить после просыпания и выдавать BSOD, но про BSOD я напишу в следующем посте.

3. Отключите swap файл, если у вас всегда есть 2-3 Gb свободной памяти. Ибо он вам не нужен. Но никогда не отключайте swap файл на Vista - там у вас никогда не будет свободной памяти, т.к. Vista всегда использует всю память для кеширования файлов.

4. Помните, что все открываемые вами файлы хранятся в памяти. Любой злоумышленник, знающий всего 1 команду в WinDBG, может получить список этих файлов и даже прочитать их. Да, для этого ему нужен доступ к вашему компьютеру или же разрешенная удаленная отладка по сети.

Ответить

 

 

 

Вы можете использовать эти HTML тэги

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>