文件系统的概念
文件与文件系统
文件系统:提供数据存储和访问功能。
文件:字节序列组成的数据项集合,文件系统的基本单位,文件名是标识符号
- 文件属性:名称、类型、位置、大小、保护、创建者、创建时间等。把文件的信息分成两部分,文件头是文件系统元数据中的文件信息,文件存储位置和顺序。
文件系统的功能
分配文件磁盘空间
管理文件块
管理空间控件
分配算法,磁盘上有很多空间块,如何选择空闲块
管理文件集合
定位:通过文件名找到内容
命名:通过名字找到文件
文件系统结构:文件的组织方式
数据可靠与安全
可靠:持久保存文件并在系统崩溃时恢复
文件描述符
操作系统内核跟踪进程打开的文件,维护了一个打开文件表,文件描述符是打开文件的标识
文件的读写是以数据块为单位,即使你只读一个字节
打开文件表打开文件的状态信息
文件指针:最近一次读写位置,每个进程分别维护自己的打开文件指针。
文件打开计数:当前打开文件打开的次数,最后一个进程关闭这个文件指针后,这个文件就可以被从打开文件表中移除。
文件的磁盘位置:缓存文件的位置,下次就可以省事了
访问权限:可读可写?
程如何访问文件
顺序访问:按字节依次读取
随机访问:从中间读写,不常用,如虚拟内存中把内存也存储在文件中。
索引访问:通常不提供,数据库是建立在索引内容上的磁盘访问。
文件内部结构
无结构:单词、字节序列
简单记录结构:分列、固定长度或可变长度
复杂结构:格式化文档或者可执行文件等,操作系统并不关心
访问控制
访问模式分为:读、写、执行、删除、列表信息等
文件访问控制列表(ACL)指明了文件实体和权限的关系
目录
目录也是一种特殊的文件,这个特殊文件中存的内容是文件的索引表,一个索引是文件名+文件指针,
目录组织
线性表(早期),但是如果检索和增删比较耗时;
哈希表可以减少目录搜索时间,且目录表中的每一项长度都相同。
目录的循环
只允许到文件的链接,不允许在子目录的链接
增加链接时用循环检测算法进行检测
限制向下查找的深度(实际炒作系统用的方法)
文件别名
硬链接:可以理解为引用
软链接:可以理解为指针
文件系统种类
磁盘文件系统:文件存储在数据存储设备中(如磁盘)。主要有FAT,NTFS,ext2/3等。不同文件系统对文件的优化不同。
数据库文件系统:文件特征是可被检索的,如WinFS
日志文件系统:记录文件系统的修改和事件,对文件的操作是原子性的
网络/分布式文件系统:如NFS、SMB、AFS、GFS。
虚拟文件系统
概念
虚拟文件系统基本数据结构:
这些数据结构都是持久的存储在外存中的
文件卷控制块
每个文件系统一个
文件系统的详细信息
提供了块、块大小、空余块等信息
文件系统挂载时进入内存
文件控制块(inode)
每个文件一个
提供了文件的详细信息
访问权限,拥有者,大小,数据块位置等
访问文件时进入内存
目录项:
每个目录项一个
目录项数据结构及树形布局编码成树形数据结构
指向文件控制块、父目录、子目录等。
在遍历一个文件路径时加载
文件缓存和打开文件
两种缓存机制:
数据块缓存,每次读一个块时先看这个缓存中有没有。和虚拟存储隔离开。
页缓存:统一缓存数据块和内存页。把文件缓存到虚拟页中,可能导致缺页和设置成脏页。
打开文件的数据结构
文件描述符
打开文件表
每个进程有一个打开文件表、系统也有打开文件表
有文件被打开的时候,文件卷就不能被卸载
文件锁
分为两种机制,强制、劝告(linux)
文件分配
连续分配
文件头指定了起始块和长度。最先匹配,最佳匹配等。
优点:文件读取表现好,高效的顺序和随机访问。
缺点:文件增长不方便,可以预分配或者按需分配。
链式分配
文件以数据库链表的方式存储。每个块中包含指向下一个块的指针
优点:优点是创建、增大、缩小方便,且没有碎片,
缺点:无法实现真正的随机访问,且破坏一个块,则后边的数据就都丢了。
索引分配
先分配一个索引块,说明哪些块里存了这个数据,即文件数据块的指针列表
优点:是创建、增大、缩小很简单,没有碎片,支持直接访问;
缺点:文件小,浪费一个索引块;文件大,需要多个索引块。
空闲空间管理
位图
可以使用位图,Di=0表明数据块i是空闲的,否则是已分配的。
使用简单但是可能是一个很大的向量表。
链式索引法
第一个块是空闲块的索引,指向空闲块。
冗余磁盘阵列RAID
多磁盘管理
多磁盘可以改善吞吐量(通过并行),通过冗余提高可靠性和可用性
实现方法
操作系统内核的文件卷管理
硬件的RAID控制器。
RAID控制器
RAID-0:磁盘条带化,特点并行。每个磁盘放着一个文件的不同部分,多磁盘同时读写
RAID-1:磁盘镜像,特点提高可靠性,和读的效率。多个磁盘上放着一模一样的文件,可多个同时读。
RAID-4:在RAID-0的基础上加了一个校验磁盘,可实现单个磁盘的错误恢复
RAID-5:在RAID-4的基础上把校验和分散在不同磁盘上,消除了校验磁盘的读写压力
RAID-6:两个校验磁盘,可以恢复两个磁盘错误