1、基本概念
文件系统: 一种用于永久性存储的系统抽象;
文件系统的功能包括以下三个:
分配文件磁盘空间,包括管理文件块,管理空闲空间和分配算法
管理文件集合,包括定位文件及其内容,命名:通过名字找到文件的接口,最常见:分层文件系统和文件系统类型(组织文件的不同方式)
提供遍历及特征,包括保护:分层来保护数据安全;可靠性/持久性:保持文件的持久,即使发生崩溃,媒体错误,攻击等
文件: 文件系统中一个单元的相关数据在操作系统中的抽象;
文件属性: 名称、类型、位置、大小、保护、创建者、创建时间、最近修改时间… …
文件头: 在存储元数据中保存了每个文件的信息,保存文件的属性,跟踪哪一块存储块属于逻辑上文件结构的哪一个偏移… …
文件描述符: 操作系统为每一个进程维护一个打开文件表,一个打开文件描述符是这个表中的索引;
文件元数据信息: 包括文件指针,指向最近一次读写的位置,每个打开了这个文件的进程都指向这个指针;文件打开次数,记录文件打开的次数,当最后一个进程关闭了文件时,允许将其从打开文件表中移除;文件磁盘位置,缓存数据访问信息;访问权限,每个程序访问模式信息;
目录: 目录是一类特殊的文件,文件以目录的方式组织起来,每个目录都包含了一张表<name, pointer to file header>。早期的文件系统是扁平的,只有一层目录;现在由于文件较多的缘故,目录和文件是一种树型结构,如下图所示,采用层次化命名空间:
文件别名: 两个或者多个文件名关联同一个文件,具体实现方式有以下两种:一种是硬链接,多个文件项指向一个文件;另外一种是软连接,以“快捷方式”指向其他文件;
文件系统种类: 常见的文件系统种类包括以下几种: 磁盘文件系统,文件存储在磁盘上,例如FAT,NTFS,ext2/3,ISO9660等;数据库文件系统,文件根据其特征可是可以被寻址(辨别)的,例如WinFS;日志文件系统,记录文件系统的修改/事件,例如journaling file system;网络/分布式文件系统,例如:NFS,SMB,AFS,GFS等;特殊/虚拟文件系统。
2、虚拟文件系统
由于不同的系统下底层对于文件的处理方式不同,所以通过一个上层虚拟(逻辑)文件系统来访问特定文件系统的模块,这样应用程序就可以通过简单调用想同的API来实现不同系统下的文件操作,有利于程序的跨平台移植。
3、数据块缓存
由于对于硬盘的访问和对内存的访问速度相差好几个量级,所以会将某些经常需要访问的信息从硬盘读到内存中来,提高访问速度。
数据缓存的方式有以下两种:数据块按需读入内存;数据块使用后被缓存;下面是两种数据块缓存方式:普通缓冲区缓存和页缓存。
4、打开文件的数据结构
打开文件描述: 每个被打开的文件一个;文件状态信息;目录项,当前文件指针,文件操作设置等;
打开文件描述: 一个进程一个;一个系统级的;每个卷控制块也会保存一个列表;所以如果有文件被打开将不能被卸载;
5、文件分配
大多数文件都很小,需要对小文件提供强力的支持,快空间不能太大;一些文件非常大,必须支持大文件(64-bits)文件偏移,大文件访问需要相当高效。常见的分配方式有:连续分配、链式分配和索引分配等;衡量分配方式好坏的指标有是否高效(如储存利用,外部碎片数量)和访问速度等。
5.1 连续分配
文件头指定起始块和长度进行文件分配。这种分配方式的优势在于操作简单,文件读取的表现好,可以实现高效的顺序和随机访问。但是缺点也很明显,会造成较多的碎片,同时随着文件的增长会出现比较严重的效率问题,因为需要频繁进行空间挪移。
这种分配方式适合于只读文件的文件分配。
5.2 链式分配
文件以数据块链表的方式存储,文件头包含了第一块到最后一块的指针。这种分配方式的优点在于:创建,增大,缩小空间很容易,不会产生碎片;但缺点在于不可能进行真正随机的访问,同时可靠性比较差,某一个链断掉之后整个文件都会损坏。
5.3 索引分配
为每个文件创建一个名为索引数据块的非数据数据块,文件头包含了索引数据块;索引数据块是一个到文件数据块的指针列表;
这种分配方式的优点在于:创建,增大,缩小空间很容易,不会产生碎片;支持直接访问;但缺点在于:当文件很小时,存储索引的开销较大,同时需要采用多级索引块的方法处理大文件。
采用多级索引快的影响:会提高文件大小限制的阈值;可以动态分配数据块,文件扩展容易;小文件的开销会变小;只为大文件分配间接数据块,大文件在访问间接数据块时需要大量的查询。
6、 空闲空间列表
可以用位图表示空闲数据块列表:111111111011110010101111100001… …,如果i=0表明数据块i时空闲的,反之表示其已经分配。
在分配空间时需要对进行保护处理,不能先进行内存分配之后在向硬盘中的空间列表写入1,因为这样不安全,断电时可能造成内存已经分配了但是硬盘中的空闲空间列表中仍显示这块磁盘空间可用。
7、多磁盘管理-RAID
RAID是冗余磁盘阵列,利用多个并行的磁盘来增加吞吐量和可靠性和可用性。
RAID-5:每个条带有一个奇偶校验块,允许一个磁盘错误。
8、磁盘调度
在磁盘进行读取或者写入时,磁头必须定位在期望的磁道,并从锁期望的扇区的开始;
寻道时间:定位到期望的磁道所花费的时间;
旋转延迟:从扇区开始处到达目的出所花费的时间;平均旋转延迟时间=磁盘旋转一周时间的一半;
其中寻道时间占据总的时间的比例较大,所以应想办法尽可能减少磁头寻道时间。
8.1 FIFO调度
FIFO虽然容易实现,但是会导致磁头频繁移动,造成效率不高。
8.2 最短服务优先
选择从磁臂当前位置需要移动最少的I/O请求,总是选择最短寻道时间。但是会导致饥饿线性,访问具有不公平和不均匀性。
8.3 SCAN方法
磁臂在一个方向上移动,满足所有未完成的请求,直到磁臂到达该方向上最后的磁道,之后调换方向,也叫elevator algorithm。
改进scan方法称为c-scan方法,限制仅在一个方向上扫描;当最后一个磁道也被访问了之后,磁臂返回到磁盘的另外一端再次进行扫描。改进c-scan的方法称为c-look方法,磁臂会先到达该方向上最后一个请求处,然后立即反转。