动态链接、内存使用和并发性
Dynamic linking, memory usage and concurrency
当可执行文件与静态库链接时,可执行文件只包含代码中使用的必要库部分,对吗?
但是我错过了部分-共享对象(动态链接库)是如何使用的?
据我所知,它们不包括在可执行文件中,它们是使用dlopen
动态加载的,这是由链接器直接完成的,对吗?
在这种情况下,这个库位于内存中的哪个位置?我的意思是,这里有一些帖子,解释了动态库可以减少内存使用,但究竟如何呢?如果动态库以某种方式加载到共享内存中(针对多个进程),那么内核如何处理这种情况下的并发性?
我意识到这可能是一些基本的东西,抱歉,如果这是重复的,我找不到这样的
我知道静态链接和动态链接,我的问题有点不同。
共享库确实被加载到所有"用户"(使用相同库的所有应用程序)之间共享的内存中。
这基本上是通过引用计数来完成的,因此对于库的每个新用户,引用都会被计数。当应用程序退出时,引用计数将被计数。如果它变为零,则不再需要该库,并将从内存中删除(很可能只有在"其他事情需要内存"时才会删除,而不是"立即")。引用计数是由内核"自动"完成的,因此不存在并发性冲突。
注意,只有共享库中的代码才是真正共享的。任何数据段在每个进程中都是私有的。
动态库只对所有使用它们的进程加载一次。然后,操作系统将动态库的内存映射到进程地址空间中。这样,它只消耗一次所需的内存。使用静态链接,所有可执行文件都包含静态链接的代码。加载可执行文件时,也会加载静态链接的代码。这意味着,一个包含在10个可执行文件中的函数在内存中驻留10次。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- CMake-按正确顺序将项目与C运行时对象文件链接
- 从链接列表c++中删除一个项目
- 有根的二进制搜索树.保留与其父级的链接
- 读取文件的最后一行并输入到链接列表时出错
- 静态数据成员的问题-修复链接错误会导致编译器错误
- node-gyp 在 macOS 上未正确链接库
- 基于boost的程序的静态链接——zlib问题
- 无法链接 CMake 中的本地库
- 内联函数中具有内部链接的全局变量
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 使用gcc从静态链接的文件中查找可选符号
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 下面是我为检测链接列表中的循环而制作的代码
- 有了gcc,是否可以链接库,但前提是它存在
- 使用C链接在函数内部创建C++模板
- Visual Studio mkl_link_tool.exe链接错误
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- 动态链接、内存使用和并发性