文件系统
文件系统
1、是一种用于持久性存储的系统抽象,也就是断电后数据不会丢失
2、让用户组织、控制、导航、访问和检索数据
3、大多数的计算机系统包含文件系统
文件
1、具有符号名,由字节序列构成的数据项集合
2、是文件系统的基本数据单位
3、文件名是文件的表示符号
文件系统的功能
1、分配文件磁盘空间
(1)管理文件块(位置和顺序)
(2)管理空闲空间(位置)
(3)分配算法(策略)
2、管理文件集合
(1)查找:文件及其内容
(2)命名:通过标识符,定位文件接口
(3)常见:分层文件结构
(4)文件系统结构:组织文件的不同方式
3、数据可靠和安全
(1)可靠性 / 持久性:持久保存文件,避免错误和崩溃
(2)安全:多层次保护数据安全,减少攻击危害
文件和块
1、文件属性:名称、类型、位置、大小、保护、创建者、创建时间、最近修改时间等
2、文件头
(1)在存储元数据中保存了每个文件的信息
(2)保存文件的属性
(3)跟踪存储块对应逻辑上文件结构的偏移,即文件存储位置和顺序
文件描述符
1、文件访问模式
(1)f = open(name, flag):通过字符串的名字打开文件,返回一个整形的文件描述符 f
(2)read(f)
(3)close(f)
2、内核跟踪进程打开的所有文件
(1)OS 为每个进程维护一个打开文件表
(2)文件描述符是打开文件的标识
3、定义:OS 在打开文件表中维护的打开文件状态和信息
4、元数据
(1)文件指针:指向最近一次读写位置,每个进程分别维护自己的打开文件指针
(2)文件打开计数:记录文件打开的次数,最后一个进程关闭文件时,将其从打开文件表中移除
(3)文件的磁盘位置:缓存数据访问信息
(4)访问权限:每个进程的文件访问模式信息
视图
1、用户视图:持久的数据结构
2、系统视图
(1)字节序列的集合
(2)系统不关心存储在磁盘上的数据结构
3、OS 的文件视图
(1)建立映射:磁盘块 <-> 文件数据
(2)以字节单位读写数据,以扇区为单位读写磁盘
(3)数据块:逻辑存储单元,
(4)扇区:物理存储单元
4、用户视图 -> 系统视图
(1)进程读文件:获取字节所在的数据块,返回数据块内对应部分
(2)进程写文件:获取数据块,修改数据块中对应部分,写回数据块
5、文件系统中的基本操作单位是数据块
(1)如,getc()、putc() 即使每次只访问 1 字节的数据,也需要缓存目标数据 4096 字节
访问模式
1、顺序访问
(1)按字节依次读取
(2)大多数的文件访问都是顺序访问
2、随机访问
(1)从中间读写
(2)更加快速:不希望获取文件中间的内容的时,也必须先获取块内所有字节
(3)不常用,但仍然重要,例如,虚拟内存中把内存页存储在文件
3、索引访问
(1)依据数据特征索引
(2)通常 OS 不提供索引访问
(2)数据库是建立在索引内容的磁盘访问上
文件内部结构
1、无结构:单词、字节序列
2、简单记录结构
(1)分列
(2)固定长度
(3)可变长度
3、复杂结构:如,格式化文档,可执行文件
文件共享和访问控制
1、存在多用户系统
2、访问控制
(1)用户获取文件的访问权限不同
(2)访问模式:读、写、执行、删除、列举等
3、文件访问控制列表(ACL):<文件实体,权限>
4、Unix 模式
(1)三种不同用户的不同权限:<用户 | 组 | 所有人,读 | 写 | 可执行>
(2)用户标识 ID:识别用户,表明每个用户所允许的权限及保护模式
(3)组标识 ID:允许用户组成组,并指定了组访问权限
语义一致性
1、规定多进程 / 多用户如何同时访问共享文件
(1)与同步算法相似
(2)存在磁盘 I/O 和网络延迟,所以设计简单
2、Unix 文件系统(UFS)语义
(1)对打开文件的写入内容,立即对其他打开同一文件的其他用户可见
(2)共享文件指针允许多用户同时读取和写入文件
3、会话语义:写入内容只有当文件关闭时可见
4、读写锁
目录
1、文件以目录的方式组织起来
2、目录是一类特殊的文件
(1)目录的内容是文件索引表:<文件名, 指向文件的指针>
3、目录和文件的树型结构
(1)早期的文件系统是扁平的(只有一层目录)
4、典型目录操作,结合 OS 完成
(1)搜索文件
(2)创建文件
(3)删除文件
(4)枚举目录
(5)重命名文件
(6)在文件系统遍历一个路径
5、OS 应该只允许内核修改目录
(1)确保映射的完整性
(2)应用程序能够读取目录
6、目录设计
(1)文件名的线性列表,包涵了指向数据块的指针:编程简单,执行耗时多
(2)哈希表:减少目录搜索时间,哈希碰撞(文件哈希值相同),固定大小
7、名字解析 / 路径遍历
(1)把逻辑名字转换成物理资源
(2)步骤:依据路径名,在文件系统中找到实际文件位置,遍历文件目录直到找到目标文件
(3)例,"/bin/ls":读取 root 的文件头(在磁盘固定位置),读取 root 的数据块,搜索“bin”项,读取 bin 文件头,读取 bin 数据块,搜索“Is”顶,读取Is的文件头
(4)当前工作目录:每个进程都会指向一个文件目录用于解析文件名,提高遍历速度,允许用户指定相对路径来代替绝对路径
8、文件系统挂载
(1)不同的文件系统要挂在不同的目录下,来形成一个分层次的跨文件系统的访问
(2)挂载点:不同文件系统根目录的位置
(3)文件系统需要先挂载才能被访问
文件别名
1、两个或多个文件名关联同一个文件
2、硬链接:多个文件项指向一个文件
(2)删除存在硬链接的文件,需要删除所有硬链接
3、软链接:以“快捷方式”指向其他文件,通过存储真实文件的逻辑名称来实现
(1)删除存在软链接的文件,“快捷方式”成为空指针
4、引用技术实现硬链接
(1)Backpointers方案:每个文件有一个包含多个 backpointers 的列表,使用菊花链管理
(2)添加一个间接层(目录项数据结构):链接:已存在文件的另外一个名字(指针),链接处理:跟随指针来定位文件
5、如果有别名机制,就有可能出现潜在的循环
6、消除循环
(1)只允许到文件的链接,不允许在子目录的链接
(2)增加链接时,用循环检测算法确定是否合理
(3)限制路径可遍历文件自录的数量
文件系统种类
1、磁盘文件系统:文件存储在数据存储设备上,如磁盘
2、数据库文件系统:文件特征是可被寻址(辨识)的
3、日志文件系统:记录文件系统的修改 / 事件
4、特殊 / 虚拟文件系统
5、网络 / 分布式文件系统
(1)文件可以通过网络被共享
(2)文件位于远程服务器
(3)客户端远程挂载服务器文件系统
(4)标准系统文件访问被转换成远程访问
(5)标准文件共享协议:NFS for Unix,CIFS for Windows
(6)缺点:客户端和客户端上的用户辨别起来很复杂(NFS 是不安全的);读写一致性问题,安全可靠性,错误处理模式
虚拟文件系统
1、分层结构
(1)虚拟(逻辑)文件系统(VFS:Virtual File System)
(2)特定文件系统模块
2、目的:对所有不同文件系统做抽象,给上层提供接口
3、功能
(1)提供相同的文件和文件系统接口
(2)管理所有文件和文件系统关联的数据结构
(3)高效查询例程,遍历文件系统
(4)与特定文件系统模块的交互
4、数据结构
(1)卷控制块
(2)文件控制块
(3)目录节点
5、卷控制块
(1)每个文件系统一个
(2)文件系统详细信息:块、块大小、空余块、计数 / 指针等
(3)当文件系统挂载时进入内存
6、文件控制块
(1)每个文件一个
(2)文件详细信息:访问权限、拥有者、大小、数据块位置等
(3)当文件被访问时进入内存
7、目录节点
(1)每个目录项一个(目录和文件)
(2)将目录项数据结构及树型布局,编码成树型数据结构
(3)指向文件控制块、父目录、子目录等
(4)在遍历一个文件路径时进入内存
8、持续存储在二级存储中,分配在存储设备中的数据块中:硬盘头 -> 目录节点信息 -> 文件节点信息 -> 具体文件
数据缓存
1、把经常使用,或者经常访问到的数据,存储在内存的缓存中,提高下次访问的效率
2、多种磁盘缓存位置:磁盘 <-> 磁盘控制器:扇区缓存 <-> 内存:数据块缓存 <-> CPU
3、按需读入内存
(1)提供 read() 操作
(2)预读:预先读取后面的数据块
4、一旦使用数据,就缓存
(1)假设数据将会再次用到
(2)写操作可能被缓存和延迟写入
5、缓存方式
(1)数据块缓存
(2)页缓存:统一缓存数据块和内存页
分页缓存
1、结合分页机制和缓存机制
2、分页要求:当需要一个页时,才将其载入内存
3、虚拟页式存储:在虚拟地址空间中虚拟页面,可映射到本地外存文件(二级存储)中
4、文件数据块的页缓存
(1)在虚拟内存中文件数据块被映射成页
(2)文件的读 / 写操作被转换成对内存的访问
(3)可能导致缺页 / 脏页
5、页置换算法需要协调虚拟存储和页缓存间的页面数
打开文件的数据结构
1、打开文件描述符
(1)每个被打开的文件都有一个文件描述符
(2)文件状态信息:目录项、当前文件指针、文件操作设置等
2、打开文件表
(1)一个进程打开文件表
(2)一个系统的打开文件表
(3)有文件被打开时,文件卷就不能被卸载
3、文件锁:用于协调多进程的文件访问
(1)强制:根据锁保持情况和访问需求确定是否拒绝访问
(2)劝告:进程可以查找锁的状态来决定怎么做
文件分配
1、打开文件后执行写操作,对文件空间的增加 / 减少,文件位置进行分配
2、分配方式
(1)连续分配
(2)链式分配
(3)素引分配
3、指标
(1)存储效率
(2)读写性能
连续分配
1、以数组方式组织数据,文件头指定起始块和长度
2、分配策略:首次适配、最佳适配、最差适配
3、优点
(1)文件读取表现好
(2)高效的顺序和随机访问
4、缺点
(1)类似连续内存分配,产生内部碎片、外部碎片
(2)添加、删除、扩展,就会造成很大的开销
5、应用场景:只读光盘
连续分配
1、以链表方式组织数据,文件头包含了到第一块和最后一块的指针
2、优点
(1)容易添加、删除、拓展
(2)没有碎片
3、缺点
(1)串式访问的方式,无法实现真正的随机访问
(2)可靠性差,链被破坏数据容易丢失
索引分配
1、为每个文件创建一个索引数据块,指向文件数据块的指针列表,文件头包含了索引数据块指针
2、优点
(1)容易添加、删除、拓展
(2)没有碎片
(3)支持直接访问
3、缺点
(1)文件比较小时(甚至小于索引大小),存储索引信息的冗余会比较大
(2)文件比较大时,一个链式索引块不够,如果要扩增索引块,就退化到了数组的方式
4、UFS 多级索引分配
(1)文件头包含13个指针:前 10 个指针指向数据块,第 11 个指针指向索引块,第 12 个指针指向二级索引块,第 13 个指针指向三级索引块
(2)提高了文件大小限制阀值
(3)动态分配数据块,容易扩展文件
(4)小文件开销小
(5)只为大文件分配间接数据块,大文件在访问数据块时需要大量查询
空闲空间链表
1、OS 需要跟踪在存储中的所有未分配的数据块
2、用位图代表空闲数据块列表
3、Di = 0,表示数据块 i 是空闲,Di = i,表示数据块 i 已分配
4、使用简单但是可能会是一个大的很大向量表
5、假定空闲空间在磁盘中均匀分布,则找到“0”之前要扫描 n / r 次
(1)n = 磁盘上数据块的总数
(2)r = 空闲块的数目
6、读写不一致
(1)指向空闲列表的指针
(2)位图:必须保存在磁盘上,在内存和磁盘接贝可能有所不后,不允许 block[i] 在内存中的状态为 bit[i] = 1而在磁盘中 bit[i] = 0
(3)解决:在磁盘上设置 bit[i] = 1,分配 block[i],在内存中设置 bit[i] = 1
7、其余空闲空间组织方式:链表、链式索引
多磁盘管理-RAID
1、磁盘分区:通常磁盘通过分区来最大限度减小寻道时间
(1)分区是一组柱面的集合
(2)每个分区都可视为逻辑上独立的磁盘
2、分区:硬件磁盘的一种适合操作系统指定格式的划分
3、卷:一个拥有一个完整文件系统实例,且可访问的外存空间,通常常驻在磁盘的单个分区上
4、优点
(1)把数据放在独立的磁盘上,通过并行的工作,实现并行的数据访问,可以增大吞吐量
(2)通过冗余,在执行写操作的时候,对两个硬盘执行同样的写操作,如果一个硬盘崩了,第二个硬盘可以替换第一个,提高容错率、可靠性,写入代价增高
5、冗余磁盘阵列
(1)RAID:RedundantArray of InexpensiveDisks
(2)多种磁盘管理技术
6、冗余磁盘阵列的实现
(1)软件:文件系统之下,磁盘序列之上,OS 内核:储存 / 卷管理
(2)硬件:RAID 硬件控制器(I/O)
7、RAID 分类
常用级别 | 特点 | 硬盘及容量 | 性能及安全 | 典型应用 |
RAID-0 | 用于平行存储,即条带。其原理是把连续的数据分成几份,然后分散存储到阵列中的各个硬盘上。任何一个磁盘故障,都将导致数据丢失。 | 硬盘数:一个或更多 容量:总的磁盘容量 |
性能:读写性能高,随机写性能高 安全:无冗余,无热备盘,无容错性,安全性低 |
无故障的迅速读写,要求安全性不高,如图形工作站等。 |
RAID-1 | 镜像存储。其原理是把相同的数据分别写入阵列中的每一块磁盘中,最大限度的保证用户数据的可用性和可修复性。缺点是存储成本高。 | 硬盘数:两个或2*N个 容量:总磁盘容量的50% |
性能:读写性能低,随机写性能低 安全:利用复制进行冗余,有热备盘,可容错,安全性高 |
随机数据写入,要求安全性高,如服务器、数据库存储领域。 |
RAID-5 | 分布奇偶位条带。是一种存储性能、数据安全和存储成本兼顾的存储方案,也可理解为是RAID 0和RAID 1的折衷方案。其原理是把数据和相对应的奇偶校验信息存储到组成RAID5的各个磁盘上,并且奇偶校验信息和相对应的数据分别存储于不同的磁盘上。当RAID5的一个磁盘数据发生损坏后,利用剩下的数据和相应的奇偶校验信息去恢复被损坏的数据。相对于RAID 0,只是多了一个奇偶校验信息。多个数据可对应一个奇偶校验信息。 | 硬盘数:三个或更多 容量:(n-1)/n的总磁盘容量(n为磁盘数) |
性能:随机和连续写性能低,读性能高 安全:利用奇偶校验进行冗余,可容错,安全性高 |
随机数据传输要求安全性高,如金融、数据库、存储等。 |
RAID-10 | 镜像阵列条带。兼顾存储性能和数据安全,提供了与RAID 1一样的数据安全保障,同时具备与RAID 0近似的存储性能。缺点是存储成本高。 | 硬盘数:四个或4*N个 容量:总磁盘容量的50% |
性能:读写性能适中 安全:利用复制进行冗余,可容错,安全高 |
适于于要求存取数据量大,安全性高,如银行、金融等领域。 |
RAID 10 和 RAID 01 的区别: RAID 10 和 RAID 01 是两种逻辑方式不同的组合。 RAID 10 是先镜像后条带,即先将硬盘纵向做镜像,然后再横向做条带。在这种情况下,只要不是同一个镜像组中的几块硬盘同时坏掉,RAID组都不会崩溃。即同一个镜像组的硬盘不能同时坏掉。 RAID 01 是先条带后镜像,即先将硬盘横向做条带,然后再纵向做镜像。 在这种情况下,只要不是两个条带上同时有硬盘坏掉,则整个RAID组都不会崩溃。不管发生介质损坏的两块硬盘是否是镜像 盘。即不同条带组的硬盘不能同时坏掉。 RAID 10 和 RAID 01 在性能上基本相同,但RAID 01 发生故障的概率要大于RAID 10 。所以一般情况下都选择RAID 10。 |
磁盘调度
1、读取或写入时,磁头必须被定位在期望的磁道,并从所期望的扇区的开始
2、寻道时间:定位到期望的磁道所花费的时间
3、旋转延迟:从扇区的开始处,到达目的处花费的时间
4、平均旋转延识时间:磁盘旋转一周时间的一半
5、磁盘 IO 传输时间
(1)Ta = Ts + 1 / 2 * r + b / r * N = Ts + Tr + Tt
(2)Ta = 访问时间
(3)Ts = 寻道时间
(4)Tr = 旋转延迟,磁盘旋转一周时间的一半
(5)Tt = 传输时间
(6)b = 传输的比特数
(7)N = 磁道上的比特数
(8)r = 磁盘转数,1 / r = 旋转一周的时间
减少寻道时间
1、先来先服务算法(FCFS)
(1)按顺序处理请求,公平对待所有进程
(2)缺点:在有很多进程的情况下,接近随机调度的性能,寻道时间大幅增加
2、最短寻道时间优先算法(SSTF)
(1)选择从磁臂当前位置需要移动最少的 I/O 请求,总是选择最短寻道时间
(2)缺点:不公平性、不均匀性:请求频繁出现,磁头只在附近打转,距离磁头远处的请求无法得到响应;可能磁臂黏着
3、扫描算法(SCAN)/ 电梯调度算法
(1)首先自内向外访问,磁臂在一个方向上移动,满足所有未完成的请求,直至无更外的磁道需要访问时
(2)将磁臂换向为自外向内移动,直至无更内的磁道需要访问时,转向为自内向外,即(1),以此类推
(3)优点:不仅考虑到欲访问的磁道与当前磁道间的距离,更优先考虑了磁头当前的移动方向,避免了出现饥饿现象
(4)缺点:可能磁臂黏着
4、循环扫描算法(CSAN)
(1)首先自里向外访问,磁臂在一个方向上移动,满足所有未完成的请求,直至无更外的磁道需要访问时,磁臂转向,但不处理 IO 请求,重新在最内磁道处理 IO 请求
(2)扫面算法的改进,限制了仅在一个方向上扫描,方向规定:自内向外 / 自外向内
(3)缺点:可能磁臂黏着
5、磁臂粘着
(1)磁臂停留在某处不动的情况,例如,进程反复请求对某一磁道的 IO 操作
(2)SSTF、SCAN、CSCAN,都可能出现
6、N-Step-SCAN 算法
(1)将磁盘请求队列分成若干个长度为 N 的子队列,磁盘调度将按 FCFS 算法依次处理这些子队列,处理一个队列时,按 SCAN 算法,对一个队列处理完后,再处理其他队列,当正在处理某子队列时,如果又出现新的磁盘 IO 请求,便将新请求进程放入其他队列
(2)结合 FCFS、SCAN,避免出现磁臂粘着现象
7、FSCAN 算法
(1)实质上是 N-Step-SCAN 算法的简化
(2)只将磁盘请求队列分成两个子队列
(3)一个是由当前所有请求磁盘 IO 的进程形成的队列,由磁盘调度按 SCAN 算法进行处理,在处理某队列期间,将新出现的所有请求磁盘 IO 的进程放入另一个等待处理的请求队列,所有的新请求都将被推识到下一次扫描时处理
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战