• 文件系统


    一、文件系统的基本概念

    1. 文件系统:一种用于持久性存贮的系统抽象,是操作系统用于明确存储设备或分区上的文件的方法和数据结构,即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件结构称为文件系统,简称文件系统。

    2. 文件:文件系统中一个单元的相关数据在操作系统中的抽象

    3. 文件系统的功能

    (1)分配文件磁盘空间

    • 管理文件块(哪一块属于哪一个文件)
    • 管理空闲空间(哪一块是空闲的)
    • 分配算法(策略)

    (2)管理文件集合

    • 定位文件及其内容
    • 命名:通过名字找到文件的接口
    • 最常见:分层文件系统
    • 文件系统类型(组织文件的不同方式)

    (3)提供的便利及特征

    • 保护:分层来保护数据安全
    • 可靠性/持久性:保持文件的持久即使发生崩溃、媒体错误、攻击等

    4. 文件和块

    (1)文件属性

    • 名称、类型、位置、大小、保护、创建者、创建时间、最近修改时间、...

     (2) 文件头:文件系统元数据中的文件信息

    • 文件属性
    • 文件存储位置和顺序

    5. 文件描述符

    (1)文件访问模式:

    • 进程访问文件数据前必须先“打开”文件
    1 f = open(name, flag);
    2 ...
    3 read(f,...);
    4 ...
    5 close(f);

    (2)内核跟踪进程打开的所有文件

    • 操作系统为每个进程维护一个打开文件表
    • 文件描述符是打开文件的标识

             

    (3)文件描述符:操作系统在打开文件表中维护的打开文件状态和信息

    • 文件指针:最近一次读写位置,每个进程分别维护自己的打开文件指针。
    • 文件打开计数:当前打开文件的次数,最后一个进程关闭文件时,将其从打开文件表中移除。
    • 文件的磁盘位置:缓存数据访问信息。
    • 访问权限:每个进程的文件访问模式信息。

    6. 文件的用户视图和系统视图

    (1)文件的用户视图

    • 持久的数据结构

    (2)系统的访问接口

    • 字节序列的集合(unix)
    • 系统不关心存储在磁盘上的数据结构

    (3)操作系统的文件视图

    • 数据块的集合
    • 数据块是逻辑存储单元,而扇区是物理存储单元

    7. 用户视图到系统视图的转换

    (1)进程读文件

    • 获取字节所在的数据块
    • 返回数据块内对应部分

    (2)进程写文件

    • 获取数据块
    • 修改数据块中的对应部分
    • 写回数据块

    (3)文件系统中的基本操作单位是数据块

    • 例如,getc() 和 put() 即使每次只访问1字节的数据,也需要缓存目标数据4096字节

    8. 访问模式

    操作系统需要了解进程如何访问文件。

    • 顺序访问:按字节依次读取,大多数的文件访问都是顺序访问
    • 随机访问:从中间读写,不常用,但仍然重要,例如,虚拟内存把内存页存储在文件。
    • 索引访问:依据数据特征索引,通常操作系统不完整提供索引访问,数据库是建立在索引内容的磁盘访问上。

    索引文件示例

     8. 文件共享和访问控制

    多用户系统中的文件共享是很必要的

    (1)访问控制

    • 每个用户能够获得哪些文件的哪些访问权限
    • 访问模式:读、写、执行、删除、列表等

    (2)文件访问控制列表(ACL):<文件实体,权限>

    (3)unix模式:

    • <用户|组|所有人,读|写|可执行>
    • 用户标识ID:标识用户,表明每个用户所允许的权限及保护模式
    • 组标识ID:允许用户组成组,并指定了组访问权限

    9. 语义一致性

    (1)规定多进程如何同时访问共享文件

    • 与同步算法相似
    • 因磁盘 I/O 和网络延迟而设计简单

    (2)Unix文件系统(UFS)语义

    • 对打开文件的写入内容立即对其他打开同一文件的其他用户可见
    • 共享文件指针允许多用户同时读取和写入文件

    (3)会话语义

    • 写入内容只有当文件关闭时可见

    (4)读写锁:一些操作系统和文件系统提供改功能

    10. 文件系统挂载

    文件系统需要先挂载才能被访问,未挂载的文件系统被挂载在挂载点上。

     

    二、虚拟文件系统

    1.文件系统的实现:分层结构

    • 虚拟(逻辑)文件系统(VFS,Virtual File System)
    • 特定文件系统模块

     2. 虚拟文件系统

    (1)目的:对所有不同文件系统的抽象

    (2)功能:

    • 提供相同的文件和文件系统接口
    • 管理所有文件和文件系统关联的数据结构
    • 高效查询例程,遍历文件系统
    • 与特定文件系统模块的交互

    3. 文件系统基本数据结构

    (1)文件卷控制块(unix:“superblock”)

    • 每个文件系统一个
    • 文件系统详细信息
    • 块、块大小、空余块、计数/指针

    (2)文件控制块(unix:“vnode” or “inode”)

    • 每个文件一个
    • 文件详细信息
    • 访问权限、拥有者、大小、数据块位置等

    (3)目录项(Linux:“dentry”)

    • 每个目录项一个(目录和文件)
    • 将目录项数据结构及树形布局编码成树型数据结构
    • 指向文件控制块、父目录、子目录等

    4. 文件系统的组织视图

     

     5. 文件系统的存储结构

    (1)文件系统数据结构

    • 卷控制块(每个文件系统一个)
    • 文件控制块(每个文件一个)
    • 目录节点(每个目录项一个)

    (2)持久存储在外存中,存储设备的数据块中

    (3)当需要时加载进内存

    • 卷控制块:当文件系统挂载时进入内存
    • 文件控制块:当文件被访问时进入内存
    • 目录节点:在遍历一个文件路径时进入内存

    6. 文件系统的存储视图

     

    三、文件缓存和打开文件

    1. 多种磁盘缓存位置

     2. 数据块缓存

    (1)数据块按需读入内存

    • 提供read() 操作
    • 预读:预先读取后面的数据块

    (2)数据块使用后被缓存

    • 假设数据将会再次用到
    • 写操作可能被缓存和延迟写入

    (3)两种数据块缓存方式

    • 数据块缓存
    • 页缓存:统一缓存数据块和内存页

     3. 页缓存

    (1)虚拟页式存储

    • 在虚拟地址空间中虚拟页面可映射到本地外存文件中

    (2)文件数据块的页缓存

    • 在虚拟内存中文件数据块被映射成页
    • 文件的读/写操作被转换成对内存的访问
    • 肯导致缺页和/或设置为脏页
    • 问题:页置换算法需要协调虚拟存储和页缓存间的页面数

                        

     4. 文件系统中打开文件的数据结构

     (1)文件描述符

    • 每个被打开的文件都有一个文件描述符
    • 文件状态信息:目录项、当前文件指针、文件操作设置等

    (2)打开文件表

    • 每个进程一个进程打开文件表
    • 一个系统级的打开文件表
    • 有文件被打开时,文件卷就不能被卸载

     5. 打开文件锁

    一些系统提供文件锁,用于协调多进程的文件访问

    • 强制——根据锁保持情况和访问需求确定时否拒绝访问
    • 劝告——进程可以查找锁的状态来决定怎么做

    四、文件分配

    1. 文件大小

    • 大多数文件都很小,需要对小文件提供很好的支持,块空间不能太大
    • 一些文件非常大,必须支持大文件(64位文件偏移),大文件访问需要高效

     2. 文件分配

    如何表示分配给一个文件数据块的位置和顺序

    (1)分配方式

    • 连续分配
    • 链式分配
    • 索引分配

    (2)指标

    • 存储效率:外部碎片等
    • 读写性能:访问速度

    3. 连续分配

    (1)文件头指定起始块和长度

     (2)分配策略

    • 最先匹配,最佳匹配,...

    (3)优点

    • 文件读取表现好
    • 高效的顺序和随机访问

    (4)缺点

    • 碎片问题
    • 文件增长问题,预分配?按需分配?

    4. 链式分配

    (1)文件以数据块链表方式存储,文件头包含了到第一块和最后一块的指针。

     (2)优点

    • 创建、增大、缩小很容易
    • 没有碎片

    (3)缺点

    • 无法实现真正的随机访问
    • 可靠性差,破坏一个链,后面的数据块就丢了

    5. 索引分配

    (1)为每个文件创建一个索引数据块,即指向文件数据块的指针列表,文件头包含了索引数据块指针

     (2)优点

    • 创建、增大、缩小很容易
    • 没有碎片
    • 支持直接访问

    (3)缺点

    • 当文件很小时,存储索引的开销问题
    • 处理大文件时,索引数据块的大小可能不够

    6. 大文件的索引分配

    (1)链式索引块(IB + IB +...)

     (2)多级索引块(IB * IB *...)

    7. UFS多级索引分配

     (1)文件头包含13个指针

    10个指针指向数据块,第11个指针指向索引块,第12个指针指向二级索引块,第13个指针指向三级索引块

    (2)效果

    • 提高了文件大小限制阈值
    • 动态分配数据块,文件扩展很容易
    • 小文件开销小
    • 只为大文件分配间接数据块,大文件在访问数据块时需要大量查询

    五、空闲空间管理

    跟踪记录文件卷中未分配的数据块

    1. 空闲空间组织:位图

    (1)用位图代表空闲数据块列表

    • 11111111111111111100111001111111100...
    • Di = 0 表示数据块 i 是空闲,否则表示已分配

    (2)使用简单但是可能会是一个很大的向量表

    • 160GB磁盘 —> 40M数据块 —> 5MB位图
    • 假定空闲空间在磁盘中均匀分布,则找到 “0” 之前要扫描 n/r,n = 磁盘上数据块的总数,r = 空闲块的数目

    2. 其他空闲空间组织方式

    (1)链表

     (2)链式索引

     

    六、冗余磁盘整列RAID

    1. 磁盘分区

    通常磁盘通过分区来最大限度减小寻道时间,分区是一组柱面的集合,每个分区都可视为逻辑上独立的磁盘

     2. 一个典型的磁盘文件系统组织

    文件卷:一个拥有完整文件系统实例的外存空间,通常常驻在磁盘的单个分区

     3. 多磁盘管理

    (1)使用多磁盘可改善

    • 吞吐量(通过并行)
    • 可靠性和可用性(通过冗余)

    (2)冗余磁盘阵列(RAID,Redundant Array of Inexpensive Disks)

    • 多种磁盘管理技术
    • RAID,如,RAID-0,RAID-1,RAID-5

    (3)冗余磁盘阵列的实现

    • 软件:操作系统内核的文件卷管理
    • 硬件:RAID硬件控制器(I/O)

    4. RAID-0:磁盘条带化

    把数据块分成多个子块,存储在独立的磁盘中,通过独立磁盘上并行数据块访问提供更大的磁盘带宽

    5. RAID-1:磁盘镜像

    向两个磁盘写入,从任何一个读取,使得可靠性成倍增长,读取性能线性增加

    6. RAID-4:带校验的磁盘条带化

    数据块级的磁盘条带化加专用奇偶校验磁盘,允许从任意一个故障磁盘中恢复

    7. RAID-5:带分布式校验的磁盘条带化

     8. 基于位和基于块的磁盘条带化

    条带化和奇偶校验按 “字节” 或者 “位”

    • RAID- 0/4/5:基于数据块
    • RAID- 3:基于位

    9. 可纠正多个磁盘错误的冗余磁盘阵列

    • RAID-5:每组条带块有一个奇偶校验块,允许一个磁盘错误
    • RAID-6:每组条带块有两个冗余块,允许两个磁盘错误
  • 相关阅读:
    关于跨域,以及跨域的几种方式
    跨域资源共享 CORS 详解
    python 协程与go协程的区别
    查看Mysql正在执行的事务、锁、等待
    undo log,当前读和快照读,redo log----与mvcc
    如何查找MySQL中查询慢的SQL语句
    dbForge Studio 2020 for MySQL v9.0.338破解软件包下载
    阿里云数据盘挂载完整过程
    [原][python]递归遍历文件夹下所有小文件,并删除
    [转][数据结构]R树 RTree
  • 原文地址:https://www.cnblogs.com/cjsword/p/12264863.html
Copyright © 2020-2023  润新知