面试问题之操作系统:动态链接库和静态链接库的区别
动态链接库是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。动态链接库文件名的扩展名一般是dll,也有可能是drv,sys和fon,它和可执行文件(exe)非常类似,区别在于动态链接库中虽然包含了可执行代码却不能单独执行,而应由应用程序直接或间接调用。
动态链接库是相对于静态链接而言的。所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。换句话说,函数和过程的代码就在程序的可执行文件中,该文件包含了运行时所需的全部代码。当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。而动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在操作系统的管理下,才在应用程序与相应的动态链接库之间建立链接关系。当要执行所调用动态链接库中的函数时,根据连接产生的重定位信息,操作系统才转去执行动态链接库中相应的函数代码。
一般情况下,如果一个应用程序使用了动态链接库,Win32系统保证内存中只有动态链接库的一份复制品,这是通过内存映射文件实现的。DLL首先被调入Win32系统的全局堆栈,然后映射到调用这个动态链接库的进程地址空间。在Win32系统中,每个进程拥有自己的32为位线性地址空间,如果一个动态链接库被多个进程调用,每个进程都会收到该动态链接库的一份映像。