文件系统
文件系统全家桶
文件系统基本组成
在Linux中,系统为每个文件分配了两个数据结构:索引节点和目录项,索引节点记录文件的元信息,占用磁盘空间,而目录项记录文件的名字,缓存在内存。
- 目录和目录项的区别,前者是文件,持久化存储在磁盘中,后者是内核的一个数据结构,缓存在内存。
- 文件数据如何存在磁盘中:
虚拟文件系统
目的是对用户提供一个统一的接口,引入了虚拟文件系统。
往下linux系统支持多种文件系统,根据存储位置不同可分为:
- 磁盘的文件系统:直接将数据存储到磁盘。
- 内存的文件系统:存在内核中。
- 网络的文件系统:用于访问其他计算机主机数据的文件系统。
文件的使用
文件系统的基本操作单位是数据块。
文件的存储
存放方式分为:
- 连续空间存放方式:存放在连续的物理空间内,读写效率高,但需要在文件头内指定起始块位置和长度。缺点就是有磁盘
空间碎片和文件长度不易扩展。 - 非连续空间存放方式:有进一步分为链表方式和索引方式:
– 链表方式:离散的,不用连续,且文件的长度可以动态扩展,进一步又分为:
— 隐式链表:文件头包含第一块和最后一块的位置,每个数据块留出一个指针空间,用来存放下一个数据块的位置。缺点是稳定性较差,链表内指针消失则会导致文件数据丢失。
— 显式链表:把用于链接文件各数据块的指针显示地存放在一张链接表中,每个表项中存放链接指针,指向下一个数据块号。
这样的表称为文件分配表。因为在内存中,所以能提高检索速度,但不适用于大磁盘
– 索引方式:为每一个文件创建一个索引数据块,里面存放文件数据块的指针列表。
– 索引+链表方式,索引+索引方式
空闲空间管理
- 空闲表法:建立表,包含第一个空闲块号和空闲块个数。
- 空闲链表法:将空闲块串起来。
- 位图法:利用二进制的一位表示此盘是否空闲
文件系统的结构
目录的存储
软链接和硬链接
- 硬链接:多个目录项中的索引节点指向一个文件,硬链接不可用于跨文件系统,只有删除文件的所有硬链接以及源文件时,系统才会彻底删除该文件。
- 软链接:相当于重建一个文件,该文件有独立的inode(文件元信息),但其内容是另一个文件的路径。
文件I/O
缓冲与非缓冲I/O
划分依据为是否利用标准库缓冲,缓冲则可以加速访问文件。
直接与非直接I/O
根据是否利用操作系统的缓存,非直接的在读操作时,会将数据从内核缓存中拷贝给用户程序,写操作时相反。
阻塞与非阻塞I/O 同步与异步I/O
- 阻塞I/O:阻塞等待 内核数据准备好 和 数据从内核态拷贝到用户态 这两个过程。
- 非阻塞I/O:不断轮询内核,直到数据准备好,然后完成拷贝。
这样不断轮询导致资源浪费,因此引入I/O多路复用技术。即当查询数据未准备好时,阻塞该路,转而换其他路,等到
通知数据可读时,继续该路。
这样算一个同步过程,而非同步过程是无需等待内核数据准备好和数据从内核态转到用户态的过程,直到拷贝完成通知。
page Cache
- 优势:1.加速数据访问。2减少I/O次数,提高系统磁盘I/O的吞吐量。
- 劣势:需要额外占用物理内存空间,在某些应用场景下,多了一次磁盘读写I/O。