Разделяемая память в библиотеках DLL

#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, данные не разделяются между процессами. У каждого процесса есть свое личное пространство, и данные воссоздаются заново.