Essential Requirements:
- 必须可以存放大量信息
- 信息可以持久存储,到进程结束
- 可以支持文件并发访问
Long-Term Information Storage
- 块状存储
- 磁盘
- 磁带
- 光盘
- 闪盘
- 块级别操作
- 读第i块
- 写第i块
File Concept
文件的属性
文件:一组有意义的信息的集合
大小
文件名
逻辑结构(内容):字节序列、记录序列、树
文件类型:二进制文件、ASCII文件。可执行文件、存档文件。
文件访问权限(保护信息)、文件
文件属性:如创建的时间和日期、文件大小等附加信息。
文件操作:Create、Delete、open、close、read、write、Append、Seek、Get Attributes、Set Attributes、Rename
文件物理结构:存放在块中
Directory Concept
Directory
文件夹,包含文件
一级目录系统
层次目录存储

文件多的情况下,就需要层次结构(目录树),通过这种方式,可以把文件以自然的方式分组。
树形目录结构不便于实现文件的共享,所以提出了无环图目录结构,可以用不同的文件名指向同一个文件,使得整个目录是一个有向无环图。
路径名
绝对路径名(absolute path name)
相对路径名(relative path name):与工作目录一同使用,可以不用绝对路径,而使用相对路径。(使用相对路径检索文件可以减少磁盘I/O操作)
工作目录(working directory)
目录操作
create、delete、opendir、closedir、readdir、rename
link(多个目录中出现同一个文件,增加了该文件i-node的计数器,有时称为硬链接。Hard link、symbolic link)
unlink(删除目录项)
目录实现
File Share & Protection
File System Implementation
文件系统的类型
- Traditional:ext2
- Newest:ext3、ReiserFS、IBM JFS、xfs
- Other UNIX:minix、ext、xiafs
- FAT-12、FAT16、FAT-32、VFAT、NTFS
文件系统布局
- 主引导记录(Master Boot Record,MBR):用来引导计算机,是引导块(boot block)
- 分区表(Partitions)
- 超级块(Superblock)包含文件系统所有关键参数,计算机启动时,或文件系统首次使用时,把超级块读入内存。
- i-node:是一个数据结构数组,每个文件一个。i-node说明了文件的方方面面信息。
文件的实现
连续分配
每个文件作为一连串连续数据块存储在磁盘上。每个文件都从一个新的块开始存放。
优点:
- 实现简单:记录每个文件只需记住第一块的磁盘地址和文件的块数
- 读操作性能好:单个操作就可以从磁盘上读出整个文件,只需要一次,之后就不再需要寻道和旋转延迟。
缺点:随着时间推移,磁盘会变得零碎
适用于CD-ROM这样的文件系统,所有文件大小事先知道,而且后续不会再改变
链表分配
每个块的第一个字作为指向下一块的指针,块的其他部分存放数据。
优点:可以充分利用每个磁盘块
缺点:
- 尽管顺序读文件非常方便,但是随机访问却相当缓慢(因为每次都要从文件的第一个块开始读)
- 由于指针占用了一些字节,所以每个磁盘块中存储数据的字节数不是2的整数次幂,降低了系统的运行效率。(因为有些程序以2的整数次幂读写磁盘块,所以要读出一个完整的块,就要从两个磁盘块中获取和拼接信息,就引发了额外的开销)
在内存中采用表的链表分配
取出每个磁盘块的指针字,把它们放在内存的一个表中,就可以解决上述链表分配的两个不足。
内存中这样一个表格称为文件分配表(File Allocation Table,FAT)。
缺点:必须把整个表都存放在内存中。
i-node
给每个文件赋予一个i-node(index-node)的数据结构,其中列出了文件属性和文件块的磁盘地址。
优点:只有在对应文件打开时,i-node才在内存中。如果每个i-node占有n个字节,最多允许k个文件同时打开,那么只需要在内存中提前保留n×k个字节。
i-node的实现:给i-node偏移量,算第几块
- 同样,要会根据多层索引、混合索引(上面这个i-node)计算出文件的最大长度
- 要能自己分析访问某个数据块所需要的读磁盘次数(每次读入下一级索引块都需要一次读磁盘操作,还要看看顶级索引块 是否已经调入内存)
目录的实现
目录入口:
- File Control Block,FCB 文件控制块
- Fixed-size Variable-size
目录中提供了查找文件磁盘块所需要的信息:
- 整个文件的磁盘地址(连续分配方案)
- 第一个块的编号(两种链表分配方案)
- i-node编号
目录项中长文件名
- 长文件名(a)方法,存在文件属性后面。缺点是有空位 & 在删除后会留下空隙,久而久之造成碎片复杂。
- 长文件名(b)方法,文件项存放指向文件名的指针,文件名存储在堆中,文件名不需要再从字的边界开始,堆中不会有空隙,但是需要有好多指针。
加快文件搜索
- 散列处理文件名,将文件名存放在散列表中。但是需要维护散列表,管理复杂。
将查找结果存入高速缓存,在查找之前,先看看高速缓存中有没有。
共享文件
共享文件的文件系统就是要给有向无环图(DAG),而不是一棵树。
硬链接(Hard link)
使用两个文件名指向同一个内部数据结构(i-node)来代表一个文件
i-node中维护一个计数器,用来统计连接到当前文件的连接数目。当数目为0时候才真正删除这个文件。
符号链接(symbolic linking)
是一类特殊的文件,这个文件包含了另一个文件的路径名(绝对路径or相对路径)
真正的文件所有者才有一个i-node的指针。当文件被删除的时候,符号连接找不到文件;而删除符号连接根本不影响该文件。
优点:能够跨越磁盘的界限,甚至可以命名在远程计算机上的文件
缺点:但是符号链接需要额外的开销,性能不如硬连接
虚拟文件系统

File System Management
Disk Space Management
块大小

根据文件系统中大量的文件大小,选择一个合适的块的大小,一般4KB?
记录空闲块
管理空闲块的方法
- 磁盘块链表:每个块中包含尽可能多的空闲磁盘块号
- 位图:n个块的磁盘需要n位的位图,空闲块用1表示,反之用0表示。
- 成组连接法
磁盘配额

系统管理员分给每个用户拥有文件和块的最大数量,操作系统确保每个用户不超过分给他们的配额
文件系统备份
物理转储:从磁盘0块开始,将全部的磁盘块按顺序输出到磁带上,直到最后一块复制完毕。
- 优点:简单、极为快速
- 缺点:既不能能跳过选定目录,也无法增量转储,还不能满足恢复个人文件的请求。
逻辑转储:从一个或几个指定的目录开始,递归地转储其自给定基准日期(例如,最近一次增量转储或全面系统转储的日期)后有所更改的全部文件和目录。
- 全部转储
- 增量转储
File System Reliability
文件系统一致性
块的一致性检查
文件的一致性检查
File System Performance
高速缓存(Block cache)
或者缓冲区高速缓存(buffer cache),可以减少磁盘访问次数,提高访问速度。
算法

同页面置换算法:FIFO算法、第二次机会算法、LRU算法。
块提前读
在需要用到快之前,提前将其写入高速缓存,从而提高命中率(局部性原理)
减少磁盘臂运动
把有可能顺序存取的块放在一起,最好放在同一个柱面上,从而减少磁盘臂的移动次数。
- i-node 放在磁盘的开始块
- 把磁盘分为柱面组,每个组有自己的块和i-node(这样快)
File System Cases
例子,先不看了。
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!