- Prerequiste: 磁盘的结构和工作原理
- 为什么要引入文件系统?
在大容量magnetic disk出现之前,数据和程序都是存储在磁带上,那时还没有文件的概念。当大容量的磁盘出现了以后,需要将数据或者程序存储在磁盘上。如果没有文件,我们只能自己管理数据在磁盘上的位置。例如一个程序或者数据被分成若干个子块,每个子块都分布在磁盘的不同的位置,读取一个数据时,要手动地逐个读取每个子块才能获取完整的数据。这样就显得非常麻烦,尤其是当文件被增删改查的时候,管理磁盘空间就变得非常繁琐。
有了文件这个虚拟化概念以后,这个文件就是逻辑的存储单元,是一组相关的数据的集合。这样有了文件以后,用户可以直接通过文件来访问数据,OS封装了所有对磁盘的操作。 - 文件系统
文件系统是对文件的管理系统。文件系统应该具有以下功能:
- 按照文件名查找文件
- 通过文件的逻辑地址找到磁盘上的物理地址
- 文件的读写
- 安全访问
- 文件占用的磁盘空间的分配与回收
文件系统与内存管理系统比较
- 都是管理空间,分为连续存储和不连续存储
- 将一个进程的空间分页存储在memory,用一个页表保存逻辑页到物理页的映射关系
- 文件系统将一个文件分块存放于外存,文件控制块包含文件定位信息。
文件的结构
- 流式文件: 文件被OS视为字节流,各个字节的意义有使用文件的程序解释
- 记录式文件:由OS解释记录
文件的(逻辑)访问方式
- 顺序访问: 程序依次访问文件的内容
- 直接/随机访问: 程序访问文件,依据每个文件的逻辑位置,进行访问
文件的物理存储
- 磁带: 顺序存储
- 磁盘: 直接/随机存储。文件可以连续、链表式或者随机存放(需要通过类似页表的索引结构访问)。将磁盘等分成物理块(block),利于文件不连续存放(类似将内存等分成页),提高了磁盘空间的利用率。
- 顺序结构
- 链式结构:易于扩展,不利于随机访问
- 索引结构:文件不连续存放,用一个索引表定位文件块的物理地址(类似于内存的页表)。
- 多级索引:解决索引表过大的问题
文件控制块(FCB)(类似PCB?)
描述文件的数据结构,包含:
- 文件名
- 创建者
- 文件物理位置信息
- 权限
文件目录(directory)
利用文件名找到对应文件控制块(难道用的是类似java里的TreeMap? 排序Map?)
- 一级目录
- 二级目录
- 树形目录
- 无环图目录(可能一个文件属于不同的目录)
空闲磁盘空间管理
- bitmap: 0-空闲,1-占用
- 空闲块成组链接