Linux加载共享对象的性能

Linux加载共享对象的性能,linux,dlopen,Linux,Dlopen,关于如何加载共享对象(.so)文件,我有一个设计决策要做 我最终会对我的选择进行基准测试,但我希望得到同事们的反馈 通常情况下,stackoverflow希望每个“问题”有一个问题,但这些问题是如此紧密相关,我把它们放在一个“问题”中 现在我有很多(1000-4000).so文件,每个.so文件都有一个符号,用dlsym()解析。我有许多进程共享这些.so文件。这些进程中的每一个都来自一个公共父进程 以下是有关加载性能的一些问题。因此,使用dlopen/dlsym/dlclose加载文件: 将1

关于如何加载共享对象(.so)文件,我有一个设计决策要做

我最终会对我的选择进行基准测试,但我希望得到同事们的反馈

通常情况下,stackoverflow希望每个“问题”有一个问题,但这些问题是如此紧密相关,我把它们放在一个“问题”中

现在我有很多(1000-4000).so文件,每个.so文件都有一个符号,用dlsym()解析。我有许多进程共享这些.so文件。这些进程中的每一个都来自一个公共父进程

以下是有关加载性能的一些问题。因此,使用dlopen/dlsym/dlclose加载文件:

  • 将1000个.so文件合并为一个.so文件有多大优势?(例如,将有1个dlopen()和多个dlsym())(考虑到只需要20个左右,所以任何一个进程都需要文件)
  • 如果将.so文件加载到一个进程中,它是否会更快地加载到另一个进程中?(例如,它是否使用写时复制,从而使单独执行dlopen的两个进程实际上为.so共享物理内存?)

  • 在fork之前在父进程中加载.so文件有多大优势?(例如:fork只需要复制.so的页表,而不是加载它)

  • 当试图衡量我的选择时,我应该考虑哪些其他因素?


    您曾经做过那个基准测试吗?您不想使用fork()进行任何其他操作,只想在之后立即执行execvp()。大多数Linux迷可能会告诉你不同的情况。在使用多个线程时,尤其没有记录将fork()用于执行execvp()以外的操作。加载到父进程中的共享库在子进程中的execvp()之后不存在。