Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.21;
Скачать: CL | DM;

Вниз

DLL   Найти похожие ветки 

 
Top Gun   (2003-04-04 22:03) [0]

Вот читаю, читаю про DLL... вроде все понятно, кроме ее загрузки. Никак не въеду.

Цитирую:

"Библиотека DLL сначала загружается в глобальную распределяемую память (heap) системы Win32, а затем отображается на адресное пространство вызывающего процесса...[skip]... Поэтому, когда одна и та же библиотека DLL загружается сразу несколькими процесссами, каждый их них получает собственный образ (image) данной библиотеки. Следовательно, процессы не используют одновременно один и тот же физический код, данные или ресурсы, как это было в 16-разрядной Windows."

Но в тоже время пишется:

"Вышесказанное вовсе не означает, что, когда несколько процессов загружает одну и ту же библиотеку DLL, физическая память расходуется на хранение всех необходимых ее копий"

Что-то никак не пойму. Значит, физически в памяти библиотека одна. Но в тоже время все процессы работают со своей копией. В голове как-то не укладывается.
Возможно, отгадка заключается в том, что она каким-то хитрым образом "отображается на адресное пространство вызывающего процесса" - не понимаю этого. Что тогда значит отображается? Расскажите пожалуйста.


 
___ALex___ ©   (2003-04-05 00:45) [1]

все процессы работают с одним кодом DLL но с разными данными


 
___ALex___ ©   (2003-04-05 03:02) [2]

советую почитать про механизм виртуальной памяти


 
Top Gun   (2003-04-05 14:19) [3]

То есть, если в DLL используется некая переменная, то для каждого вызова DLL будет создан свой экземпляр ?

to ___ALex___
а где почитать про механизм виртуальной памяти ?


 
MBo ©   (2003-04-05 14:54) [4]

>некая переменная, то для каждого вызова DLL будет создан свой экземпляр
Да - локальные переменные процедур и функций размещаются в стеке, который принадлежит потоку (thread), память под который, в свою очередь, выделяется из ВАП (виртуального адресного пространства) процесса.


 
Top Gun   (2003-04-07 19:31) [5]

Так, почитал про ВАП. Немного понял, но выражение "отображается на адресное пространство вызывающего процесса" до конца не осмыслил.

То есть, код библиотеки загружается в виртуальную память процесса (4Gb). Но физически ничего не загружается, верно? Это как зарезервировать память фукцией VirtualAlloc - физически ничего не выделяется?
Но тем не менее, это отображение библиотеки, то есть, процесс обратившись к библиотеке загруженной в его ВАП на самом деле обратится к единственной копии библиотеки находящейся в heap памяти? Я верно понимаю? Только переменные используемые в библиотеке для каждого процесса будут свои и они хранятся в ВАП процесса ?


 
Иван Шихалев ©   (2003-04-07 22:17) [6]


> Но тем не менее, это отображение библиотеки, то есть, процесс
> обратившись к библиотеке загруженной в его ВАП на самом
> деле обратится к единственной копии библиотеки находящейся
> в heap памяти? Я верно понимаю? Только переменные используемые
> в библиотеке для каждого процесса будут свои и они хранятся
> в ВАП процесса ?


Истинно так.


 
Top Gun   (2003-04-08 18:43) [7]

1) И для переменных библиотеки, хранящихся в ВАП вызвавшего процесса будет уже выделена физическая память?

2) В отличии от кода библиотеки, который занимает ВАП процесса, но для которого не выделен физический участок памяти?

3) Если все правильно - то получается для каждого "экземпляра" библиотеки создаются свои переменные. Код один и тот же.
А остальное тоже общее или раздельное?

4) Это все есть в книге Рихтера по Win32 ?


 
sts   (2003-04-08 20:35) [8]

Да, есть, а сама книга на http://anatolix.naumen.ru/win32books.htm


 
Top Gun   (2003-04-08 20:58) [9]

А первые три вопроса ?


 
Cobalt ©   (2003-04-09 00:31) [10]

1) Соответственно, в стеке, или в сегменте данных
2) Ты неправильно понимаешь разделение кода - " физический" кусок памяти для кода выделяется только при первой загрузке ДЛЛ, при последующих загрузках, за счет виртуальности памяти, т.е. "логические" страницы памяти разных процессов ссылаются в таблице страниц на одну и ту же физическую страницу(за счет того, что код не может модифицироваться(точнее, это не так-то просто сделать, хоть и можно))
3) Да, но что ты подразумеваешь под "остальным"


 
Top Gun   (2003-04-09 18:48) [11]

Cobaltm, ресурсы, например.


 
Cobalt ©   (2003-04-09 19:15) [12]

Все, что не может измениться - общее.
Все, что может (и будет) изменяться - раздельное.



Страницы: 1 вся ветка

Текущий архив: 2003.04.21;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.024 c
1-67287
dm37
2003-04-10 08:30
2003.04.21
Динамически создаваемые объекты


4-67635
aga
2003-02-21 19:29
2003.04.21
Explore.exe


3-67130
aleks
2003-04-02 18:44
2003.04.21
Сортировка , фильтрация по вычисляемому полю


4-67638
Afonya
2003-02-24 13:38
2003.04.21
Проблема при принудительном завершении потока


9-67081
Ketmar
2002-11-08 18:31
2003.04.21
OpenGL: определение того, был ил отрисован хоть один пиксел...