1 程序a调用c.so,程序b也调用c.so c.so加载两次吗?
在这种情况下,通常 c.so
不会被加载两次。
当一个程序调用一个共享对象文件(.so
)时,操作系统的动态链接器将该共享对象映射到进程的虚拟内存空间中。后续由不同程序或者同一个程序调用相同的共享对象,都不会导致共享对象被重新加载。相反,动态链接器会检查共享对象是否已经加载,如果是,则仅增加它的引用计数。
因此,当程序 A 和程序 B 都在运行并且它们都调用 c.so
中的函数时,动态链接器会确保 c.so
只被加载一次,并且两个程序会共享同一个 c.so
实例。这就是使用共享库的好处之一——它们在多个进程之间共享,减少了内存消耗并提高了效率。
2 同时调用其中的函数fun -- 会产生冲突吗?
在一般情况下,同时调用共享库(c.so
)中的同一个函数(例如 fun
)不会产生冲突。
当多个程序同时调用共享库中的同一个函数时,每个程序的调用会被独立处理,而函数的代码段在内存中只有一份。因此,不会出现冲突的情况。操作系统会确保在多线程或多进程的情况下,对共享库中的函数的并发调用是安全的。
然而,要注意的是,如果函数 fun
内部存在状态(例如全局变量),并且这些状态在多个函数调用之间是共享的,则可能需要考虑线程安全性,以避免竞争条件和数据损坏。在这种情况下,需要使用同步机制