我想在C中的两个不同程序中使用相同的库函数(即OpenSSL库)进行计算。如何确保两个程序都使用公共库,意味着仅一个库的副本被加载到共享主内存,并且两个程序都从该内存位置访问该库计算
例如,当第一个程序访问库进行计算时,它将从主内存加载到缓存中,当第二个程序稍后想要访问它时,它将从缓存中访问数据(已由第一个程序加载),再次从主内存
我在Linux下使用GCC。任何解释或指针都将受到高度赞赏。
答案 0 :(得分:2)
操作系统共享代码,不仅是共享库,还有同一二进制文件的可执行文件 - 您无需执行任何操作即可拥有此功能。它是系统内存管理的一部分。
两个进程之间不会共享数据。您需要一个进程中的线程来共享数据。但除非您需要,否则只需确保两个程序使用完全相同的共享库文件(.so文件)。通常你不必考虑那个;如果两个程序使用库的不同版本(它们当然不会共享),这可能很重要。
查看ldd /path/to/binary
的输出,看看二进制文件使用了哪些共享库。
答案 1 :(得分:2)
阅读Drepper的论文How to Write Shared Libraries和Program Library HowTo
要创建一个,请将代码编译为position independent code,例如
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)(并且会在动态链接时执行一些relocation),重要的是inodes。内核将使用文件系统缓存来避免两次读取不同进程使用的共享库。另请参阅linuxatemyram.com
使用例如ldd(1),pmap(1)和proc(5)。另见dlopen(3)。尝试
cat /proc/self/maps
了解运行该cat
命令的address space所使用的virtual memory的process;并非ELF共享库的所有内容都在进程之间共享,只有一些段,包括text segment ...