一、知识点(只背这)
1. 文件系统,是对文件进行组织管理的机制。它抽象了一层虚拟文件系统(VFS),对所有文件系统(Ext4、XFS等)做了 数据结构和接口 的统一抽象。 进程可以使用统一的接口进行交互。
2. 在 Linux 中一切皆文件。不仅普通的文件和目录,就连套接字、管道,也是通过统一的文件系统来管理。
3. Linux 为每个文件分配两个数据结构,索引节点 (记录文件的元数据)和 目录项 (记录文件的目录信息)。
4. 索引节点缓存在磁盘缓存Buffer中,存储在硬盘的索引节点区。
目录项缓存在页缓存Cache中,纯粹是缓存。
5. 磁盘在执行文件系统格式化时,会被分成三个存储区域,超级块、索引节点区和数据块区。
数据块区保存文件数据,索引节点区保存文件索引节点。
6. 如果小文件过多的话,会出现数据块区有剩余空间,但索引节点区剩余空间不足的问题。需要压缩或删除小文件。
7. 文件系统通过使用 目录项和索引节点的缓存数据,来降低 慢速磁盘读写 对应用程序的影响。
二、索引节点和目录项
Linux 文件系统为每个文件都分配两个数据结构,索引节点 和 目录项。
1. 索引节点:简称为 inode,用来记录文件的元数据,比如 inode 编号、文件大小、访问权限、修改日期、数据的位置等。
索引节点同样占用磁盘空间。
2. 目录项:记录文件的名字、索引节点指针以及与其他目录项的关联关系。
多个关联的目录项,就构成了文件系统的目录结构。
由内核维护的一个内存数据结构,也被叫做目录项缓存。
3. 每个文件只有一个索引节点,但可以有多个目录项。(例如硬链接)
4. 索引节点是存储在磁盘中的数据,目录项是一个内存缓存,加速文件的访问。
5. 磁盘在执行格式化时,会被分成三个存储区域,超级块、索引节点区和数据块区。
6. 图示:
三、虚拟文件系统
1. 为了支持各种不同的文件系统,Linux 内核在用户进程和文件系统的中间,引入了一个抽象层,也就是虚拟文件系统 VFS。
2. 示意图:
四、文件系统 I/O
1. VFS 提供了标准的文件访问接口,提供给应用程序使用。
就cat命令来说,它依次调用了open(),read(),write() 三个接口。 (write把文件内容输出到标准输出中)
2. 文件读写方式 分四类:
(1) 缓冲与非缓冲 I/O:
标准库内部实现的缓存。程序遇到换行时才真正输出,而换行前的内容被标准库缓存了起来。
(2) 直接与非直接 I/O:
直接 I/O:跳过操作系统的页缓存,直接跟文件系统交互来访问文件。
非直接 I/O:先经过系统的页缓存,然后再由内核或额外的系统调用,真正写入磁盘。
(3) 阻塞与非阻塞 I/O:
阻塞 I/O:应用程序执行 I/O 操作后,如果没有获得响应,就会阻塞当前进程。
非阻塞 I/O:不会阻塞。随后再通过轮询或者事件通知的形式,获取调用的结果。
注意:描述的主体是应用程序。
(4) 同步与异步 I/O:
同步 I/O:应用程序执行 I/O 操作后,要一直等到整个 I/O 完成后,才能获得 I/O 响应。(系统给它响应)
异步 I/O,应用程序执行 I/O 操作后,不用等待整个 I/O 完成,可以继续执行下面的程序。等到这次 I/O 完成后,响应会用事 件通知的方式,告诉应用程序。(系统给它响应)
注意:描述的主体是系统。
五、磁盘容量和索引节点容量
1. 查看磁盘容量 df -h
2. 查看索引节点容量 df -i
3. 当发现索引节点空间不足,但磁盘空间充足时,很可能就是过多小文件导致的。
删除这些小文件,或者移动到索引节点充足的其他磁盘中,就可以解决这个问题。
原文地址:极客时间-轻松学习,高效学习-极客邦