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

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

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

19
задан Nilbert 17 May 2010 в 02:14
поделиться

2 ответа

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

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

21
ответ дан 30 November 2019 в 04:15
поделиться

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

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

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

7
ответ дан 30 November 2019 в 04:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: