Файлы DLL загружаются один раз для каждой программы или один раз для всех программ?
У меня есть простой вопрос, который тот, кто знает, сможет легко ответить, я искал google, но не смог найти ответ.
На компьютере запущено сразу несколько программ, и мой вопрос: когда программа загружает DLL, загружает ли он файл DLL или находит ли он память, в которой DLL уже загружена? Например, загружается ли ws2_32.dll(winsock 2) для каждой программы, использующей winsock, или загружается один раз, и все используемые ею программы используют одни и те же адреса памяти для вызова функций?
Ответы
Ответ 1
Он загружается один раз, и все программы используют одну и ту же копию кода в памяти. Это довольно сложно, но для разделов только для чтения DLL (то есть кода) загрузчик операционной системы использует метод "сопоставление памяти" для сопоставления DLL в адресном пространстве процесса. Страницы загружаются только в физическую память один раз для всех процессов, даже если они могут отображать страницу по разному адресу в своем виртуальном адресном пространстве.
Однако каждый процесс имеет отдельный раздел данных (так что глобальные переменные не разделяются - если вы явно не задаете их), и они, очевидно, также имеют отдельную кучу, чтобы динамически распределенная память не была разделена.
Ответ 2
Это зависит от того, что вы подразумеваете под "загруженным".
DLL подготовлена для совместного использования кода и данных: большинство сред Windows оценивают совместность (путем сопоставления той же копии памяти кода в каждом пространстве памяти процесса) для сохранения памяти.
Однако, часть операции "load" (с точки зрения процесса) запускает инициализацию DLL: это делается отдельно в каждом процессе с различными копиями областей данных, которые являются частными для каждого процесса.