Избыточная замена окон?

#windows #memory #windows-vista #operating-system

Вопрос:

Это может быть связано не только с программированием, но и в большей степени со структурой операционной системы.

При запуске 32-разрядной версии Vista на совершенно новом ноутбуке с 3 ГБ памяти система в режиме ожидания потребляет около 40% своей памяти. Помимо того факта, что это само по себе возмутительно, операционная система должна быть в состоянии красиво разместить все процессы в памяти и никогда не нужно будет переключаться на диск.
Тем не менее, глядя на диспетчер задач, я вижу, что процессы постоянно ошибаются на страницах. Не так много, но все же. например explorer.exe примерно по одному примерно каждую секунду.

Это почему? Почему ОС испытывает потребность в замене страниц, хотя у нее достаточно физической памяти?

Ответ №1:

Ошибка страницы не обязательно означает, что что-то было выгружено на диск. Современная ОС имеет множество уровней состояния, в котором может находиться страница, например, Windows, вероятно, будет различать страницу памяти, которая активно используется, и страницу памяти, к которой некоторое время не прикасались и которую при необходимости можно было бы выгрузить на диск. (Это облегчает работу пейджера, потому что ему нужно только просмотреть страницы второго типа, чтобы узнать, какие из них он может просматривать.) Итак, как страница переходит из второго состояния обратно в первое? Ядро устанавливает бит на этой странице, указывающий, что если что-либо получит к ней доступ, то страница будет помечена как «активная» и возвращена в первое состояние. Это приводит к ошибке страницы.

Другие вещи, которые могут вызвать ошибку страницы, — это такие вещи, как файлы, сопоставленные с памятью. Приложение запрашивает, чтобы файл был сопоставлен с памятью, то есть он просто появляется в памяти всякий раз, когда приложение хочет прочитать из него. Очевидно, что было бы чрезвычайно дорого загрузить весь файл в память сразу, поэтому ядро просто помечает пространство памяти битом «пожалуйста, ошибка страницы, если к ней когда-либо обращались», и считывает с диска, если приложение когда-либо коснется этой страницы.

Реальная ситуация намного сложнее, чем описанная выше, но это должно дать вам общее представление о том, что может происходить.

Ответ №2:

Совершенно логично, что в проводнике каждую секунду появляется ошибка подкачки, когда вы смотрите на диспетчер задач. Диспетчер задач обновляется каждую секунду, что также приведет к обновлению графика в области уведомлений. Это так explorer.exe это управляет областью уведомлений и ее значками. Поэтому каждый раз, когда диспетчер задач обновляет свой небольшой график, проводнику необходимо загружать соответствующий значок из taskmgr.exe что приводит к ошибке страницы. (Подробнее читайте в отличном блоге Раймонда Чена)

Я почти уверен, что Рэймонд Чен объясняет пару других «проблем» с ошибками страниц, но я не могу найти статью(статьи) прямо сейчас. В принципе, ошибка страницы не всегда означает, что что-то должно быть загружено с диска.

Комментарии:

1. Бонусные баллы за ссылку на пост Рэймонда Чена. Я как раз собирался опубликовать ссылку 😉

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

Ответ №3:

При работе в режиме ожидания система потребляет около 40% своей памяти.

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

Что касается обширной подкачки, я думаю (но не уверен), что это еще одна агрессивная стратегия кэширования. Если системная память должна была заполниться (что было бы довольно легко, скажем, на 1 ГБ с парой больших приложений, таких как Visual Studio, или даже на 4 ГБ, если вы используете одну или две виртуальные машины), системе придется выложить некоторый кусок памяти на диск, прежде чем она сможет прочитать страницу с диска в память. Если операционная система агрессивно выгружает неактивную память на диск во время простоя, она может сохранить эту операцию, когда другой процесс имеет ошибку страницы.

Ответ №4:

Конечно, Vista использует память, необходимую вашему компьютеру для загрузки и более быстрой работы. Он освободит/заменит память, когда это потребуется какой-либо другой программе.

Почему бы не использовать ресурс, если он есть, доступен и может быть выпущен позже без проблем?

Об ошибках страницы см. Это объяснение, диспетчер задач создает их: http://blogs.msdn.com/oldnewthing/archive/2008/08/21/8880075.aspx

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

Ответ №5:

Да, я заметил то же самое. Это также происходит с Windows XP.

В принципе, кажется, что Windows придерживается политики «быстрого распределения» в отношении обмена: сохраняйте много свободной памяти, чтобы она была доступна при необходимости. Это, на компьютере, где память является ограничением, является стратегией с некоторым смыслом. Загрузка больших программ в любом случае приведет к некоторой замене, поэтому система делает это заранее.
Конечно, в системах с большим объемом памяти это не имеет никакого смысла. На одном из моих компьютеров у меня есть XP с 3 ГБ оперативной памяти. Компьютер работает намного быстрее, если я просто выключу файл подкачки!
Также эта стратегия влияет на время загрузки оболочки: под загрузкой оболочки я подразумеваю все, что происходит между тем, когда вы входите в систему, и тем, когда вы действительно можете использовать компьютер. Замена происходит одновременно с загрузкой большого количества программ с значками в трее, что приводит к очень неэффективному использованию диска.

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

Ответ №6:

«Свободная память» — это проблематичный термин. В любой данный момент было бы лучше, если бы все байты находились как на диске, так и в оперативной памяти. Таким образом, если какая-либо программа внезапно получит 2 ГБ, ОС сможет удовлетворить этот запрос без дискового ввода-вывода. Просто обнулите оперативную память. Это справедливо независимо от того, являются ли байты логически «файловыми байтами» (т. е. ОЗУ является кэшем) или «байтами процесса» (т. е. байты диска выгружаются).

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