现个不同程序(或者不同进程)调用同一个DLL时,占用的内存资源是两倍吗?(0分)

  • 主题发起人 主题发起人 Alongsun
  • 开始时间 开始时间
A

Alongsun

Unregistered / Unconfirmed
GUEST, unregistred user!
现个不同程序(或者不同进程)调用同一个DLL时,占用的内存资源是两倍吗?<br>
 
大家多发表!
 
多发表呀!
 
不是得,映射
 
不会的!
 
那是调用这DLL几次呀,是两 个程序要占不同的资源吗?
 
这就是使用DLL的好处:DLL调入内存后,要调用其中的过程/函数<br>只需获取该过程/函数的入口指针。所以每个使用者都是对过程/函数<br>入口地址的引用,而不需要拷贝一份程序代码。节省了内存资源。
 
不会的,这就是DLL和EXE很大的区别
 
Alongsun说的对,DLL是工作在独立的工作区。<br>如果不是这样的话,系统又是如何知道此DLL又被谁调用了呢?
 
楼上的开玩笑呢?如果不知道也不要误导别人。<br>代码的执行分代码段和数据段。不同进程调用DLL,在内存中所使用的代码段是一份,<br>数据段是各自进程独立的。
 
同意wx_zhang的意见!
 
我觉得占用DLL的资源应该是2倍吧(1-2倍);<br>因为我们做程序的时候消耗资源的其实是什么,如果仅仅是占用cpu时间也就算了,关键是gdi,<br>内存等等,就算是用Dll我相信还是占用更多的资源的!<br>另外。如果静态装载DLL我还真不明白它为什么不是占用2倍资源。毕竟每个不同的进程占用<br>不同的空间啊!<br>还请高手解释一下!
 
如果没有地址冲突,那么DLL中的代码段只占一份内存,<br>不过DLL中的数据则有多少个进程调用就占用多少内存。事实上DLL中声明的数据是<br>使用.EXE的地址空间的。<br>如果有地址冲突发生,比如加载DLL的时候发现该段内存已经被其他DLL占用,那么系统<br>就必须对此DLL进行重定位,这样代码段也不只一份了。总的来说,这是一种用空间换安全的策略,<br>进程的独立地址空间加强了系统的强壮性,代价就是占用内存增加了不少。
 
调用N次也只占一份内存
 
555~~~~~都这么多了,我想灌也来不及~~~~~走人……
 
to wx_zhang, 象您这么睿智,当然不容误导了。 呵呵。<br>真不知道两个EXE如何共享一个DLL的代码区呢?<br>DLL被载入时,系统又是如何为其分配内存空间的呢?<br><br>to Hao.Yu: 您说的挺有道理,我有几个小问题:<br>》如果有地址冲突发生,比如加载DLL的时候发现该段内存已经被其他DLL占用<br>首先,是谁来发现地址冲突?系统,<br>其次,什么内存被其他DLL占用,难道所有DLL都被安排在临近的内存中吗?<br>谢谢。
 
如果这样,还要dll干啥<br>是他的优势之一
 
我在两个相同程序中分别调用同一个DLL,结果是两个程序所占用的内在均为9231K,<br>&nbsp;如果我有个程序不调用DLL,只是一个调用DLL,那么那个程序占用的RAM就少了很多,只<br>有1598K,这个能不能说明问题呢?<br>&nbsp;请各位大侠给点指点!<br><br>我 的QQ:65466700<br>http://www.delphibbs.com/delphibbs/dispq.asp?lid=894197是我组织的活动来着<br>大家想交朋友来这里看看吧!
 
我觉得dll的好处恐怕不是为了节省资源吧!<br>再说,静态调用肯定会占用双倍资源。动态立即释放不好说了!<br>那会这样啊,如果Dll可以节省资源,那我们的程序跑起来应该不占资源才是, <br>因为我们不都是调用user.dll等系统的dll<br>请高手回答(讲出理由)!
 
to Hao.Yu:“如果有地址冲突发生,比如加载DLL的时候发现该段内存已经被其他DLL占用,那么系统<br>就必须对此DLL进行重定位,这样代码段也不只一份了。”没错,但对于每个不同的DLL,内存<br>中只有一份Copy。<br>当一个应用程序使用了一个DLL,Win32系统会确保内存中只有一个该DLL的拷贝,这是通过内存映射文<br>件来实现的。每个进程都被分配有自己的32位线性地址空间。当一个DLL被多个进程调用时,每个进程<br>都会获得该DLL的一份映像。DLL被调入进程的地址空间时设置了基地址,如果DLL的基地址与已经分配<br>的DLL地址重叠的话,Win32重新分配基地址。这样,每一个重新分配的DLL实例都有自己的物理上的内<br>存空间和交换文件空间。这是很关键的,通过使用$IMAGEBASE指示符,给每个DLL都设置一个基地址,<br>这样不会引起冲突或不会出现地址重叠。<br>如果有多个应用程序都调用同一个DLL,系统会设置一个唯一的基地址,这样无论是在进程的低端地址或<br>者是在高端地址,都不会引起冲突。但进程间也不能共享DLL的数据。<br>在调用时,DLL不需要重新分配或安装,因为它保存在本地磁盘上,DLL的内存页面被直接映射到磁盘上的<br>DLL文件。DLL代码不需占用系统页面文件(也叫交换文件)的空间。这就是为什么系统提交页的总数和大小<br>可能比系统交换文件加内存要大。<br>可以看“Image Base Address”的帮助。
 
后退
顶部