软硬链接与动静态库
软连接
创建链接的方法:
- ln -s test1.txt test2.txt
其中ln 是link(链接),-s 是soft(软),后者链接前者。
此时打开test2.txt,发现其中内容与test.txt一致。那么软连接到底建立了什么联系?
- 首先两个文件都有独立的inode号,也就是说他们是两个独立文件
- 其次,如果删除了目标文件(此处为test.txt),软链接文件则无法使用。反过来只删除软连接文件的话,不会对目标文件产生影响。
所以软连接可以看作是创建一个快捷方式。
硬链接
创建链接的方法:
- ln test1.txt test2.txt
其中ln 是link(链接),后者链接前者。
- 两个文件共用一个inode,并非独立文件
- 2是文件(inode)的属性,对应的是文件的引用计数
此时使用 ll -li 指令查看文件:
- 软连接是通过路径去查找的(先找路径,再使用inode),这也就是为什么删除目标文件就无法使用的原因
- 硬链接是直接通过inode去查找的,建立链接后引用计数加一,只要引用结束不为0则不会真正删除文件。
因为其查找的特点 ,软连接常用于创建快捷方式,硬链接常用于备份。
动静态库
编程时很多常用的功能都是提前编好并封装成库,而库则是程序代码的集合,是共享程序代码的一种方式。
- 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。相当于程序自带静态库。
- 动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
- 链接了动态库的可执行程序的函数地址表中只包含会用到的函数的地址。
- 动态库可以在多个程序间共享,所以动态链接使得可执行文件更小。
静态库创建:
- ar -rc libmyc.a *.o
把所有.o文件打包,形成一个文件libmyc.a的静态库。
动态库创建:
-shared 意为共享
- gcc -shared -o libmyc.so *.o
动静态库优缺点
静态库优点:
- 静态库打包到应用程序当中,加载快
- 方便移植
静态库缺点:
- 其相同的库文件数据可能在内存中被加载多份,比动态库更消耗内存
- 库文件更新需要重新编译项目文件,生成新的可执行程序,更加耗时
动态库优点:
- 可实现不同进程间的资源共享
- 动态库升级简单,只需要替换库文件,无需重新编译应用程序
- 可以控制何时加载动态库,不调用库函数动态库不会被加载
动态库缺点:
- 加载速度比静态库满
- 发布程序需要提供依赖的动态库
动态库加载
动态库在程序运行时被加载到物理内存中,与程序进程产生关联。动态库加载后,会被映射到进程的地址空间中,先在页表中填写虚拟地址和物理地址的映射关系,然后映射到进程地址空间的共享区中。