这是我参与「第五届青训营 」伴学笔记创作活动的第4天,今天学习整理了一部分计算机系统文件系统的内容,简单做个总结。
文件系统
文件系统的基本组成
文件系统的基本单位是文件
一切皆文件,包括设备管道,socket
linux为每个文件分配索引节点(inode)和目录项(dentry)两个数据结构
-
inode记录文件元信息,包括文件大小,编号等
-
inode是文件的唯一标识,储存在硬盘中,占用磁盘空间
-
dentry记录文件名,inode指针以及与其他目录项的层级关联。
-
目录项由内核维护,存放在内存中
目录也是文件,普通文件存文件数据,目录文件存子目录或文件
目录项与目录不同,目录为磁盘的文件,目录项为内核的数据结构,在内存中。
目录如果频繁读取,内核会把已读目录存在内核的目录项中,下次读写直接从内存读取。
目录项不仅表示目录,同样可以表示文件
文件数据的存储
磁盘读写的最小单位是扇区,512B,文件系统把多个组成逻辑块(数据块),Linux逻辑块大小为4KB,即8个扇区。
总结,如图
为加速访问,硬盘的索引节点通常会加载到内存中。
另外格式化内存时,磁盘分成三个区域,超级块,索引节点区和数据块区。
- 超级块,用来存储文件系统的详细信息,比如块个数、块大小、空闲块等等。
- 索引节点区,用来存储索引节点;
- 数据块区,用来存储文件或目录数据
系统不会把超级块和索引节点全部加载到内存,只有需要的时候才会,其时机各不相同。
- 超级块:当文件系统挂载时进入内存;
- 索引节点区:当文件被访问时进入内存;
虚拟文件系统
文件系统种类多,Linux操作系统为给用户提供一个统一接口,把虚拟文件系统(VFS)作为中间层注入用户层和文件系统层之间
VFS 定义了一组所有文件系统都支持的数据结构和标准接口,这样程序员不需要了解文件系统的工作原理,只需要了解 VFS 提供的统一接口即可。
Linux系统中各部件关系如下:
linux支持的文件系统分为三类:
-
磁盘的文件系统,它是直接把数据存储在磁盘中,比如 Ext 2/3/4、XFS 等都是这类文件系统。
-
内存的文件系统,这类文件系统的数据存储在内存空间,我们经常用到的 /proc 和 /sys 文件系统都属于这一类,读写这类文件,实际上是读写内核中相关的数据。
-
网络的文件系统,用来访问其他计算机主机数据的文件系统,比如 NFS、SMB 等等。
文件的使用
- 读取一个文件的过程,通过open系统调用打开文件
- write操作时使用open返回的文件描述符,而不是文件名做参数。
- 通过close系统调用关闭文件
打开了一个文件后,操作系统会跟踪进程打开的所有文件.
跟踪就是操作系统为每个进程维护一个打开文件表,文件表里的每一项代表「文件描述符」
所以说文件描述符是打开文件的标识
操作系统在打开文件表中维护着打开文件的状态和信息:
- 文件指针:系统跟踪上次读写位置作为当前文件位置指针,这种指针对打开文件的某个进程来说是唯一的;
- 文件打开计数器:文件关闭时,操作系统必须重用其打开文件表条目,否则表内空间不够用。因为多个进程可能打开同一个文件,所以系统在删除打开文件条目之前,必须等待最后一个进程关闭文件,该计数器跟踪打开和关闭的数量,当该计数为 0 时,系统关闭文件,删除该条目;
- 文件磁盘位置:绝大多数文件操作都要求系统修改文件数据,该信息保存在内存中,以免每个操作都从磁盘中读取;
- 访问权限:每个进程打开文件都需要有一个访问模式(创建、只读、读写、添加等),该信息保存在进程的打开文件表中,以便操作系统能允许或拒绝之后的 I/O 请求;
文件的存储
- 文件数据存在磁盘的方式有两种
连续存放方式
空间,效率高
-
必须知道文件大小
-
inode需要指定起始块的位置和长度
-
缺点:磁盘空间有碎片,文件长度难拓展
非连续存放方式
链表方法
1.隐式链表
-
实现方式
文件头inode包含第一块与最后一块的位置,每个数据块留出一个指针指向下一个数据块
-
缺点
无法直接访问数据块,指针消耗一定空间,稳定性差,指针损坏导致文件数据丢失
2.显式链表
- 实现方式
把用于链接文件各数据块的指针,显式地存放在内存的一张链接表中,整个磁盘仅设置一张
内存中这样一个表格称为文件分配表(FAT)
-
缺点
不适合大磁盘,越大磁盘,FAT方案的表占有越大,200g硬盘可达800MB.
索引方式