静态库 动态库

意义:现实中每个程序都要依赖很多基础的底层库,代码不可能从零开始。

静态库:linux下静态链接库为*.a后缀 ,win为*.lib文件。
在链接阶段,将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此链接方式称为静态链接
静态库与汇编生成的目标文件一起链接为可执行文件,那么静态库必定跟.o文件格式相似。一个静态库可以
看成是一组目标文件(.o/.obj文件)的集合,即很多目标文件经过压缩打包后形成的一个文件。

动态库:也叫共享库,linux下动态链接库为.so后缀,windows为.dll
动态库是在程序运行时被链接,不同的应用程序如果调用相同的库,在内存里只需一份该共享库的实例,规避了空间浪费问题。编程中通常可以完成某种功能的函数放在一个动态链接库中,然后提供给其它函数调用。

静态库特点:

  1. 静态库对函数库的链接是放在编译时期完成的。程序在运行时与函数库无瓜葛,移植方便。
  2. 浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。

动态库特点:

  1. 实现进程之间的资源共享。
  2. 在程序运行时才被载入,解决了静态库对程序的更新、部署和发布页会带来麻烦。
    用户只需要更新动态库即可,增量更新。

在Windows/Linux下,由于系统会为每一个进程分配4GB的私有地址空间,而DLL中的代码和数据
也只是映射到了这个私有地址空间中,所以这些应用程序之间还是不能够相互影响的,
多个应用程序虽然是可以共享同一个DLL中的相同的代码的,但是DLL为每一个进程保存的数据都是不相同的,
并且每一个进程都为DLL使用的全部数据分配了自己的地址空间。

当这个访问了的动态链接库的进程被加载时,系统会为这个进程分配4GB的私有地址空间(32位机),
然后系统就会分析这个可执行模块,找到这个可执行模块中所要调用的DLL,然后系统就负责搜索这些DLL找到后
加载到内存中,并为他们分配虚拟内存空间,最后将DLL的页面映射到调用进程的地址空间汇总。
DLL的虚拟内存有代码页和数据页,他们被分别映射到进程A的代码页面和数据页面,如果这时进程B启动了,
并且进程B也许要访问该DLL,这时只需要将该DLL在虚拟内存中的代码页面和数据页面映射到第二个进程的
地址空间即可。这也表明了在内存中,只需要存在一份DLL的代码和数据。

多个进程共享 DLL 的同一份代码,可以节省内存空间。
如DLL中有一个函数int Add(int num1, int num2)作用是实现num1和num2相加并返回相加后的结果。
有一个进程A使用了这个DLL,并且其调用了函数Add(10, 20)
还有一个进程B其也使用了这个DLL,并且其调用了函数Add(30, 40)
对于进程A中的数据10和20其实是保存在进程A的私有地址空间中,而对于进程B中的数据30和40则是保存在进程B的私有地址空间中。

.ko kernel object内核模块,可以在Linux内核起来之后动态的加载和卸载。
.so shared object用户层的动态库,使用同一个.so的程序在运行时只需要该.so的同一份拷贝
.so -> .ko ==> GUI -> dll -> driver

屏幕输出hello world在计算机上的执行过程:
1.预处理-> 2.编译-> 3.汇编-> 4.链接-> 5.生成可执行目标文件
->载入内存->数据流->屏幕输出显示

你可能感兴趣的:(编程基础知识,windows,linux,microsoft)