我想在C中的两个不同的程序中使用相同的库函数(即OpenSSL库)进行计算。 我怎样才能确保这两个程序使用共同的库,意味着只有一个库的副本被加载到共享主内存中,并且这两个程序从该内存位置访问该库用于计算?
例如,当第一个程序访问该库进行计算时,它将从主内存加载到caching中,当第二个程序想要访问它时,它将访问caching中的数据(已经由第一个程序加载), 而不是从主内存中再次访问。
我在Linux下使用GCC。 任何解释或指针将不胜感激。
代码被操作系统共享,不仅是共享库,而且也是相同二进制文件的可执行文件 – 你不必做任何事情就可以拥有这个功能。 它是系统内存管理的一部分。
数据不会在两个进程之间共享。 您需要一个进程中的线程来共享数据。 但除非你想要,否则只要确保两个程序使用完全相同的共享库文件(.so文件)。 通常情况下你不需要考虑这个问题。 如果两个程序使用不同版本的库(它们不会被共享当然),这可能是很重要的。
查看ldd /path/to/binary
的输出,查看ldd /path/to/binary
使用哪些共享库。
阅读Drepper的论文如何编写共享库和程序库HowTo
做一个,编译你的代码作为位置独立的代码 ,例如
gcc -c -fPIC -O -Wall src1.c -o src1.pic.o gcc -c -fPIC -O -Wall src2.c -o src2.pic.o
然后将其链接到共享对象
gcc -shared src1.pic.o src2.pic.o -lsome -o libfoo.so
你可以将一个共享库-lsome
到另一个libfoo.so
在内部,动态链接ld-linux.so(8)使用mmap(2) (并且会在动态链接时做一些重定位 ),重要的是inode 。 内核将使用文件系统缓存来避免两次读取不同进程使用的共享库。 另见linuxatemyram.com
使用例如ldd(1) , pmap(1)和proc(5) 。 另见dlopen(3) 。 尝试
cat /proc/self/maps
了解运行该cat
命令的进程使用的虚拟内存的地址空间 ; 不是一个ELF共享库的所有内容在进程之间共享,只有一些片段,包括文本段 …