你听过文件系统吗?
听过
那让我们一起复习一下吧_
1. 复习背景知识
第一部分属于对文件系统的复习内容,了解的人可直接阅读第二部分。
1.1 为什么需要文件系统
文件存于磁盘中,磁盘可以理解为一种固定大小的线性序列,支持读块 k 和写块 k 的操作。假设没有文件系统,用户必须手动进行以下的管理:
- 记录数据存储在磁盘的哪些块中。
- 记录哪些块是空闲块。
- 避免在存取数据的过程中误操作其他用户的数据块。
假设每次用户在存储数据的过程中都要进行以上步骤的判断,从访问的效率和相应的时间来看,用户肯定是接受不了的,所以文件系统的出现了,概况下来文件系统解决了如下一系列问题:
- 如何找到信息。
- 如何知道哪些块是空闲的。
- 如何防止一个用户读取另一个用户的数据。
- ……(待补充)
1.2 什么是文件系统
文件系统:是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易,文件系统使用文件和树形目录的抽象概念代替了硬盘和光盘等物理设备使用数据块的概念,用户使用文件系统来保存数据不必关系数据实际保存在硬盘的地址为多少的数据块上,只需要记住文件的所属目录和文件名。
说明:
-
以上这段文件系统的定义摘自维基百科
-
概念类的知识点,总是很难记住,所以让我们换一种方式,重新理解一下文件系统。
xx 管理系统,比如学生管理系统,大部分人的第一反应就是用来管理学生的系统,输入唯一学号,可以用来查找该同学所属的学院、班级等基本信息。按照这个思路来理解一下文件管理系统 ,管理两种数据文件和目录;输入文件名,能够查找到该文件的基本信息和文件存储的内容;输入目录名,能够查询到该目录下所有的文件。
1.3 文件的基本信息
1.3.1 文件属性
文件的属性信息,又称为元数据(metadata),在不同系统中有差别,以下列举了常用的属性信息:
属性 | 含义 |
---|---|
权限 | 谁可以存取文件,以什么方式存取文件 |
口令 | 存取文件需要的口令 |
创建者 | 创建文件者 |
标志类信息 | 只读、隐藏、系统、存档、ASCII/二进制、随机存取、临时、加锁等标志信息 |
关键字类信息 | 记录长度、键的位置和键的长度用于关键字查找记录的文件中 |
创建时间 | 文件创建日期和时间 |
最后一次存取、修改时间 | 文件上一次存取、修改的日期和时间 |
当前大小 | 文件的字节数 |
最大长度 | 文件可能增长到的字节数 |
1.3.2 文件类型
很多操作系统支持多种文件系统类型。如 UNIX 和 Windows 中都支持普通文件和目录。UNIX还支持特殊文件——输入输出设备
特殊文件
- 字符特殊文件——按照字节流方式有序访问的数据
- 与输入/输出有关,用于串行 IO 类设备,如终端、打印机、网络等。
- 块特殊文件——可以随机访问的数据
- 磁盘类设备。
普通文件和块特殊文件的区别?
块特殊文件是物理寻址空间,普通文件是块设备的虚拟地址寻址空间,普通文件比块设备文件多一层文件系统的地址转换机制。
1.4 目录基本信息
文件系统提供目录(文件夹)用于记录文件,在很多系统中目录本身也是文件。目录的形式包括单层目录和层次目录系统。
2. 设计文件系统
背景知识终于啰嗦完了,现在让我们根据上述的要求,先自行设计一个简单的文件系统。
需求: 磁盘是块存储设备,所以文件系统要做的工作就是完成文件(或者目录)和磁盘上数据块之间的映射关系。
2.1 文件的存储
2.1.1 链表分配
为每个文件构造一个磁盘块的链表,每个块的第一个字作为指向下一个块的指针,块的其他部分存放数据。如下图所示:
缺点:
- 随机存取缓慢
- 指针占用一个字节,导致每个磁盘块存储的数据不再是 2 的整数次幂,程序按照 2 的整数次幂读写磁盘时会带来额外的开销
2.1.2 文件分配表(FAT)
仔细分析一下上一种分配的弊端,主要每个数据块中都要记录下一个块的指针导致的,如何能将这部分统一抽离出来呢?
取出每个磁盘块的指针地址,将它存储在内存中的文件分配表中。
缺点:
-
必须把整个表都放在内存中。
对于 128 G 的磁盘和 1KB 大小的块,这个表需要 1.28 亿项,每一项至少要有 3 - 4 字节这张表要占用 312 MB - 512 MB 的内存,对于大磁盘而言不太适用。
2.1.3 i 节点
仔细分析一下上一种方式的弊端,主要是在只需要读取 A 文件的内容情况下,也必须要把 B 文件地址分配的信息加载进来,尝试进行一下优化呗!
将文件属性和文件块的磁盘地址存储在一个 i 节点(index node),给定 i 节点就能找到所有文件使用的磁盘块地址。
优点:
-
跟 FAT 不同,此处使用的内存大小正比于系统中同时打开的文件数量,跟磁盘的大小无关。
-
i 节点中只能存储固定数量的磁盘地址,达到上限后怎么处理?
做二级索引呗,磁盘块索引的索引 -> 磁盘块索引 -> 磁盘块地址。
2.2 目录的存储
目录的主要功能是能根据文件路径找到该文件存储的磁盘地址。目录中存储一个固定大小的目录项列表,每个文件对应一项,其中包含文件名(固定大小)和文件属性结构。以 i 节点为例,某个包含 games、mail、news、work 文件的目录存储结构如下图所示:
问题1:文件名的长度是可变的,那是否需要为每个文件的文件名预留最长文件名大小的存储空间?
答案:不需要,设计的时候可将目录项设计固定长度,将文件名放置在目录后面的堆中,存储结构如下图:
问题2:思路下软连接和硬链接的区别?
答案:跟文件存储路径和 i 节点有关。
2.3 总结
操作系统针对处理器的概念建立了进程的抽象,针对物理存储器的概念建立了进程(虚拟)地址空间抽象,同样针对磁盘的概念建立了文件系统的抽象。
3. 文件系统实现
为了防止出现看过这么多遍文件系统,仍出现被问起来两眼一黑的情况,让我们看一个VSFS (very simple file system) 如何组织的例子。
注: VSFS 是一种 UNIX 文件系统的组织方式。
3.1 划分磁盘
假设现在存在一个 256 KB 大小的磁盘,按照每个磁盘块 4KB 的大小划分后,会得到如下图所示的结构:
3.2 增加索引结构
- 将 8 - 63 划分为data block(用于存储用户数据)
- 将 3 - 7 划分为 meta block(用于存储文件的基础信息,包括文件名称和属性等信息,文件系统抽象出 inode 数据结构用于存储该类信息)
- d 代表 data bitmap,用于记录 data block 空闲和使用情况
- i 代表 inode bitmap,用于记录 inodes 中空闲和使用情况
- S 代表 super block, 用于记录 inodes 节点的起始位置以及个数, data block 的起始位置和个数,以及文件系统的版本等其他的信息
4. 问题思考
写了好久终于写到最后一个步骤,以上总结包含了我的个人理解,难免有偏差,如有发现欢迎指出,最后想几个思考问题。
- 读取文件之前是否一定要打开文件?
- 打开文件的过程中进行了哪些映射过程?
- 什么是日志文件系统?