
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.82] |
![]() |
|
Сообщ.
#1
,
|
|
|
Здравствуйте.
Разбираюсь с устройством библиотек. Прошу ответить на такие вопросы: 1) При загрузке elf используемые shared library загружаются в адресное пространство конкретного приложения или в отдельную единую область для совместного использования, в которой живут все загруженные библиотеки? 2) Если мы запустили 10 приложений, которые используют функцию одной и той же shared library, то в памяти будут размечены 10 копий этой библиотеки? 3) Если приложение рождает 10 потоков и в каждом потоке вызывается функция из shared library, то в памяти будет 10 копий используемой shared library т.е. на каждый поток? 4) Загружается именно вся библиотека или могут загружаться только используемые функции? 5) Когда приложение закрывается, что происходит в памяти с shared library? 6) Если анализировать область памяти загруженного приложения, то видно, что библиотека встречается несколько раз в разных диапазонах памяти. Правильно я понимаю, что это размечены разные сегменты этой библиотеки т.е. при загрузке всей библиотеки в памяти отобразились ее необходимые секции как при загрузке обычного исполняемого файла? Спасибо. |
Сообщ.
#2
,
|
|
|
1. При загрузке ELF-файла используемые shared library загружаются в отдельную область памяти, называемую shared library space, которая представляет собой общую область памяти для всех загруженных библиотек. Каждое приложение имеет свою отдельную область памяти, но все приложения используют одну и ту же область памяти для загруженных библиотек.
2. В памяти будут размечены только одна копия библиотеки, даже если запущено 10 приложений, которые используют эту библиотеку. 3. В памяти также будет размечена только одна копия библиотеки, даже если в каждом потоке вызывается функция из этой библиотеки. 4. При загрузке всей библиотеки в память загружаются все функции и данные, которые она содержит. Однако не все функции могут быть вызваны из приложения, поэтому используемые функции загружаются только по мере необходимости. 5. Когда приложение закрывается, shared library space также освобождается. Если библиотека была загружена другими приложениями, которые продолжают работать, то библиотека остается в памяти. 6. Да, правильно понимаете. При загрузке всей библиотеки в памяти отображаются ее необходимые секции, которые могут быть размечены в разных диапазонах адресов в памяти. Это может быть связано с особенностями размещения секций в файле библиотеки или с особенностями загрузки библиотеки в память. Например, секции кода могут быть загружены в разные области памяти, чтобы обеспечить эффективное кэширование кода на процессоре. |
Сообщ.
#3
,
|
|
|
Думаю за 2 года он уже сам в этом разобрался.
|
Сообщ.
#4
,
|
|
|
Тема не закрыта же
![]() |