gpt4 book ai didi

c++ - dlopen 是否创建多个库实例?

转载 作者:行者123 更新时间:2023-11-28 01:52:31 29 4
gpt4 key购买 nike

我在网上搜索后似乎找不到答案。

当我第一次使用 dlopen 时,它似乎比之后的任何时候都花费更长的时间,包括如果我从一个程序的多个实例运行它。

dlopen 是否将 so 加载到内存中一次并让操作系统保存它,以便任何后续调用甚至来自程序的另一个实例都指向内存中的同一位置?

那么基本上运行库的程序的 3 个实例是否意味着相同的 .so 的 3 个实例被加载到内存中,或者内存中只有一个实例?

谢谢

最佳答案

Does dlopen load up the so into memory once and have the OS save it so that any following calls even from another instance of the program point to the same spot in memory?

从单个进程中多次调用 dlopen 保证不会多次加载库。来自man page :

   If the same shared object is loaded again with dlopen(), the same
object handle is returned. The dynamic linker maintains reference
counts for object handles, so a dynamically loaded shared object is
not deallocated until dlclose() has been called on it as many times
as dlopen() has succeeded on it.

当第一次调用 dlopen 时,库被 mmap 编辑到调用进程中。通常至少有两个单独的 mmap 调用:.text.rodata 部分(通常驻留在单个 RO 段中)被映射只读,.data.bss 部分被映射为读写。

来自另一个进程的后续 dlopen 执行相同的 mmap。然而,操作系统不必从磁盘加载任何只读数据——它只是增加已为第一个 dlopen 调用加载的页面的引用计数。即“共享库”中的共享。

So basically does 3 instances of a program running a library mean 3 instances of the same .so are loaded into memory, or is there only one instance in memory?

取决于您所说的“实例”。

每个进程都有自己的一组(动态分配的)运行时加载器结构来描述这个库,每组都包含一个共享库的“实例”(可以在不同进程的不同地址加载)。每个进程还将有自己的可写数据实例(使用写时复制语义)。但是只读映射都将占用相同的物理内存(尽管它们可以出现在每个进程中的不同地址)。

关于c++ - dlopen 是否创建多个库实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42426986/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com