文件系统和软硬链接

一.文件系统

文件操作就是进程和被打开文件之间的关系,但是操作系统不可能同时将磁盘中的所有文件打开。被打开的文件要被管理起来,没有被打开的文件为了方便我们随时去读取也要被管理起来。

1.了解磁盘的物理结构

在这里插入图片描述

磁盘是计算机中几乎唯一 一个机械设备并且是一个外设,它的速度很慢,但它廉价且存储量大,目前仍然是企业存储设备的首选。对于磁盘我们应该有以下的认识:

1.磁盘是通过磁头充放电改变盘面南北极调换将数据写入到盘面上的

2.磁盘不止一片盘面,而是一摞,每个盘片有两面,有多少个盘面就有多少个磁头

3.磁头和盘面之间有很微小的距离,它们并没有直接触碰到一起(如果磁头碰到盘面就可能将盘面刮花导致数据的丢失)

4.所有的磁头是被连接在一起的,只能一起运动(共进退),即它们是指向不同盘面的同一个位置

2.磁盘的存储结构

在这里插入图片描述

一块盘面是由多个磁道构成,一个磁道又被划分成多个扇区。各个盘面中半径相同的圆一起构成了一个柱面。

在读取磁盘数据的时候,是按照扇区为单位读取的。虽然越靠近圆心的磁道周长越小,但是它们存取的数据是一样多的,即每个扇区的存储能力是相同的,都是512字节。

a.磁盘读取

磁盘写入数据依靠的是磁头,读取数据依靠的仍然是磁头。当磁盘开始运作的时候,盘片在高速旋转,磁头在来回摆动。磁头摆动的过程就是在定位磁道(柱面)的过程,定位了磁道(柱面)以后,磁头就固定在那个磁道上不再发生偏转,此时再来确认是哪一个磁头,最后再确认数据在该磁道的哪一个扇区。

磁盘中有多个盘面也就有多个磁头,所以在确认磁道以后还需要确认磁头,确认磁头也是在确认数据在哪个盘面,为确认扇区也提供了前提。

这种定位方式被称为C(柱面)H(磁头)S(扇区)定位法

3.磁盘的逻辑结构

在这里插入图片描述

如果使用CHS定位法,这是一种三维寻址方式,效率不够高,所以为了效率和方便管理,实际上操作系统在管理磁盘的时候,是将磁盘抽象成一种线性结构(数组)。此时我们需要读取某一个区域中的数据,只需要拿到这个区域的下标即可,这个下标在操作系统中就称为LBA地址。

操作系统内部也是使用的LBA地址,当我们实际要去磁盘中读取数据时就需要将LBA地址转换成CHS地址(通过计算可以得到)。

a.为什么操作系统不直接使用CHS地址?

1.为了方便管理,CHS寻址是三维的,而数组下标则是一维寻址

2.让操作系统的代码与硬件进行解耦,不让硬件的变化影响操作系统

b.实际IO一次的大小

虽然一个扇区的大小是512字节,但是对于文件来说还是太小了,毕竟我们大部分的文件文件都是几兆到几个G的。所以操作系统每次去磁盘读取数据的时候都会以1KB,2KB,4KB为基本单位(大部分都是4KB)。也就是说哪怕你只需要读取一个扇区中的一个比特位,操作系统也会加载4KB大小的数据。

也就是说操作系统将4KB数据加载进来以后,很可能不能被完全利用,但是这也不一定就意味着浪费。根据局部性原理:当我们访问了该数据以后,大概率是要访问该数据周围的数据的。所以一次性加载4KB大小的空间,在某种程度上也算是一种预加载。

在对比顺序表和链表的时候,说顺序表CPU高速缓存命中率高。不就是因为顺序表的数据存储在一块连续的空间中吗,因为一次性会加载4KB大小的空间,所以下次再去访问顺序表后续的元素就会发现它已经在内存中了。

操作系统中的内存其实是被划分成了一个一个的块,这些块的大小为4KB,这就是页框。

而磁盘中的文件,尤其是二进制可执行文件,也是被划分成了4KB大小的块,这个就是页帧。

4.磁盘的分区管理

我们的磁盘动不动就是512G,要管理这么大一块空间是一件很不容易的事。操作系统在管理磁盘的时候采取的是分治的思想,首先将磁盘进行分区(将磁盘分成C盘,D盘),然后再将区进行分组。

4.1.ext文件系统

在这里插入图片描述

注意:Boot Block是启动块,大小为1kb,由pc标准规定的,用来存储磁盘分区信息和启动信息,任何文件系统都不能操作该块。其他的每个Block Group都具有相同的组成结构

Super Block:存放的是文件系统本身的结构信息未使用的Data Block和inode的数量、一个Data Block和inode的大小、最近一次挂载的时间、最近一次写入数据的时间、最近一次检验磁盘的时间等其他文件系统的相关信息,主要包括Date Block和inode的总量。每一个Block Group中都有一个Super Block,其中以Group0中的为主,其他的为辅;这是一种备份,因为一旦Super Block被损坏整个文件系统都会受到影响。

Group Descriptor Table:块组描述表,存放该分区中的所有块组的属性信息

Block Bitmap:是一个位图结构,用1表示该位置的Data Block被占用,用0表示没有被占用

inode Bitmap:位图结构,用1表示该inode被占用,0表示没有被占用

inode Table:inode表,存放该分组内所有可用的inode(已使用的+未使用的),每个inode的大小是128/256字节,inode和文件一 一对应,每个inode中都存放着该文件的几乎所有属性(在操作系统中,inode是文件的唯一标识)。文件名不在inode中存放

Data Blocks(数据块):存放分组内所有的Data Block,Data Block用于存放文件的数据,每个Data Block的大小是一样的。(大文件占用的数据块多,小文件占用数据块少)

通过上面的信息我们要知道这些:

1.格式化就是重写文件系统,而文件系统的恢复就是用其他没有被损害的Super Block去恢复被损坏了Super Block

2.创建新文件就是在inode Bitmap中找到一个没有被占用的inode存放该文件的属性,再去Block Bitmap中找到没有被占用的Data Block写入该文件的数据,最后建立inode和Data Block之间的映射关系

a.文件查找

inode和文件是一一对应的,inode在同一个分区是连续的,不同分区的inode是没有关联的。查找文件就是去inode Bitmap中查找该inode所对应的比特位是否为1,如果是,就说明该文件存在,而该inode在位图中对应的比特位相对于第一个比特位有一个偏移量,这个偏移量就可以作为该inode在inode Table的相对位置。这就可以得到文件的属性内容了。

在inode中存在一个block[15]数组,该数组中0-11下标存放的都是该文件使用的数据块,而block[12]对应的数据块中不存放文件的内容,而是存放其他的数据块地址,文件的数据也可以写入到数据块所存储的数据块中,数据块中存数据块,这就是二级索引。block[13]就是三级索引,block[14]就是四级索引。这样逐级展开以后就可以存放相当巨大的数据。

一个数据块的大小只有4KB,而一个数据块大小的地址可能只有4字节,通过建立索引的方式就可以解决大文件的存储和查找

b.文件删除

在文件系统中删除文件只要将该文件对应的inode在inode Bitmap中由1置0,这个文件就算是被删除了。

因为一旦一个inode在inode Bitmap中被由0置1,操作系统就会认为该inode没有被占用,会将这个inode分配一个新创建的文件并覆盖式的写入文件属性。

几乎所有在计算机中的删除都是这样的惰性删除。

在创建一个新文件时,是实实在在的要写入数据,但是要删除一个文件只要在inode Bitmap中将对应的比特位由1置0即可,这就是为什么删除文件远比下载文件要快。

因为删除文件只是在inode Bitmap中将对应的比特位由1置0,所以这也为文件恢复提供了可能性,当一个文件被误删以后最好不要做任何除了恢复文件的操作,否则就可能会有新数据覆盖之前被删掉文件的数据块(或者inode)。

4.2目录的属性和数据

虽然操作系统用inode标识文件,但用户使用的是文件名,但inode又不存储文件名。一个目录也有自己的inode和数据块,目录的inode存放的子让是目录的属性,目录的数据块中存放的就是该目录下所有文件的文件名和inode映射关系。

这就是为什么同一个目录下不能有两个同名文件,因为inode与文件是一一对应的(也就是说一个inode只能与一个文件名映射)。

在Linux权限学习时提到要在一个目录中创建新文件必须要有写入权限,这是因为在目录下创建新文件就要在该目录对应的数据块中写入新文件和其inode对应的映射关系。

二.软硬链接

软链接的建立和删除

在这里插入图片描述

1.使用ls -li可以查看文件的inode

2.软链接是一个独立的文件,有自己的inode和数据块

3.删除软连接可以使用unlink也可以使用rm直接删除软连接文件

软链接的使用场景

软链接相当于Windows下的快捷方式:

在这里插入图片描述

删除软链接并不会影响源文件,但源文件一旦被删除以后软链接就失效了

硬链接的建立和删除

在这里插入图片描述

观察发现,硬链接文件的inode和源文件相同,硬链接没有自己的inode并不是一个独立的文件,它只是对应文件名和inode的一个映射关系。

在这里插入图片描述

硬链接数代表有几个文件指向这个inode,inode中有一个ref变量,新建一个硬链接ref++,反之则ref–,只有当ref被减为0的时候这个文件才会被真正的删除。(关闭文件也是一样,只有没有任何进程使用该文件这个文件才会被关闭)这种方式被称为引用计数。

也就是说硬链接其实是给该文件取了一个别名,并让ref增加一,使得该文件再被删除以后,这个文件的数据还能被硬链接访问。

硬链接的使用场景

当我们创建一个新文件时,它的硬链接数就是1(代表它自己本身).但是我们创建一个目录时,默认的硬链接数就是2,这是因为除了目录本身,还会默认创建一个.文件代表当前目录

在这里插入图片描述

当我们创建一个目录后,会默认生成...,其中.代表当前目录,而..代表上级目录,这就是为什么我cd ..可以退回到上级目录的原因。

如果我在dir目录下继续创建目录,那么dir的硬链接数会继续++,因为新目录下会有..指向dir目录

猜你喜欢

转载自blog.csdn.net/m0_62633482/article/details/130402469