Печально известный Windows Task Manager

Материал из wiki.drweb.com
Перейти к: навигация, поиск

(Авторство данного текста принадлежит Сержу Попову)

Task Manager... Эта программа, черт бы её побрал, постоянно служит источником самых странных заблуждений и мистификаций. Этот тот самый случай, когда дикарю дали молоток. Что же мы там видим? На закладке "Processes" можно показать несколько параметров процесса (колонок), 8 из которых имеют отношение к использованию памяти процессом. Что значат эти цифры?

Memory Usage

Это число показывает размер текущего Working Set процесса. Working Set - это совокупность всех страниц физической памяти, связанных с процессом. Сюда попадают страницы, занимаемые исполняемым файлом, библиотеками, динамически выделенная в хипе память, и так далее. Эта цифра включает как приватную память процесса, так и разделяемые страницы. Страница, связанная с процессом, может и не содержать никаких полезных данных. Например, при таком сценарии:

  • выделяем память
  • обнуляем память (и, возможно, еще как-то ее используем)
  • освобождаем память

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

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

Virtual Memory Size

Размер виртуального адресного пространства, выделенного процессу. Грубо говоря, это совокупность виртуальных страниц памяти, принадлежащих процессу. Сюда включаются как физические страницы памяти, так и виртуальная память, выделенная в страничном файле (pagefile), страницы из образов исполняемого файла и динамических библиотек (DLL). Иначе говоря, это сумма размеров кусочков виртуального адресного пространства, которое каким-либо образом связано (commited) страничным механизмом менеджером виртуальной памяти (VMM).

Этот параметр имеет несколько большее отношение к реальному использованию памяти процессом, но только в самых общих чертах, на уровне управления виртуальной памятью. Как правило, так памятью никто не пользуется. Программы (и библиотеки) обычно выделяют большой кусок виртуальной памяти заранее (heap), а затем из этого куска уже распределяют более мелкие кусочки (suballocation). Повторяется описанный выше сценарий - память освобождается, но это не отражается в цифрах Task Manager, либо отражается спустя значительное время.

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

Второй момент, ни одна из этих цифр (внимание!) обычно ничего не говорит о реальном использовании памяти программой.