Подтвердить что ты не робот

Файлы DLL загружаются один раз для каждой программы или один раз для всех программ?

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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