Страницы

Поиск по вопросам

понедельник, 10 июня 2019 г.

Куда загружается DLL при её использовании процессом?

Среди преимуществ использования динамических библиотек перед статическими значится пункт экономии ресурсов системы, т.е. библиотека загружается в памяти единожды и используется сразу несколькими процессами (в смысле если библиотека уже загружена другим процессом, повторная загрузка выполняться не будет). Отсюда вопрос: куда же на самом деле загружается динамическая библиотека, если Windows позволяет использовать загруженный код нескольким процессам? В адресное пространство процесса? Но ведь тогда, когда процесс загрузивший DLL прекратить работу и выгрузится из памяти операционной системой, другой процесс потерпит фиаско!


Ответ

Куда же на самом деле загружается динамическая библиотека, если Windows позволяет использовать загруженный код нескольким процессам?
В файловое отображение — регион памяти, чьё содержимое синхронизируется с указанным файлом. Вкратце его работу можно описать следующим образом:

(Иллюстрация взята из статьи «File Mapping» в MSDN)
Открываете файл, который необходимо отобразить, с помощью CreateFile(). Это позволяет получить дескриптор HANDLE с нужными правами доступа. Создаёте отображение вызовом функции CreateFileMapping(). При этом происходит выделение блока подкачиваемой памяти для буфера.
«Подкачиваемая» (swappable) память означает, что буфер может быть полностью или частично сброшен из физической памяти в файл подкачки. А может и не быть — ничто не мешает ОС попросту скопировать все изменения в отображаемый файл. А ещё этот буфер может быть вообще выброшен из памяти, если в него не вносилось никаких изменений. Для того, чтобы получить к этому отображению доступ, требуется открыть вид (view) функцией MapViewOfFile(), и попросить ОС отобразить его на определённую часть файла. ОС, в свою очередь, обеспечит наличие данного куска в буфере и «прорубит» окно в адресном пространстве запросившего процесса. При этом разные процессы могут создавать виды, ассоциированные с общим, разделяемым буфером-отображением.
В вашем случае на каждую секцию исполняемого файла создаётся своё отображение с правами доступа, указанными в заголовке соответствующей секции.
В адресное пространство процесса?
Как мы выяснили выше, не в индивидуальное адресное пространство, а в разделяемую память, на которую отображается указанный диапазон адресного пространства процесса
Это возможно благодаря принципам организации работы виртуальной памяти:

(Иллюстрация взята из ответа на вопрос «Какую модель памяти сегментную или страничную использует windows, linux, macos?»)
Но ведь тогда, когда процесс загрузивший DLL прекратить работу и выгрузится из памяти операционной системой, другой процесс потерпит фиаско!
Отображение уничтожается, буфер высвобождается и файл закрывается только после завершения работы всех процессов, работающих с ним.

Комментариев нет:

Отправить комментарий