我阅读了有关动态库的文章。我无法理解下面的句子。
对于需要多个库的程序,共享库可以减少程序的内存占用(运行时在磁盘和内存中)。这是因为多个程序可以同时使用一个共享库;因此,一次在内存中只需要一个库副本。
ld-linux.so
执行重定位过程(加载动态库等)是他们的职责。
如何ld-linux.so
知道所需的库已加载?
这些程序如何共享它们?
如果库已更新怎么办?新启动的程序是加载新程序还是使用驻留在内存中的程序?
抱歉,这不是您所有问题的答案,它只是回答了分享部分:
诀窍是虚拟内存管理。当一个程序或共享库被加载到内存中时,它的代码被简单地映射到进程的虚拟内存空间中。由于它被映射为写保护的内存区域,因此可以将相同的内存页面映射到任意数量的虚拟内存地址空间。虚拟内存管理器唯一需要知道的是文件的哪一部分在“支持”页面。
当多个进程引用同一部分时,虚拟内存系统将始终只加载该部分一次,因为它会记住当前驻留在内存中的内存页面。
即使在使用共享库的一个程序在另一个使用相同共享库的进程启动之前终止的情况下,虚拟内存管理器在大多数情况下也能够避免重新加载共享库。这是因为包含共享库的内存页面将被标记为未使用,但只要内存不需要用于其他用途,所谓的页面缓存就会记住内存页面的内容是什么。当重新加载共享库时,VM 只需查找仍包含所需代码的内存页面。