Когда разделяемая библиотека загружаются приложением (либо через неявную зависимость или явный вызов LoadLibrary()
на Windows, или dlopen(3)
на системах POSIX), загрузчик отображает полноту содержимого библиотеки DLL (свой исполняемый код и его глобальные переменные сегменты) в память в виртуальном адресном пространстве процесса, но он не сразу загружает все данные, читая их с диска.
Современные ОС, такие как Windows, Linux и Mac OS X, используют demand paging для загрузки модулей. Это означает, что данные фактически не считываются с диска до тех пор, пока они не будут доступны. Когда вы получаете доступ к данным на странице, которая еще не загружена (например, при первом вызове экспортированной функции или при первом обращении к форме глобальной переменной модуль) генерируется исключение ошибки страницы. ОС обрабатывает ошибку страницы, загружает соответствующий код или данные с диска, а затем возобновляет программу из места сбоя; поскольку данные теперь загружены, программа перестает работать с ошибками страницы при возобновлении.
Следовательно, если у вас есть мегабайты данных в общем объекте, и программа никогда не обращается к нему, вы никогда не платите затраты ввода-вывода при загрузке этих мегабайт с диска. Он по-прежнему технически отображается в память - вы можете получить к нему доступ в любое время без каких-либо системных вызовов, но данные на самом деле не были прочитаны с диска.
Спасибо, отлично. Однако ваш ответ относится только к окнам. Возможно, он работает аналогично с Linux и другими системами. –
@TotteKarlsson: По какой-то причине я думал, что исходный вопрос был конкретно о Windows, но, видимо, это не так. В любом случае, ответ один и тот же для любой ОС, поддерживающей пейджинг запросов, которые делают современные ОС. –