基础IO(三)
引言
在前两篇文件基础IO(一)和基础IO(二)中讲解的文件都是打开的未见,但是大部分文件都是没有被打开的(当前并不需要被访问),都在磁盘中保存。那么我们也需要对没有被进程打开的文件进行管理,快速定位到文件。
所以文件的管理工作有下面两个
- 打开的文件进行管理
- 没有被打开的文件也要在磁盘中进行管理
这些都需要文件系统的介入。
文件系统
磁盘 —— 物理存储结构
磁盘的物理结构主要由以下几个部分组成:
-
盘片:磁盘由一个或多个盘片组成,每个盘片都有两个面(正反两面),这些面都可以用于存储数据。盘片通常由金属或玻璃材料制成,表面涂有磁性物质。其中一个盘面可以有很多的同心磁道
-
磁头:每个盘面的上下两侧都各有一个磁头,用于读取和写入数据。磁头由磁性材料制成,能够在磁盘表面感应磁场的变化,从而实现数据的读写。磁头安装在磁头臂上,磁头臂通过电动机或电磁力控制,可以在盘片上移动到不同的磁道位置。
-
磁道:磁盘表面被划分成许多同心圆,这些同心圆轨迹被称为磁道。磁道从外向内从0开始顺序编号,每个盘面都有多个磁道。磁道是磁盘存储数据的基本单位,利用磁性材料在磁场中的磁化方向变化来存储数据。
-
扇区:在磁盘里的磁道上等分出若干个弧段,这些弧段便是磁盘的扇区。每个扇区可以存放一定量的数据,通常是
512字节
或4KB
(但通常以512字节为主)。扇区是磁盘存储数据的最小单位,每个扇区都有一个唯一的标识符,用于标识该扇区的位置和大小。
-
柱面:所有盘面中相对位置相同的磁道组成柱面。柱面是磁盘进行数据读写时的一个虚拟单位,数据读写时通常按柱面进行,以提高读写效率。
下图是磁盘的总结构
如果想向一个扇区内写入该如何定位
- 先选则在哪一个盘面,本质就是选择磁头
- 选择该面上的哪一个磁道
- 选择该磁道哪一个扇面
所以定位一个地址需要三个内容盘面(Head),柱面(cylinder),扇面(sector)这种定位一个扇区的方式叫做**CHS定位法
**。其中磁头摆动定位柱面,盘面旋转定位扇区。
我们可以向一个扇区写入,就可以向任意一个或者多个写入,从而就可以向连续多个扇区写入,也就可以进行随机写入。
CHS
定位法
定义
CHS
定位法通过三个参数来定位磁盘上的一个特定扇区:
- Cylinder(柱面/磁道):磁盘上由同一半径的圆所组成的圆柱面,是磁盘数据分区的最小单位。
- Head(磁头):用于读取磁盘上数据的读写磁头,每个盘面都有一个对应的磁头。
- Sector(扇区):磁盘上存储数据的基本单位,每个磁道被划分为若干个扇区,每个扇区通常包含512字节或4096字节的数据。
定位过程
- 确定柱面(磁道):首先,通过确定半径来定位扇区所在的磁道(柱面)。磁道是磁盘上由同一半径的圆所组成的圆柱面,是磁盘数据分区的最小单位。
- 确定磁头:接着,通过磁头的移动来找到扇区所在的盘面。每个盘面都有一个对应的磁头,磁头负责读取该盘面上的数据。
- 确定扇区:最后,通过扇区的编号来确定具体的扇区位置。每个磁道被划分为若干个扇区,每个扇区都有一个唯一的编号。
应用与转换
- 在物理结构上:磁盘通过
CHS
定位法来物理地定位扇区。然而,随着磁盘技术的发展,特别是大容量磁盘的出现,CHS
定位法在某些情况下可能不再适用或效率较低。 - 在逻辑结构上:操作系统内部更常用逻辑块地址(
LBA
)来管理磁盘。LBA
将磁盘抽象为一个线性的数组结构,每个元素对应一个扇区或更大的数据块(如4KB
)。LBA
地址可以通过简单的数学运算转换为CHS
地址,以便在需要时与磁盘的物理结构进行交互。在下面会详细讲解LBA
优缺点
- 优点:
- 简单直观:通过三个参数即可定位磁盘上的任意扇区。
- 兼容性好:早期的磁盘和操作系统广泛支持
CHS
定位法。
- 缺点:
- 容量限制:随着磁盘容量的增加,
CHS
定位法可能无法直接表示所有的扇区地址。 - 效率较低:在处理大容量磁盘时,
CHS
定位法可能需要更多的计算和转换步骤。
- 容量限制:随着磁盘容量的增加,
磁盘存储的逻辑抽象结构
将磁盘盘面想想成一个线性的空间 ,对磁盘的管理就变成了对数组的管理。
首先先将磁盘分成一个一个的盘面
盘面中的磁道逻辑抽象
扇区逻辑抽象
例子
假设有4个盘面,每个盘面有10个磁道,每个磁道有100个扇区那么第1234号在哪
1234 / (10 * 100) = 1 //在第一个盘面
1234 % 1000 / 100 = 2 //在第二个磁道
1234 % 1000 % 100 = 34 // 在第34个扇区
操作系统可以基于文件系统按照块为单位进行数据存取。操纵系统可以以8个扇区看做一个基本单位叫做一个文件块— 4kb
为单位,来进行磁盘级别IO。所以我们只要知道起始的下标,我们就可以连续访问8个扇区。把这8个扇区的起始地址就叫做LBA
(逻辑块地址)。
理解Linux文件系统(ext2
)
根据上面所讲的磁盘存储的逻辑抽象结构可以知道,这些一个一个的文件块是要被管理的,但是假设一个500G
的磁盘分成的文件块数量有太多,所以就把500G
的磁盘分成一个一个的区,例如(100G,200G,100G,100G
)对这些区来进行管理即可。
对其中的一个区管理好就相当于管理好了所有的区,在把其中的一个区划成许多组(2GB
),这就又转换成只要把2GB
管理好就可以把500G
的磁盘管理好。这种思想就是一种分治思想。
对于一个块组里面也包含很多东西,其中要包括我的文件信息,还要包括很多的文件管理的数据。 其中首先要先让管理数据写入到块组当中去,这就是格式化
文件的inode
编号
我们使用Linux命令ls -li
查看文件的详细信息时会发现在最前面会有一串数字,这就是文件的inode
编号,一般情况下一个文件对应一个inode
编号,每个文件都必须要inode
编号。
inode
编号在整个分区具有唯一性,Linux内核中识 别文件和文件名无关,只和inode
有关。
访问文件的时候,最开始应该要判断这个文件在哪一个分区里面。一个磁盘被分区格式化之后,Linux中要使用这个分区,要把这个分区进行挂载,每一个文件都有路径,可以通过路径的前缀判断出,路径在哪一个分区下。
Block Group中的结构
i节点表
存放文件属性,如文件大小,所有者最近修改时间等
保存文件属性是通过
inode
保存的,inode
大小是固定的128字节每一个分组都有一个起始
inode
编号
数据区
- 存放文件内容
- 在数据区中存放着一个又一个的
4kb
的数据块- 为了方便找寻到某个文件对应的在数据区中的块号,在
inode
结构体中存放了一个数组存放的文件数据所在的块号。
inode
位图
- 比特位的位置表示第几个
inode
,比特位的内容表示对应的inode
是否正在被使用
块位图
- Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。
GDT
(块组描述表)
GDT
是Linux
文件系统中用于描述文件系统分组(或块组)属性的数据结构。每个分组都包含有自己的GDT
,该表记录了该分组的详细信息,如已使用的inode
数量、空闲的inode
数量、Block Bitmap
、inode
Bitmap
、inode Table
、Data Blocks
等字段的区域划分等。GDT
的主要作用是管理文件系统的分组信息,确保系统能够高效地访问和管理各个分组内的数据。
Super Block
存放文件系统本身的结构信息。记录的信息主要有:
data bolck
和inode
的总量,未使用的data bolck
和inode
的数量,一个data bolck
和inode
的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了
创建和删除一个文件
创建文件
- 内核先找一个空闲的
inode
将文件信息记录到其中- 将文件的内容存放在数据区的数据块中
- 将新文件添加到目录中,文件名和
inode
之间的对应关系将文件名和文件的内容及文件的属性连接起来。
删除文件
删除文件并不需要把文件的所有内容和属性全部删除,只需要在
inode
位图中,找到文件所对应的那个inode
将比特位由1置为0,同样找到文件所使用的数据块,在块位图中将所对应的比特位由1置为0。
目录
用户在linux
中只用文件名,而内核又使用inode
,那文件名怎么映射到inode
呢。这需要目录的存在。因为目录的内部保存是文件的文件名和inode
的映射关系。所以同一个目录下不允许存在同名文件。
所以在这个目录下新建,删除,修改一个文件就需要写权限,就是修改目录中的内容也就是文件名和inode
的映射关系。
dentry
定义
dentry
是directory entry
(目录项)的缩写,是Linux文件系统中用于描述文件或目录的逻辑属性的数据结构。
功能
- 存储文件名和
inode
号:dentry
中包含了文件名和与之关联的inode
号,inode
号用于唯一标识文件系统中的一个文件或目录。- 加速查找:通过缓存文件名到
inode
的映射关系,dentry
可以显著提高文件系统的查找性能。
内容
dentry
是一个内存实体,只存在于内存中,而不是存储在磁盘上。dentry
结构通常包含指向父节点和子节点的指针,形成一个树状结构,这个树状结构就是文件系统的目录结构在内存中的缓存。dentry
结构还包含其他信息,如目录项对象使用计数器(d_count
)、目录项标志(d_flags
)、文件名(d_name
)等。
工作原理
- 当用户通过文件名访问文件时,文件系统会首先查找
dentry
缓存,看是否已经缓存了该文件名的dentry
。- 如果找到了,就直接通过
dentry
中的inode
号访问inode
结构,进而访问文件数据。- 如果没有找到,就会去磁盘上查找对应的
inode
,然后将文件名和inode
号的映射关系缓存到dentry
中。
软硬链接
软链接
特性
- 软链接类似于Windows系统中的快捷方式,它本身是一个特殊的文件,该文件包含了另一个文件或目录的路径名。
- 通过软链接,可以快速定位到链接所指向的源文件或目录。
- 软链接是一个独立的文件,有独立的
inode
编号
创建软链接
使用ln -s
命令可以创建软链接。例如,ln -s file1 link_to_file1
会创建file1
的一个软链接link_to_file1
硬链接
特性
硬链接不是一个独立的文件,没有独立的
inode
编号硬链接就是在指定目录内部的一组映射关系,文件名和
inode
的映射关系硬链接之间共享相同的
inode
和数据块,不会占用额外的存储空间硬链接是文件的一个或多个文件名,它们指向同一个inode。因此,硬链接实际上是文件的一个别名,它们共享相同的文件内容和元数据。
当删除原文件时只是删除了原来的映射关系,而硬链接也是一个映射关系和原文件的映射关系相同,其实就相当于重命名。
inode
当中有一个引用计数就是表明有几个文件名映射关系。所以当一个文件真正被删除时是没有文件名和inode
映射的时候就删除了。
下图就是文件的硬链接数
我们发现新建一个普通文件的硬链接数为1,但是新建一个目录的硬链接数就是2。因为空目录中有两个隐藏的文件一个是 .(指向当前目录) 一个是…(指向上一级目录)
创建硬链接
使用ln
命令(不带-s
选项)可以创建硬链接。例如,ln file1 file2
会创建file1
的一个硬链接file2
用户无法对目录建立硬链接
如果允许目录的硬链接,那么一个目录可能会通过多个不同的路径被访问。这可能会导致文件系统的状态变得不一致,因为不同的路径可能会看到不同的目录内容或结构。此外,删除这样的目录也可能变得复杂和容易出错,因为需要确保所有硬链接都被删除,才能真正释放目录占用的资源。
硬链接与软链接的不同
硬链接 | 软链接 | |
---|---|---|
定义 | 通过inode 连接的文件别名 | 类似于Windows快捷方式的特殊文件 |
共享存储 | 是,共享相同的inode 和数据块 | 否,占用独立的inode 和数据块(存储路径信息) |
跨文件系统 | 否 | 是 |
链接目录 | 不支持 | 支持 |
删除影响 | 删除一个硬链接不影响其他硬链接或文件本身,直到最后一个硬链接被删除 | 删除软链接不影响被链接的文件或目录,但被链接的文件或目录被删除后,软链接失效 |
创建命令 | ln [原文件] [链接名称] | ln -s [原文件或目录] [链接名称] |
上一篇:基础IO(二)
本专栏为“小菜”linux学习之路 该文章仅供学习参考,如有问题,欢迎在评论区指出。