【问题标题】:Only one copy of the dynamic library is needed in memory at a time?内存中一次只需要一份动态库吗?
【发布时间】:2013-10-15 09:26:22
【问题描述】:

我阅读了the article 关于动态库的信息。而且我看不懂下面的句子。

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

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

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

程序如何共享它们?

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

【问题讨论】:

    标签: c linux dynamic


    【解决方案1】:

    对不起,这不是你所有问题的答案,它只是回答了分享部分:

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

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

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

    【讨论】:

    • 感谢 cmaster。我仍然很困惑。虚拟内存管理器如何知道共享库已被加载?按名字还是?
    • 仅通过文件信息(afaik 通过 inode,而不是通过其名称或路径)和支持内存页面的磁盘上的数据偏移量。支持不同内存页面的 inode 和偏移量对以可搜索的形式保存在内核(页面缓存)中。因此,当进程想要将文件的某个区域映射到其地址空间时,可以在页面缓存中搜索包含所请求数据的内存页面。如果这样的页面已经存在,则该页面只是简单地映射到进程的地址空间,不需要从磁盘加载。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 2014-05-09
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2018-09-28
    • 2014-04-22
    相关资源
    最近更新 更多