一个DLL内存分配的问题(200分)

  • 主题发起人 主题发起人 charlyisme
  • 开始时间 开始时间
C

charlyisme

Unregistered / Unconfirmed
GUEST, unregistred user!
请问从A.exe 中调用B.dll中的函数分配内存,使用完后又调用B.DLL的函数释放内存,那么如果A.EXE中反复调用B.dll中的函数分配内存而不释放内存,那么内存增加是反映到进程A中,还是其他某个核心进程中?(从NT/2K的任务管理器中查看某个进程的内存增加)

请哪位大侠讲讲上面的问题以及相关的理论,谢谢!
 
B.dll

function myMalloc(Size: Integer): PChar;
var
P: PChar;
begin
Getmem(P, Size);
Result := P;
end;

function MyFreeMem(P: PChar; Size: Integer);
begin
FreeMem(P, Size);
end;
 
b.dll是映射在a进程的,当然是a的内存增加
 
请问是否只是dll的代码段映射到A.exe这个进程,那么数据段是否A.exe只拥有一份拷贝,那么多进程调用时释放机制又是怎样的呢?
 
dll所用到的数据也是映射到调用者进程内
谁调用的,就在谁的内存内
 
to Pipi.
dll的代码段要映射到调用者进程内,那么DLL的代码段呢?是否也要映射,还是各调用者共享一个拷贝?
 
dll得代码段是影射的,每个调用它的进程都访问同一份dll代码。
但是它的所有需分配内存的变量,都是每个进程都有一份拷贝,免的进程间访问冲突。
 
数据段是按进程各自管各自的,代码段开始的时候是映射到各个进程的,由于各个进程装入的
某些共同的dll不一定是在相同的偏移,所以各个进程代码段有些入口是要修改的,这时候用了copy on write
技术,在写入的时候,该页(4k)被分配一个新的物理内存页
 
宿主只拥有DLL的入口向量表
 
学习。。。。。~~~~~~~~~~~~~~~~~~~~~~~~~~


椅子,,没有,就站着听认真的听
 
应该是加入系统进程。DLL作为系统驱动,调用也该按照系统规则。

A进程实际调用的只是DLL映射在内存上的地址。DLL会按照系统规则启动,运作,消失。
 
如果你不是在共享段的变量是每一个进程一份实例的。
 
to Pipi.
可以再讲讲copy on write吗?
本来有本<<高级windows编程>>可以看看的,不过已经借给别人了,麻烦一下。
 
copy on write是什么?就像C++中的引用计数,需要改动时再拷贝出来写。
 
也不一定吧,要是我在分堆里分配内存呢?
 
"也不一定吧,要是我在分堆里分配内存呢?"
什么意思?
 
写错了,是堆,不是分堆。[:D]
 
copy on write:
A、B进程共享内存页面C。如果A、B都只是读C,没什么问题。
但如果A要往C里面写,那就不成了,因为会影响B。
所以在A进程write之前,先把C页面copy一份给A。这时A、B就已经不是共享同一个页面了。

看《Windows核心编程》吧。到处都有。
 
多人接受答案了。
 
后退
顶部