该文根据小林coding的文件系统总结的笔记,如有不对,请多指正
文件系统构成
- inode - 元信息 -
保存在硬盘 - 目录项 - 结构 - 保存在内存中 - 内核维护
文件读写按块读写 - 一块4KB = 8个扇区 - 512B
会先指向超级块,超级块中存放各个数据块的索引节点 - 索引节点会指向对应的数据块
文件系统分类
Linux的文件系统大致可以分为3类:
- 磁盘文件系统: Ext
- 内存文件系统: proc , sys
- 网络文件系统: nfs
文件的使用
用户空间的write() -> 虚拟文件系统的sys_write() -> 文件系统的写方法 -> 磁盘
open -> 生成fd -> 加入到文件描述符表
fd: 绑定文件对应信息(包括文件在磁盘的位置,文件指针的位置,访问权限等等)
进行write/read 等操作时,用户操作的是字节,文件系统操作的数据块
文件的存储
文件存储与程序在内存中的存放相似(内存管理)
两种存储方式连续存储和非连续存储:
空闲空间管理
针对磁盘的空闲空间引入管理的机制:
- 空闲表法
为所有空闲空间创建一张表,表内包括空闲区的第一个块号和块数(空闲空间少比较合适,不然表会很大,查询效率也低) - 空闲链表法
通过链表方式来管理空闲块(空闲空间多起来也很大,很耗时) - 位图法(Linux)
用二进制的一位来表示盘块(4KB)的使用情况
文件系统的结构
块组: 一个块大小的位图所能表示大小为128MB(1B位图可以表示8x4KB)就是块组的大小
- 超级块: 包含的是文件系统的重要信息。
- 块组描述符: 包含文件系统中各个块组的状态。
- 数据位图和 inode 位图: 用于表示对应的数据块或 inode 是空闲的,还是被使用中。
- inode 列表: 包含了块组中所有的 inode。
- 数据块: 包含文件的有用数据。
每个块组里有很多重复的信息,比如超级块和块组描述符表,每个块组都有,原因如下:
目录的存储
软链接和硬链接
文件 I/O
- 缓冲与非缓冲 I/O
- 缓冲 I/O,库函数调用(文件IO),有标准库缓存。
- 非缓冲 I/O,系统调用(标准IO),无标准库缓存。
- 直接与非直接 I/O
- 直接 I/O,直接经过文件系统去访问磁盘。
- 非直接 I/O,在操作时,数据会经过系统缓存,再拷贝给用户或者写入数据到磁盘。
- 阻塞与非阻塞 I/O VS 同步与异步 I/O
- 阻塞I/O: 当执行read,线程会被阻塞,一直等到内核数据准备好,并把数据拷贝过来,read才会返回
- 非阻塞I/O: 当执行read(非阻塞),没有数据,直接返回,线程可以一直往下执行,不断轮询,直到内核数据准备好,把数据拷贝过来,read才有结果
- 同步I/O: 在 read 调用时,内核将数据从内核空间拷贝到应用程序空间,过程都是需要等待的
- 异步I/O: 在aio_read后,直接返回,内核收到数据就会自己拷贝到对应得用户空间