#c #c #windows #dll
#c #c #Windows #dll
Вопрос:
Как работает совместное использование памяти в библиотеках DLL?
Когда DLL подключается к процессу, он использует те же адреса памяти, что и процесс. Давайте предположим, что у нас есть следующая функция в DLL:
int * data = 0;
int foo()
{
if (!data) data = new int(random());
return *data;
}
Когда процесс A вызывает эту функцию, он создает новый объект (int) и возвращает его значение.
Но теперь процесс B присоединяет эту библиотеку DLL. Он вызывает foo(), но я не понимаю, как это будет работать, потому data
что обрабатывается пространство памяти. Как B сможет напрямую ее использовать?
Комментарии:
1. Совместное использование памяти между процессами требует поддержки API ОС и доступно в Windows.
Ответ №1:
Вы правы, библиотеки DLL по умолчанию НЕ разделяют память между процессами. В вашем примере оба процесса A и B получат отдельный экземпляр «data».
Если у вас есть проект, в котором вы хотите, чтобы глобальные переменные в библиотеке DLL были общими для всех процессов, использующих эту библиотеку DLL, вы можете использовать сегмент общих данных, как описано здесь . Вы можете совместно использовать предварительно объявленные массивы и типы значений через общие сегменты данных, но вы определенно не можете совместно использовать указатели.
Комментарии:
1. «Библиотеки DLL Win32 отображаются в адресное пространство вызывающего процесса. По умолчанию каждый процесс, использующий DLL, имеет свой собственный экземпляр всех глобальных и статических переменных DLL.» Это было то, что я искал. Спасибо!
Ответ №2:
Здесь вы ошибочно принимаете две разные концепции — библиотеки dll используют общую память в том смысле, что все, что (когда-либо) не изменится, является общим (физически). Это экономит вашу оперативную память, потому что в DLL много данных — это код и другие постоянные данные, поэтому система использует только одну его копию, независимо от того, сколько процессов ее использует. Это важно на системном уровне — с точки зрения приложения общий доступ вообще не виден.
Однако внутренние данные, подобные описанным здесь, не являются общими для процессов — каждый процесс получает свою собственную копию. Если вы заинтересованы в совместном использовании памяти между процессами, вам нужны другие механизмы. Возможно, вас заинтересует создание именованной разделяемой памяти.
Ответ №3:
Процесс B будет иметь свое собственное отдельное пространство памяти, которое не имеет ничего общего с процессом A. data
Переменная будет создана внутри пространства процессов B.
Комментарии:
1. Как это работает? Все статические данные воссоздаются каждый раз, когда DLL подключается к процессу? Так как же тогда она «разделяется»?
2. @user986654, данные не разделяются между процессами. У каждого процесса есть свое личное пространство, и данные воссоздаются заново.