内存中一次只需要一个动态库副本吗?

时间:2013-10-08 12:41:35

标签: c linux dynamic

我阅读了有关动态库的the article。我无法理解下面的句子。

  

对于需要多个库的程序,共享库可以   减少程序的内存占用(磁盘和内存)   在运行时)。这是因为多个程序可以使用共享   图书馆同时;因此,只有一个图书馆的副本   一次需要记忆。

ld-linux.so有责任进行重定位过程(加载动态库等)。

ld-linux.so如何知道所需的库已被加载?

程序如何共享它们?

如果图书馆已更新怎么办?新启动的程序是加载新程序还是使用驻留在内存中的程序?

1 个答案:

答案 0 :(得分:0)

很抱歉,这不是您所有问题的答案,只是回答了分享部分:

技巧是虚拟内存管理。当程序或共享库加载到内存中时,其代码只是映射到进程的虚拟内存空间。由于它被映射为写保护的存储器区域,因此可以将相同的存储器页面映射到任意数量的虚拟存储器地址空间。虚拟内存管理器唯一需要知道的是文件的哪一部分是“支持”页面。

当多个进程引用同一部分时,虚拟内存系统将始终仅加载此部分一次,因为它会记住当前驻留在内存中的内存页。

即使在使用共享库的一个程序在启动使用相同共享库的另一个进程之前终止的情况下,虚拟内存管理器也能够避免在大多数情况下重新加载共享库。这是因为包含共享库的内存页面将被标记为未使用,但只要内存不需要用于其他目的,所谓的页面缓存就会记住内存页面的内容。当重新加载共享库时,VM只查找仍包含所需代码的内存页面。