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