前言:在之前的文章http://t.csdnimg.cn/Lru5Thttp://t.csdnimg.cn/Lru5T
我们已经对Linux 系统里面的文件具有一定的理解了,现在我们将继续学习Linux里面的软硬连接和动静态库,这些是Linux里面的一些重要内容。
目录
一,文件管理
1)分区
2)文件编号
3)如何通过绝对文件编号找到文件
二,软硬链接
1)硬链接
2)软链接
三,动静态库
1)概念
2)静态库优势
3) 动态库优势
一,文件管理
1)分区
首先我们要思考一下,Linux里面有成千上万的文件,我们该如何准确快速找到我们需要的文件并且进行管理呢?现在我们将来讲解一下这里面隐藏的秘密。
首先我们通过window系统的C,D盘,我们可以知道window操作系统对磁盘空间进行了分区,我们的Linux系统里面同样进行了这样的操作,为什么要分区呢?我们可以把我们想象成一个班主任,我们需要对班上50个同学进行管理,我们该如何入手呢?如果一次性直接对所有同学进行管理,把每个同学当作一个单位,任务未免太重了,这个时候我们不妨把同学分为四个小组,我们只要能将其中一个小组管理好,其他小组仿照这个小组的管理方法,我们不就能管理好所有的小组和同学了。
这就是Linux里面分盘的目的,将难以处理的问题分为类似的小问题,管理好一个小问题就能管理好所有的小问题,最后管理好整个大问题。
2)文件编号
现在我们已经将磁盘分为了很多个区,每个区里还是有成千上万的文件,这些文件我们该怎么处理呢?我们参照C/C++里面的地址概念,我们把每一个文件都分配一个编号,在这个分区里面我们通过编号就能管理好所有文件,但是一个新问题出现了,每个文件的编号如何分配和找到呢》文件都需要分配内存,这个内存该怎么分配呢?我们该如何找到和分配空余的空间呢?现在我先放一张图,根据这张图我们的一切疑惑都会解决的
首先我们来看inodeTable里面存储的就是文件在分区里面的文件相对编号,注意是相对编号(等下我们会讲绝对编号,希望大家记住这个相对编号的概念),不是绝对的文件编号,也就是我们看到能的文件编号,这里面的编号分区里面是唯一的,但是不同分区之间是会有重复的,我们拿到一个相对文件编号发现它存在之后就能在inodeTable找到这个文件的属性,通过属性我们能知道它的各种信息从而对它进行管理。那我们该如何知道这个文件是否存在呢?很多人说遍历一遍就行了,这个观念是完全错误的,Linux里面删除文件不会把它的文件内容删除为空白,因为这样子效率不仅低而且干扰判断,这种做法相比于有了新文件覆盖老位置比无疑十分愚蠢,因此我们就会利用inodeBitmap了,这是什么呢?这是一个位图,每个比特位里面存储这信息,0和1代表存不存在文件,bitmap里面每个比特位代表了每个文件是否存在,我们查找文件之前需要先查看bitmap,看文件是否存在,不存在会返回查找不到的错误。创建一个文件就会将对应bitmap置为1,同理删除一个文件就会将对应bitmap置为0.
那文件的内存该如何分配呢?我们先看上图的data blocks,没错这就是文件的内容存储空间,眼尖的人可能会发现还有个block bitmap,这个是干嘛的呢?这个是用来标记data block开空间的分配的,和inode bitmap用法类似,但我们创建一个新文件需要分配空间就需要根据bitmap里面的内容来分配空间,并且将相应位置置为1,删除通过inode Table找到文件空间的bitmap将其置为0.
Group descriptor table是一个结构体,里面描述了data block的空间分配情况。
super Block也是一个结构体,里面存放文件系统本身的结构信息,bolck 和 inode的总量, 未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了,这个速配Block并不是所有分区都有,只有某几个分区里面有,并且每个super Block里面的内容一样。
上图里面的boot block是一个特定的磁盘区域,通常位于磁盘的开始部分,用于存储启动加载器(boot loader)的代码。这个区域在启动过程中被BIOS或UEFI固件读取,以启动操作系统。
3)如何通过绝对文件编号找到文件
首先给我们一个文件绝对编号,首先我们判断文件处于哪一个磁盘?每个磁盘都会有自己的文件inode绝对编号范围,然后绝对编号减去相对编号,通过相对编号里面的inode bitmap判断文件是否存在,存在通过inode table取到文件属性来管理文件。
二,软硬链接
1)硬链接
如何创建一个硬链接,现在先演示给一个文件test.c创建一个硬链接
ln 被创建硬链接的文件 硬链接的名字
硬链接并没有创建新文件,只是提供了一个快捷方式而已,为什么这么说呢?大家看我给的图,里面的inode编号
大家发现了没有,这两个文件inode编号一样,我们都知道inode文件编号都是唯一的,这能说明,这根本就是同一个文件。另外我们需要注意,不能给目录创建硬链接,不然会陷入死循环递归。
2)软链接
软链接相比于硬链接只多了一个参数,在ln 后面加个-s就欧克啦。
那我们按照上面的思路来看看软链接的inode编号
我们惊奇的发现两个文件的inode编号不一致,也就是说这是两个不同的文件,那为什么软链接也是一个快捷方式呢?因为软链接里面存储了文件的路径,通过这个文件我们同样能打开test.c。
三,动静态库
1)概念
静态库:在编译链接的时候将链接的代码加入源文件来编译运行。
动态库:在运行时链接动态库的代码,将代码加载到内存里面,多个程序可以共享一段代码。
2)静态库优势
- 加载速度快:由于静态库在链接阶段就将汇编生成的目标文件与引用的库一起链接到可执行文件中,因此执行期间代码装载速度快。
- 移植方便:发布程序时无需提供静态库,使得程序在不同的环境或系统上的移植更为便捷。
3) 动态库优势
- 节省磁盘和内存空间:动态库允许多个应用程序共享内存中的同一份库文件。这意味着,即使多个程序使用相同的库,也只需要在内存中加载一份库文件,从而显著节省了磁盘和内存空间。相反,静态库在链接阶段将库代码直接加载到每个可执行文件中,导致相同的库代码在多个程序中重复存在,浪费空间。
- 更新维护方便:动态库在程序运行时才被加载,因此,当库文件需要更新时,只需要替换相应的动态库文件,而无需重新编译整个程序。这使得软件的维护和升级变得更加简单和高效。相比之下,静态库如果发生更新,所有使用它的应用程序都需要重新编译,这无疑增加了维护的复杂性和成本。
- 实现进程间资源共享:动态库允许不同的进程共享同一份库文件,这不仅提高了资源的利用率,还促进了进程间的协作和通信。
- 支持模块化开发:动态库支持模块化开发,这意味着开发者可以将代码拆分成多个独立的模块,每个模块可以单独编译和更新,提高了开发效率和代码的可维护性。