Файлы .dll загружаются один раз для каждой программы или один раз для всех программ? - PullRequest
19 голосов
/ 17 мая 2010

У меня есть простой маленький вопрос, на который тот, кто знает, сможет ответить легко, я искал в Google, но не смог найти ответ.

На компьютере одновременно запущено много программ, и мой вопрос: когда программа загружает DLL, она действительно загружает файл DLL или находит память, в которую DLL уже загружена? Например, загружен ли ws2_32.dll (winsock 2) для каждой программы, использующей winsock, или он загружен один раз, и все программы, использующие его, используют одни и те же адреса памяти для вызова функций?

Ответы [ 2 ]

21 голосов
/ 17 мая 2010

Он загружается один раз, и все программы совместно используют одну и ту же копию кода в памяти. Это довольно сложно, но для доступных только для чтения разделов DLL (то есть кода) загрузчик операционной системы использует технику, называемую «отображение памяти», чтобы отобразить DLL в адресное пространство процесса. Страницы загружаются в физическую память только один раз для всех процессов, даже если в их виртуальном адресном пространстве страница может отображаться на другой адрес.

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

7 голосов
/ 17 мая 2010

Это зависит от того, что вы подразумеваете под "загружен".

DLL подготовлена ​​для совместного использования кода и данных: большинство сред Windows соблюдают разделяемость (путем сопоставления одной и той же копии кода в памяти в пространстве памяти каждого процесса) для сохранения памяти.

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

...