文章目录
第二十一讲:文件系统
21.1 文件系统概念
21.1.1 文件系统和文件
-
文件系统和文件概念
-
文件系统的功能
1.分配文件磁盘空间
管理文件块(位置、顺序);
管理空闲空间(只需要管理位置,不需要管理顺序);
分配算法/策略(类似于内存管理);
2.管理文件集合
定位:文件及其内容;
命名:通过名字找到文件;
文件系统结构:文件的组织方式
3.数据可靠和安全
安全:多层次保护数据安全;
可靠:持久保存文件。避免系统崩溃、媒体错误、攻击等; -
文件属性
21.1.2 文件描述符
-
打开文件和文件描述符
每个进程都有打开文件表=> 准确说是每个进程一个文件描述符表,每个表项指向打开文件表的一个表项,而打开文件表是所有进程共享的参考:csapp ;
打开文件数实际上远大于真正存在的文件数量;
文件描述符用于标志打开文件;
-
文件描述符的内容
操作系统在进程的打开文件表中维护打开文件的状态和信息,这些信息包括:
1.文件指针
每个打开文件一个指针指向上次读写位置;
每个进程分别维护自己的打开文件指针(同一个真实的文件,在不同进程中指针不同);
2.文件打开计数
当前打开该文件的次数;
最后一个进程关闭该文件时,将其从打开文件中移除;
3.文件的磁盘位置
记录文件在磁盘上的位置(会缓存数据访问信息到内存)
4.访问权限
每个进程的文件访问模式信息; -
文件的用户视图和系统视图
磁盘块(多个扇区构成)是文件的最小读写单位,而不是字节!!!
-
访问模式
=> 某种程度上说,文件系统是一个简单的小型文件系统 -
文件内部结构
总体来说,所谓文件内部结构,主要是对应用程序而言;对操作系统而言,文件只是字节序列而已(不过OS对可执行文件等少数文件内部结构提供接口!)
-
文件共享和访问控制
注意UNIX对语义一致性的处理
21.1.3 目录、文件别名、文件系统种类
- 分层文件系统
目录是特殊的文件,目录的内容是文件索引表
- 目录操作
- 目录的实现
即如何组织目录这个文件中的内容:
- 文件别名
注意区分软连接和硬链接!!!
硬链接会增加文件的引用计数;而软连接不会,它只是存储文件的路径
- 名字解析(路径遍历)
- 文件系统挂载
- 文件系统种类
目前个人的理解:以下各类文件系统,最终都需要依赖于操作系统的磁盘文件系统?
- 网络/分布式文件系统
21.2 虚拟文件系统
-
虚拟文件系统的位置
严格说来,VFS并不是一种实际的文件系统。它只存在于内存中,不存在于任何外存空间;
每个具体的文件系统都有自己的文件操作、数据结构。VFS 作为Linux内核中的一个软件层,用于给用户空间的程序提供文件系统接口,从而能在高层以统一的接口访问底层各种不同的文件系统
-
虚拟文件系统的作用
-
文件系统基本数据结构
1.文件卷控制块(superblock)
每个文件系统一个;
描述该文件系统的详细信息;
信息包含:块大小、空余块、计数、指针等…
2.文件控制块(vnode/inode)
每个文件系统;
描述该文件的详细信息;
信息包括:访问权限、拥有者、大小、数据块位置等…
3.目录项
每个目录项一个;
将目录项数据结构及树形布局编码成树形数据结构;
每个目录项包含指向文件控制块、父目录、子目录的指针等信息 -
文件系统的组织视图
-
文件系统的存储结构
-
文件系统的存储视图
21.3 文件缓存和打开文件(文件缓存难理解)
- 多种磁盘缓存位置
本节主要讨论内存中的数据块缓存
- 数据块缓存
如何理解下述两种数据块缓存方式???
- 数据块缓存
- 页缓存
- 打开文件是数据结构
- 打开文件表
这个打开文件表与csapp的表述不同,暂时以csapp为准!
- 打开文件锁
21.4 文件分配(对比内存分配)
- 文件大小
- 文件分配
实际应用中,通常是几种分配方式的组合!
- 连续分配
- 链式分配
- 索引分配
大文件的索引方式:链式索引块 或 多级索引块
- 文件分配示例:UFS多级索引分配
21.5 空闲空间管理(对比内存管理)
- 空闲空间管理
- 位图
- 其他方式
实际应用中,也是多种方式的组合
21.6 冗余磁盘阵列RAID
- 磁盘分区
- 一个典型的磁盘文件系统组织
一个磁盘可分为几个分区,每个有自己的文件系统;
也可以多个磁盘组成一个分区,对应一个文件系统;
- 多磁盘管理
- RAID 0:磁盘条带化
条带化:磁盘条带化是指利用条带化技术就是将一块连续的数据分成很多小部分并把它们分别存储到不同磁盘上去
- RAID 1:磁盘镜像
- RAID 4:带校验的磁盘条带化
- RAID 5:带分布式校验的磁盘条带化
校验和分布在多个磁盘上,而不是专门的校验磁盘
- RAID 6
- RAID 嵌套