Я пытаюсь выяснить, как операционная система обрабатывает несколько несвязанных процессов, загружающих одну и ту же DLL/общую библиотеку. Меня интересуют операционные системы Linux и Windows, но в меньшей степени и Mac. Я предполагаю, что ответы на мои вопросы будут одинаковыми для всех операционных систем.
Меня особенно интересуют явные ссылки, но я также хотел бы знать о неявных ссылках. Я предполагаю, что ответы для обоих также будут идентичными.
Это лучшее объяснение, которое я нашел для Windows:
Система поддерживает счетчик ссылок для каждого процесса для всех загруженных модулей. Вызов LoadLibrary увеличивает счетчик ссылок. Вызов функции FreeLibrary или FreeLibraryAndExitThread уменьшает счетчик ссылок. Система выгружает модуль, когда его счетчик ссылок достигает нуля или когда процесс завершается (независимо от счетчика ссылок). - http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175%28v=vs.85%29.aspx
Но оставляет некоторые вопросы.
1.) Загружают ли несвязанные процессы одну и ту же DLL избыточно (то есть DLL существует в памяти более одного раза) вместо использования подсчета ссылок? (IE, в собственное адресное пространство каждого процесса, насколько я понимаю)
если DLL выгружается, как только процесс завершается, это заставляет меня полагать, что другие процессы, использующие точно такую же DLL, будут избыточно загружены в память, в противном случае система не должна игнорировать счетчик ссылок.
2.) если это так, то какой смысл считать библиотеки DLL, когда вы загружаете их несколько раз в одном и том же процессе? Какой смысл дважды загружать одну и ту же DLL в один и тот же процесс? Единственная возможная причина, которую я могу придумать, заключается в том, что если EXE-файл ссылается на две библиотеки DLL, а одна из них ссылается на другую, то будет по крайней мере два вызова LoadLibrar() и два вызова FreeLibrary() для одной и той же библиотеки.
Я знаю, кажется, что я отвечаю здесь на свои вопросы, но я просто постулирую. Я хотел бы знать наверняка.