磁盘的逻辑单元为块
,内存和磁盘之间的I/O传输以块
为单位执行。
磁盘的特点
原地重写
,可以从磁盘上读一块儿,修改该块,并将它写回到原来的位置直接访问磁盘上的任意一块
。因此,可以方便地按顺序或随机访问文件文件系统需要提供高效快捷磁盘访问,以便轻松存储、定位、提取数据。即存储文件、访问文件
文件系统有两个不同的设计问题
数据结构和算法
,把逻辑文件系统映射到物理外存设备文件系统本身通常由许多不同层
组成。每层实际利用更低层功能,创建新的功能,以用于更高层的服务。
设备驱动程序
可以作为翻译器,他的输入作为高级指令,输出由底层的、硬件特定指令组成。
基础文件系统
只需向适当设备驱动程序发送命令。
逻辑文件系统通过文件控制块
维护文件结构。
文件控制块(FCB)
包含有关文件的信息,包括所有者、权限、文件内容的位置等。
大多数操作系统支持多种不同的文件系统,举例:
在磁盘上,文件系统包括的信息有
上述许多结构会在之后详细讲述。这里简述如下:
引导控制块
(每个卷):可以包含从该卷引导操作系统的所需信息。如果磁盘不包括操作系统,则这块的内容为空。UFS称为引导块(boot block),NFS称为分区引导扇区(partition boot sector)卷控制块
(每个卷):包括卷的详细信息(分区的块数、块的大小、空闲块的数量和指针、空闲唯一的标识号
,以便与目录条目相关联内存中的信息用于管理文件系统并通过缓存来提高性能,这些数据在安装文件装系统时被加载,在文件系统操作期间被更新,在卸载是被卸载。这些结构类型包括:
每个进程的打开文件表
:包括一个指向系统的打开文件表中合适条目的指针和其他信息整个系统的打开文件表
:包括每个打开文件的FCB副本和其他信息创建一个新文件
3. 应用程序调用逻辑文件系统。逻辑文件系统指导目录结构的格式,它会分配一个新的FCB
4. 系统将相应的目录信息读入内存
5. 更新目录结构和FCB
6. 将结果写回磁盘
一旦文件被创建,就能用于I/O,不过,首先他要被打开。系统调用open()将文件名传到逻辑文件系统,系统调用open():
Open() 返回值
:文件描述符是一个非负整数。它是一进程打开文件表的索引值,指向系统范围内打开文件表相应条目
操作系统如何才能将多个类型的文件系统集成到目录结构中?用户如何在访问文件系统空间时,可以无缝地在文件系统类型间迁移?大多数操作系统采用面向对象的技术来简化、组织、模块化实现。
数据结构和程序用于隔离基本的操作系统调用的功能与实现细节。因此,文件系统的实现有三个主要层构成。
第一层为文件系统接口。
第二层为虚拟文件系统(VFS)
,把文件系统的通用操作和具体实现分开
,虚拟文件系统提供了在唯一标识一个文件的机制。VFS基于vnode 的文件表示结构,它包含了一个数值标识符来唯一表示网络上的一个文件。
采用文件名称和数据块指针的线性列表
哈希表根据文件名得到一个值,并返回一个指向线性列表中元素的指针
每个文件在磁盘上占有一组连续的块。 文件的连续分配可以用文件第一块的磁盘地址和连续块的数量(即长度)来定义
连续分配支持顺序访问和直接访问
问题:当文件需要扩展,文件大小变大时会无法扩
展
解决:找更大的连续空间,复制过去
基于扩展的连续分配方案
用以下参数来定义文件
定义格式:
文件【开始地址,块儿数,指向下一个扩展块的指针】
每个文件是磁盘块儿的链表,磁盘块分布在磁盘的任何地方,文件有起始块和结束块来定义
定义格式:【起始块,结束块】
同时,每个磁盘块都有指向下一个磁盘块的地址。
链接分配的一个重要变种是文件分配表
每个卷的开始部分用于存储文件分配表(File Allocation Table),表中每个磁盘块都有一个FAT条目,并可通过块号索引。(未使用的块为0,使用的块包含下一个块儿号)
目录条目含有文件首块号码,通过这个块号索引的FAT条目包含文件下一块的号码,这个链会继续下去,直到最后一块,最后一块的表条目值为文件结束值。
通过将所有指针放在一起,即索引块
文件用索引块来定义, 每个文件有其索引块。
这里有一个问题,索引块应为多大
?
每个文件必须有一个索引块,因此索引块应尽可能小,然而必能太小,否则放不下足够多的指针,为处理这个问题,有如下一些机制:
空闲空间表实现为位图, 或位向量,每块用一位(bit)表示。1表示块空闲;0表示块已分配
所有空闲块用链表链接起来,并将指向第一个空闲块儿的指针保存在特殊位置,同时缓存在内存。
每个块儿含有下一个块儿的指针
将n个空闲块的地址保存在第一个空闲块中。
这些空闲块中的前n-1个为空,而最后一块包含另外n个空闲块的地址。
比链表好的是
空闲块的地址可以很快找到,而且可以明确一段连续
空闲块空间
基于以下事实:
通常有多个连续块需要同时分配或释放,尤其是在使用连续分配时。因此记录
磁盘地址
和数量
磁盘空间的有效使用(效率),取决于
改善性能的方法:缓存
内存映射调用需要使用两个缓存
,即页面缓存和缓冲区缓存。内存映射先从文件系统中读入磁盘块,并放入缓冲区缓存,由于虚拟内存系统没有缓冲区缓存接口,缓冲缓存内的文件必须复制到页面缓存中。采用统一缓冲缓存
统一缓冲缓存:统一使用缓冲器缓存来缓存进程页和文件数据。
无论是缓存块还是页面都有置换问题
,
文件的读入或写出一般是按顺序进行
。所以,不适
合采用LRU算法,因为最近使用的页面最后才会用甚至根本不会再用。
顺序访问可以通过马上释放
和预先读取
来加以优化
目录信息一般事先保存在内存中以加快访问,有时会导致目录结构中的数据和磁盘块中的数据不一致。
解决:
基于日志结构
的文件系统