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