首页 > 其他分享 >操作系统中文件系统的实现和分配方式探析(下)

操作系统中文件系统的实现和分配方式探析(下)

时间:2023-09-06 09:35:43浏览次数:36  
标签:文件 操作系统 文件系统 链接 索引 探析 磁盘 分配 指针

非连续空间存放方式

我们已经对连续分配的方式有了一定的了解,并且也清楚了它存在的问题和局限性。为了解决这些问题,非连续存放的方式应运而生。非连续空间存储大致可以分为两种形式:链表形式和索引形式。

链式分配

链式分配是一种离散分配的方式,用于为文件分配非连续的磁盘块。它有两种分配方式:显示链接和隐式链接。

隐式链接

隐式链表分配与我们已知的Java链表知识基本是一致的,都需要存储下一个节点的指针。但为什么称之为隐式链接呢?因为我们不知道每个节点的指针是什么,只有通过遍历的方式从头节点开始逐步获取下一个节点的指针。每次操作都是相同的,指针并没有存储起来。在隐式链接分配中,目录项只存储了头节点(磁盘块)指针和尾节点(磁盘块)指针。当需要分配新的磁盘块时,我们使用最后一个磁盘块中的指针指向新的磁盘块,并将新的磁盘块标记为最后一个磁盘块。

image

现在让我们考虑一个问题:使用隐式链接如何将逻辑块号转换为物理块号?我们可以将其类比为Java中的链表如何找到相应的元素。

当用户提供要访问的逻辑块号 i 时,操作系统需要找到所需访问文件的文件控制块(FCB)。从FCB中我们可以得知文件的起始块号,然后将逻辑块号 0 的数据读入内存,通过这个可以知道逻辑块号 1 的物理块号,然后再读入逻辑块号 1 的数据进入内存,如此类推,最终可以找到用户所需访问的逻辑块号 i。因此,访问逻辑块号 i 需要进行 i + 1 次磁盘 I/O 操作。隐式链接分配就像Java中的链表一样只能按顺序访问,不支持随机访问,因此查找效率较低。

现在让我们考虑另一个问题:使用隐式链接是否方便文件扩展?我们可以将其类比为Java中的链表是否方便进行扩容呢?

我们知道,目录项中存储了结束块号的物理地址。因此,如果要扩展文件,我们只需要将新分配的磁盘块挂载到结束块号的后面。我们修改结束块号的指针指向新分配的磁盘块,并更新目录项。隐式链接分配类似于Java中的链表,很方便进行文件扩展。所有的空闲磁盘块都可以被利用,没有碎片问题,存储利用率较高。

显式链接

有隐式连接那么就有显式链接,隐式链接我们说了没有存储各个节点指针所以每次都需要重新从头结点来获取下一指针节点,那么显示链接是把用于链接各个物理块的指针显式地存放在一张表中,该表称为文件分配表(FAT,File Allocation Table)。

image

由于查找记录的过程是在内存中进行的,从而显著提高了检索速度并减少了访问磁盘的次数。但也正是整个表都存放在内存中的关系,它的主要的缺点是不适用于大磁盘。

举个例子,假设有一个拥有200GB空间和1KB块大小的磁盘。根据显式链接的方式,需要在文件分配表中存储2亿项,每一项对应磁盘上的一个块。如果每一项需要4个字节的存储空间,那么文件分配表将占用800MB的内存。显然,对于大磁盘而言,这种方式并不适合。

索引分配

理解索引分配之前,可以先想一下MySQL中的索引结构,这样可以更好的理解索引分配的原理。

链表的方式解决了连续分配的磁盘碎片和文件动态扩展的问题,但是不能有效支持直接访问(FAT除外)。为了解决这个问题,可以采用索引的方式。

索引的实现是为每个文件创建一个「索引数据块」,里面存放的是指向文件数据块的指针列表,类似于书的目录。通过查阅索引数据块,可以快速找到对应的数据块。

此外,文件头还需要包含指向「索引数据块」的指针。这样可以通过文件头知道索引数据块的位置,然后通过索引数据块里的索引信息找到对应的数据块。

当创建文件时,索引块的所有指针都被设置为空。当首次写入第 i 块时,从空闲空间中获取一个块,并将其地址写入索引块的第 i 个条目。这样,通过文件头中的指向索引数据块的指针,可以知道索引数据块的位置,并通过索引数据块中的索引信息找到对应的数据块。

image

索引分配的优点包括:

  • 创建、增大和缩小文件都很方便;
  • 没有碎片问题;
  • 支持顺序读写和随机读写。

然而,索引分配也有一些缺点。由于索引数据也需要存放在磁盘块中,如果文件很小,实际上只需要一个块就可以存放,但仍需要额外分配一个块来存放索引数据,这会带来额外的开销。

如果文件很大,以至于一个索引数据块无法容纳全部的索引信息,我们可以采用组合的方式来处理大文件的存储。

组合方式是链表 + 索引,也被称为「链式索引块」。在这种实现方式中,索引数据块中会预留一个指针,用于存放下一个索引数据块的地址。当一个索引数据块的索引信息用完时,可以通过该指针找到下一个索引数据块的信息。然而,这种方式也会面临链表方式的问题,即如果某个指针损坏了,后续的数据将无法读取。

image

为了解决这个问题,可以采用多级索引的方式。多级索引将一个大文件的索引信息分散到多个索引数据块中,以减轻单个索引数据块的负担。类似于MySQL的B+树索引结构,多级索引也在非叶子节点存储了索引数据,而索引指针指向叶子节点的数据。尽管存在一些不同,但它们的逻辑是相似的。

image

总结

非连续空间存放方式是为了解决连续分配方式的问题和局限性而提出的。其中,链式分配方式包括隐式链接和显式链接两种形式。隐式链接通过存储头节点和尾节点指针的方式实现文件的非连续分配,但查找效率较低且不支持随机访问,但方便文件扩展且没有碎片问题。显式链接通过文件分配表存储物理块的指针,提高了检索速度但不适用于大磁盘。

索引分配方式则通过为每个文件创建索引数据块,并在文件头和索引数据块中存储指针信息,实现了文件的非连续分配和直接访问。索引分配的优点包括方便创建、扩展和缩小文件,没有碎片问题,支持顺序和随机读写。然而,索引分配也存在一些缺点,如对小文件的额外开销。

为了解决大文件存储问题,可以采用链式索引块和多级索引的组合方式。链式索引块通过指针连接多个索引数据块,但可能面临指针损坏导致数据无法读取的问题。多级索引将大文件的索引信息分散到多个索引数据块中,提高了文件系统的性能和可靠性。通过这些优化,可以更好地处理大文件存储,并提高文件系统的效率。

标签:文件,操作系统,文件系统,链接,索引,探析,磁盘,分配,指针
From: https://www.cnblogs.com/guoxiaoyu/p/17674388.html

相关文章

  • 操作系统原理 1.1_2 操作系统的特征
    学习教程:【王道计算机考研操作系统-哔哩哔哩】https://b23.tv/fFY1XPi操作系统的特征并发并发:指两个或多个事件在同一时间间隔内发生,这些事件宏观上是同时发生,微观上是交替发生的。并发性是操作系统一个最基本的特征。易混概念—并行:指两个或多个事件在同一时刻同时发生。......
  • shell命令概述 Shell作用:命令解释器 介于操作系统内核与用户之间,负责解释命令行 获得
    shell命令概述Shell作用:命令解释器介于操作系统内核与用户之间,负责解释命令行获得命令帮助内部命令help命令的“--help”选项使用man命令阅读手册页命令行编辑的几个辅助操作Tab键:自动补齐反斜杠“\”:强制换行快捷键Ctrl+U:清空至行首快捷键Ctrl+K:清空至行尾快捷键Ctr......
  • 轻松浏览Linux文件系统:ls命令的实用指南
    当谈到Linux命令行操作时,ls是一个非常基础但又非常重要的命令。它用于列出文件和目录,帮助您浏览和了解当前工作目录的内容。在这篇博客文章中,我们将介绍ls命令的基本用法和一些常见的使用示例。什么是ls命令?ls是"list"的缩写,是Linux和Unix操作系统中的一个命令行工具,用于列出文件和......
  • buildroot 构建根文件系统(5)添加 Qt 库相关环境
    一、开发背景构建最小系统后成功运行后,需要支持Qt库编译的程序在上面运行二、开发需求Qt库编译的程序可以正常运行三、开发环境LinuxUbuntu 4.15.0-65-generic+ buildroot-2023.02.3+i.mx6d(cortex-A9)四、实现步骤1、基于前面章节的文件系统上打......
  • 基本操作系统学习笔记
    1、Vmware、OS简述1、虚拟机定义虚拟机(VirtualMachine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离的环境中的完整计算机系统。在实体计算机中能够完成的工作在虚拟机中都能够实现。在计算机中创建虚拟机时,需要将实体机的部分硬盘和内存容量作为虚拟机的硬盘和......
  • xfs文件系统-------使用备份文件恢复被误删的文件
    LinuxCentos7xfs文件误删了怎么办——快速恢复xfs文件xfs文件恢复xfs类型的文件可使用xfsdump与xfsrestore工具进行备份恢复。若系统中未安装xfsdump与xfsrestore工具,可以通过yuminstall-yxfsdump命令安装。xfsdump按照inode顺序备份一个xfs文件系统。xfsdump......
  • 操作系统中文件系统的实现和分配方式探析(上)
    虚拟文件系统在Linux文件系统中,用户空间、系统调用、虚拟机文件系统、缓存、文件系统以及存储之间存在着紧密的关系。如下图:在操作系统中,文件系统起到了重要的作用,它们负责管理操作系统中的文件和目录。然而,不同的文件系统有着不同的实现方式和存储位置。为了提供一个统一的......
  • docker fs 文件系统
    sudodockerrun--nameaaa -it--rmbusyboxtop 会启动这个container去另一个terminal上进入这个容器,执行 echo123ddddd>>/aaaaaa,就是生成个文件去另一个terminal上主机上执行 >sudofind/-nameaaaaaa/applications/var_lib_docker/overlay2/9a36827......
  • 探索文件系统:高效、可靠的文件管理与访问机制
    文件系统的功能规划内存就像是一个书包,容量有限,只能带着一部分东西。而图书馆则是一个专门存储和管理文件的地方,拥有更大的容量,并且可以永久保存文件。为了能够快速找到需要的文件,我们需要有一个书单来记录每本书放在哪里,这个书单就相当于文件系统的索引区,记录着文件的位置和相关......
  • 天蝎软件-操作系统 课程笔记(更新中)
    Windows介绍Windows版本PC(常用)Server(常用)Windows常用命令系统命令的本质一个独立的程序,调用已经储存在目录里的程序,如果改变文件名字,将找不到这个程序环境变量Cmd通过环境变量来找到命令对应的程序。在Windows系统中,用来指定可以在Cmd中运行的命令所对应的程序所在......