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