一、文件系统和文件
文件系统是一种用于持久性存储(掉电也不会丢失😉)的系统抽象。操作系统中管理持久性数据的子系统,提供数据存储和访问功能。大多数计算机系统都有文件系统,Google 也是一个文件系统。
文件是具有符号名,由字节序列构成的数据项集合。文件系统的基本数据单位,文件名是文件的标识符号。
二、文件系统的功能
(1)分配文件磁盘空间
- 管理文件块(位置和顺序)
- 管理空闲空间(位置)
- 分配算法 (策略)
(2)管理文件集合
- 定位:文件及其内容
- 命名:通过名字找到文件
- 文件系统结构:文件组织方式
(3)数据可靠和安全
- 安全:多层次保护数据安全
- 可靠
持久保存文件
避免系统崩溃、媒体错误、攻击等
文件属性
名称、类型、位置、大小、保护、创建者、创建时间、最近修改时间等。
文件头:文件系统元数据中的文件信息
- 文件属性
- 文件存储位置和顺序
三、文件描述符
是个整型,是操作系统在打开文件表 j中维护的打开文件状态和信息j。
- 需要元数据数据来管理打开文件
(1)文件指针:
指向最近的ws一次读写位置,每个进程分别维护最近的打开文件指针.
(2)文件打开计数⏱:
记录文件打开的次数。(文件是共享的,允许多个进程打开同一个文件。)当最后一个进程关闭了文件时,允许将其从打开文件表中移除。
(3)文件磁盘位置:
缓存数据访问信息。
(4)访问权限:
每个程序访问模式信息。
(磁盘访问的基本单位是扇区。)
(数据块是逻辑存储单元,而扇区是物理存储单元。)
操作系统需要了解进程如何访问文件,有以下访问方式:
(1)顺序访问: 按字节依次读取
大多数的文件访问都是顺序访问。
(2)随机访问:
从中间读写。不常用,但是仍然十分重要,
(3)基于内容访问:通过特征。
许多系统不提供此种访问方式,相反,数据库是建立在索引内容的磁盘访问上(需要高效的随机访问。)如:
文件内部结构
(1)无结构
单词、字节序列
… …
(2)简单记录结构
分列
固定长度
可变长度
… …
(3)复杂结构
格式化的文档(如 PDF)
可执行文件
… …
语义一致性
多个进程如何同时访问共享文件?使得访问高效、简洁。
Unix 文件系统(UFS)语义:
共享文件指针允许多用户同时读取和写入文件。
对打开文件的写入内容立即对其他打开同一文件的其他用户可见。
会话语义:写入内容只有当文件关闭时可见。
四、目录
目录是一类特殊的文件。
- 典型操作
搜索文件
创建文件
删除文件
重命名文件
遍历路径
操作系统应该只允许内核修改目录,确保映射的完整性,应用程序通过系统调用访问目录。
目录的实现可以用线性列表,包含了指向数据块的指针,编程简单、执行耗时;也可以用哈希表,减少目录搜索的时间,但是可能会有冲突——两个文件的哈希值相同。
挂载:
一个文件系统需要先挂载才能被访问。
一个未挂载的文件系统被挂载在挂载点(挂载点在用户看来是一个目录,这个目录比较特别,它代表文件系统根的起始位置。)上。
五、文件别名
文件别名:多个文件名关联同一个文件,即 一个文件有多个名字。
(1)硬链接: 多个文件项指向一个文件,文件是放在磁盘上的。
(2)软链接: 以 “快捷方式” 指向其他文件。通过存储真实文件的逻辑名称来实现,即 文件里的内容存的是另一个文件的路径名。
六、文件系统分类
- 磁盘文件系统
文件存储在存储设备上,如 磁盘。例如 FAT、NTFS、ext 2/3、ISO9600 等。 - 数据库文件系统
文件根据其特征可被寻址。 例如 WinFS。 - 日志文件系统
记录文件系统的修改 / 事件。如 journaling file system。 - 网络/分布式文件系统
例如:NFS、AFS、GFS。
网络意味着延迟大、不可靠、访问时间不可控等特点。
分布式客户端和客户端上的用户辩别起来很复杂,而且还有一致性的问题。 - 特殊/虚拟文件系统
七、虚拟文件系统 (VFS)
操作系统把复杂的东西抽象成简单的接口,提供给用户,这层接口就是 open、read、write 、close 等,通过虚拟文件系统 对所有不同文件系统进行抽象,
屏蔽底层具体文件系统的差异性。
- 文件系统基本数据结构
(1)文件卷控制块 (Unix: “superblock”)
包含文件系统详细信息,每个文件系统一个,包含块、块大小、空余块、计数/指针等。
(2)文件控制块(Unix: “vnode” or “inode”)
每个文件一个,包含文件详细信息,如访问权限、拥有者、大小、数据块位置等。
(3)目录项 (Linux: “dentry”)
每个目录项一个(目录和文件),将目录项数据结构及树型布局编码成树型数据结构,包括指向文件控制块、父目录、子目录等。
八、文件分配
- 连续分配
- 链式分配
- 索引分配
不展开讲了,详见数据库索引。