Размер DLL в памяти и размер на жестком диске - PullRequest
6 голосов
/ 19 марта 2012

Есть ли связь между размером DLL в памяти и размером на жестком диске?

Это потому, что я использую расширение диспетчера задач (MS), и я могу перейти к EXE в списке и справанажмите -> Модуль, и я смогу увидеть все библиотеки DLL, которые использует этот EXE.У него есть столбец длины, но в байтах?И значение (длина) DLL, похоже, отличается от размера (DLL) на жестком диске.Почему?

Ответы [ 5 ]

5 голосов
/ 19 марта 2012

Есть связь, но она не совсем прямая или прямая.

Когда ваша DLL впервые используется, она отображается в памяти.Это не загружает его в память, а просто выделяет некоторое адресное пространство в вашем процессе, где оно может / может быть загружено при необходимости.Затем отдельные страницы библиотеки DLL загружаются в память с помощью подкачки по требованию, т. Е. Когда вы ссылаетесь на часть выделенного адресного пространства, код (или данные), сопоставленные с этим / этим адресом (ами), будут загружены.если его еще нет в памяти.

Теперь сопоставление адресов занимает немного места (одна страница размером 4 КБ на каждый мегабайт адресного пространства, которое сопоставляется).Конечно, когда вы загружаете некоторые данные в память, это тоже занимает много памяти.

Обратите внимание, однако, что большинство страниц могут / будут совместно использоваться процессами, так что если ваша DLL использовалась 5 различными процессами водин раз, он будет отображен 5 раз (т. е. один раз для каждого процесса, который его использовал), но в памяти останется только одна физическая копия (по крайней мере, обычно).

Между ними может быть немногоТрудно даже точно определить, что вы подразумеваете под потреблением памяти конкретной DLL.

2 голосов
/ 19 марта 2012

Есть две части, которые вступают в игру при определении размера dll в памяти:

  1. Как все остальные указали, dll получает отображаемую память, это приводит к тому, что их размер выравнивается по странице (По одной из причин предпочтительные адреса загрузки в тот день должны были быть выровнены по страницам).как правило, выравнивание страницы составляет 4 КБ для 32-битных систем, 8 КБ для 64-битных систем (более подробно об этом см. в Windows, см. this ).
  2. Dll содержат сегмент для неинициализированных данных,на диске этот сегмент сжимается, как правило, до base + size, когда dll загружается и инициализируется, пространство для сегмента .bss выделяется, увеличивая его размер.Как правило, это небольшое значение, которое будет исключено выравниванием страницы, но если DLL содержит огромные статические буферы, это может привести к уменьшению ее виртуального размера.
1 голос
/ 19 марта 2012

Не думайте о .dll или .exe как о чем-то, что копируется в память для выполнения.

Думайте об этом как о наборе инструкций для загрузчика.Конечно, он содержит программу и текст статических данных.Что еще более важно, он содержит всю информацию, позволяющую перемещать этот текст, подключать все его неудовлетворенные ссылки и экспортировать ссылки, которые могут понадобиться другим модулям.

Тогда, если есть информация о символе и номере строки дляотладка, это все еще больше текста.

Таким образом, в общем случае вы ожидаете, что он будет больше, чем образ памяти.

0 голосов
/ 19 марта 2012

Объем памяти, как правило, будет больше, чем на диске, потому что когда он отображается в памяти, он выравнивается по странице. Стандартные размеры страниц составляют 4 КБ и 8 КБ, поэтому, если ваша dll составляет 1 КБ кода, она все равно будет использовать 4 КБ в памяти.

0 голосов
/ 19 марта 2012

Все зависит от того, что вы называете «памятью», и что именно показывает ваше расширение TaskManager.

Каждый исполняемый модуль (Exe / Dll) отображается в адресное пространство.Размер этого отображения равен его размеру.И, я думаю, это то, что вам показывает ваше «расширение».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...