文件系统作用:
- 能够存储大量信息
- 使用信息的进程终止时,信息仍然存在
- 必须能使多个进程并发存取有关信息
文件
文件一种抽象机制,提供了一种在磁盘上保留信息而且以后方便读取的方法。
-
文件命名
文件具体的命名规则在各个系统中是不同的,不过所有的现代操作系统都允许用1至8个字母组成的字符串作为合法文件名。通常文件名中也允许有数字和一些特殊字符。许多文件系统支持长达255个字符的文件名。
有的文件系统区分文件名大小写,有的不区分。UNIX是前一类,MS-DOS是后一类。
文件扩展名用于表示文件的某些信息。在某些操作系统(如UNIX)只是有一种约定,不限制使用;在某些操作系统(如windows)则赋予扩展名含义,可以在操作系统中注册扩展名。
-
文件结构
-
字节序列
- 操作系统所见的就是字节,任何含义只在用户程序中解释。
- Unix和Winodws都是用这种方式。
-
记录序列
- 约定固定字节为一记录
- 读写以记录为单位
- 现在已不使用
-
树
-
类似B树
-
-
-
文件类型
- 块特殊文件
- 用于磁盘设备
- 字符特殊文件
- 用于串行I/O设备,如打印机,网络等等
- 目录
- 用于管理文件系统结构的系统文件
- 普通文件
- ASCII文件
- 由多行正文组成
- 每行由回车符或换行符结束(取决于操作系统)
- 优势:可以显示和打印
- 使用公认的标准(ASCII码),可以更易于实现进程间通信
- 二进制文件
- 单纯的二进制序列
- 内部结构由使用该文件的用户程序来解释
- 例子如下:
- ASCII文件
- 块特殊文件
-
文件存取
- 顺序存取
- 从头开始按顺序读取文件的全部字节
- 随机存取
- 用seek操作设定当前位置后在进行顺序读取。
- 顺序存取
-
文件属性
目录
-
层次目录系统
-
几乎所有现代文件系统都是用这个方式组织的
-
-
路径名
- 绝对路径
- 以分割符开头
- 相对路径
- 从工作目录开始
-
"."代表当前目录,".."代表父目录。
- 绝对路径
文件系统实现
- 文件系统布局
文件系统存在于磁盘。磁盘划分为一个或多个分区,每个分区都有一个独立的文件系统。
磁盘的0号扇区是主引导记录(Master Boot Record,MBR);MBR之后是分区表,记录每个分区的起始和结束地址。
-
在计算机被引导的时候
- BIOS读入并执行MBR。
- MBR做的第一件事是确定活动分区,读入它的第一个块,叫做引导块(boot block),并执行之。
- 引导块中的程序将装载该分区中的操作系统。
- 为了统一起见,所有分区的开始都是引导块,即使没有操作系统。
文件的实现
记录各个文件分别用到了哪些磁盘块
- 连续分配
把文件作为连续的数据块记录在磁盘上
优点:实现简单,只需记录文件的磁盘地址和文件的块数;读操作性能好,因为数据块连续分配,只有一次寻道和旋转延迟。
-
缺点:易产生磁盘碎片。
解决方法:- 磁盘压缩;代价太大
- 维护一个空闲块链表;需要知道文件的最终大小
-
链表分配
使用链表记录磁盘块
优点:可以充分利用磁盘块,不会产生磁盘碎片
-
缺点:随机读取慢,需要遍历整个链表
-
内存中采用链表分配
将链表的指针取出来,组成一个数组(文件分配表,FAT),放在内存。
优点:遍历链表无需产生磁盘I/O,随机读取更快。
-
缺点:表放在内存,占用太多空间,不适合大磁盘。
-
i节点
给每个文件分配一个i节点,其中列出了文件属性和文件块的磁盘地址。
只有对应文件打开,i节点才在内存。
-
FAT大小取决于磁盘块的数量,而i节点的大小仅仅取决于文件所占磁盘块的数量,所以占内存大小大大减小了。
目录的实现
-
打开文件时,操作系统根据用户给出的路径名找到相应的目录项,目录项提供了查找文件磁盘块所需要的信息。
该信息可能是整个文件的磁盘地址,或i节点。
如下图:
-
现代操作系统大多支持可变的可变长度的长文件名,实现方法有下面三种:
- 最简单的固定一个255字节的文件名,很浪费空间不考虑。
- 保存每个文件名的长度。如下图a
-
在堆中存储文件名,目录项保留指向文件名的指针。如下图b
-
查找文件名
- 使用散列表
- 查找速度快
- 需要维护散列表,管理复杂,所以只有在文件数量大的目录项才使用
- 使用高速缓存
- 只有访问集中在少量的文件才有效。
- 使用散列表
共享文件
-
硬链接
目录指向i节点,并计数
只有当计数被置为0的时候,才真正被删除。
-
软连接(符号连接)
- 创建一个类型为LINK的文件,并把该文件放在B下。
- 里面存储了实际的 连接文件位置
- 访问文件,需要额外的开销
- 创建一个类型为LINK的文件,并把该文件放在B下。
日志文件结构系统
- 因为高速缓存的存在,对磁盘的读操作比较少,写操作比较多。
- 磁盘的写操作耗时大,存在寻道和旋转延迟。
- 对磁盘的写操作大多是零散的。
由于上面的三个原因,发展出了日志文件结构系统,将零散的写操作记录在日志中,每隔一段时间再统一进行磁盘写操作,节省寻道和旋转延迟。
日志文件系统
- 将磁盘操作写入日志中,当系统崩溃再启动时,根据日志运行所有未完成的操作。
- 写入磁盘的操作必须是幂等的,即无论重复多少次,结果都不会变。
虚拟文件系统
- 使用虚拟文件系统(VFS)将多个文件系统整合到一起。
- 只要一个文件系统提供了VFS的功能调用接口,就可以整合到VFS。