在Windows和Linux环境中加载
我的问题与Windows和Linux环境下的动态库加载('abc.dll'或'abc.so')有关。
我有一个DLL或共享内存。 我有两个应用程序必须使用此dll(abc.dll或abc.so)。 现在我已经将这个dll(abc.dll或abc.so)的副本放在它们各自的可执行文件夹中:
/folder-one/app1.exe
/folder-one/abc.dll (resp. abc.so)
/folder-two/app2.exe
/folder-two/abc.dll (resp. abc.so)
现在,当我运行app1.exe
它会从folder-one
加载abc
-library(abc.dll或abc.so),并运行。
现在,当我运行app2.exe
它会从它的folder-two
&运行)加载abc
-library(abc.dll或abc.so)。
Q-1现在我的问题是,当这两个应用程序运行时,是否会有两个dll加载副本?
Loader将共享库(abc.dll或abc.so)加载到linux和windows环境中的内存中。 http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
Q-2将共享库(abc.dll或abc.so)作为各个文件夹中的单个副本存在缺点吗?
Q-3如果我想从两个应用程序中加载一个dll,那么通用位置应该是什么(所以这两个应用程序都可以找到它)?
Q-1现在我的问题是,当两个应用程序运行时,都会有两个dll副本加载?
是的,图书馆将被加载两次,因为他们住在不同的地点(并且名字本身不足以使其独特)。
Q-2(abc.dll或abc.so)作为不同文件夹中的个别副本是否存在缺点?
主要的内存消耗,因为代码将被复制(当然每个副本将有自己的数据)。 这是一种简化,因为它不是强制共享代码(并且它在Linux和Windows之间是不同的)。 一般来说,只读部分是共享的,读/写部分是私有的(然后重复)。
此外,由于加载期间发生的基本开销(内存分配,地址重定位,依赖关系解析等),加载时间更长。
不要忘记,这也适用于每个依赖项(如果它们部署在您使用的库的相同文件夹中)。
最后你应该考虑部署和更新。 这可以是一个专业或者是一个骗局,但是不要忘记一个共享库可以只更新一次,它会升级所有的依赖应用程序; 它是一个专业,如果它仔细做,但它是一个骗局,如果更新可以打破现有的代码。 例如,可以管理此问题,例如在名称中包含版本号(更改版本时不授予兼容性)。
Q-3如果我从两个应用程序加载dll,那么应该在共同的位置?
是。 图书馆的名称和位置是唯一标识的。 在这种情况下,它不会在内存中加载两次。
在Windows上,如果一个dll已经加载并且您使用相同的模块名称加载dll,它将返回加载的dll而不打扰搜索。
在系统搜索DLL之前,它会检查以下内容:
如果具有相同模块名称的DLL已经加载到内存中,系统将使用加载的DLL,而不管它在哪个目录中。系统不搜索该DLL。
正如在这个非常长的MSDN页面中所描述的那样(乍一看只是关于Windows应用程序的撕裂,但它确实讨论了桌面模式,我猜它至少从Win7没有改变过)
然而,我认为这取决于现在的很多事情:你运行的是Windows商店应用程序,还是.net dll或win32 dll。 我知道.NET使用探测系统来定位一个dll。 然后你还必须确定你的dll是否作为一个并排的组件。
内存的旧时代,当时的目录,然后路径很容易理解。 我认为Linux使用这种方法。
链接地址: http://www.djcxy.com/p/44497.html