2013-11-17 3 views
0

Я внедряю двоичные данные (документ pdf) в общую библиотеку, используя переменную unsigned char []. То есть у меня есть файл C, содержащий что-то вроде этого:Как char [] загружается в память в DLL

unsigned char large_data [] = {0x24, 0x23 ...}; int sizeofLargeData = sizeof (large_data);

Большие данные могут быть много мегабайт. Мой вопрос в том, загружается ли в библиотеку совместно используемая библиотека, загружаются ли эти данные в память?

ответ

2

Когда разделяемая библиотека загружаются приложением (либо через неявную зависимость или явный вызов LoadLibrary() на Windows, или dlopen(3) на системах POSIX), загрузчик отображает полноту содержимого библиотеки DLL (свой исполняемый код и его глобальные переменные сегменты) в память в виртуальном адресном пространстве процесса, но он не сразу загружает все данные, читая их с диска.

Современные ОС, такие как Windows, Linux и Mac OS X, используют demand paging для загрузки модулей. Это означает, что данные фактически не считываются с диска до тех пор, пока они не будут доступны. Когда вы получаете доступ к данным на странице, которая еще не загружена (например, при первом вызове экспортированной функции или при первом обращении к форме глобальной переменной модуль) генерируется исключение ошибки страницы. ОС обрабатывает ошибку страницы, загружает соответствующий код или данные с диска, а затем возобновляет программу из места сбоя; поскольку данные теперь загружены, программа перестает работать с ошибками страницы при возобновлении.

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

+0

Спасибо, отлично. Однако ваш ответ относится только к окнам. Возможно, он работает аналогично с Linux и другими системами. –

+0

@TotteKarlsson: По какой-то причине я думал, что исходный вопрос был конкретно о Windows, но, видимо, это не так. В любом случае, ответ один и тот же для любой ОС, поддерживающей пейджинг запросов, которые делают современные ОС. –

Смежные вопросы