文件管理 II(文件的物理结构、存储空间管理)

一、文件的物理结构

文件实际上是一种抽象数据类型,我们要研究它的逻辑结构、物理结构,以及关于它的一系列操作。文件的物理结构就是研究文件的实现,即文件数据在物理存储设备上是如何分布和组织的。同一个问题有两个方面的回答:一是文件的分配方式,讲的是对磁盘非空闲块的管理;二是文件存储空间管理,讲的是对磁盘空闲块的管理。

文件分配对应于文件的物理结构,是指如何为文件分配磁盘块。常用的磁盘空间分配方法有三种:连续分配、链接分配和索引分配。有的系统(如 RDOS 操作系统)对三种方法都支持,但更普遍的是一个系统只支持一种方法。

先了解一下文件块和磁盘块:

磁盘块

文件块

1. 连续分配

连续分配方法要求每个文件在磁盘上占有一组连续的块,如下图所示。磁盘地址定义了磁盘上的一个线性排序,这种排序使作业访间磁盘时需要的寻道数和寻道时间最小。

【优点】:

① 支持顺序访问和直接访问(即随机访问)。

② 实现简单、存取速度快。

③ 连续分配的文件在顺序访问(读 / 写)时速度最快。

读取某个磁盘块时,需要移动磁头。访问的两个磁盘块相隔越远,移动磁头所需时间就越长。

【缺点】:

① 文件长度不宜动态增加,即物理上采用连续分配的文件不方便拓展,因为一个文件末尾后的盘块可能已分配给其他文件,一旦需要增加,就需要大量移动盘块。

若此时文件 A 要拓展,需要再增加一个磁盘块(假设总共需要 4 个磁盘块)。由于采用连续结构,所以文件 A 占用的磁盘块必须是连续的,因此只能将文件 A 全部 “迁移” 到有连续的 4 个磁盘块的区域。

② 为保持文件的有序性,删除和插入记录时,需要对相邻的记录做物理上的移动,还会动态改变文件的长度。

③ 存储空间利用率低,反复增删文件后会产生外部碎片(与内存管理分配方式中的碎片相似)。

物理上采用连续分配,存储空间利用率低,会产生难以利用的磁盘碎片,可以用紧凑来处理碎片,但是需要耗费很大的时间代价。

④ 很难确定一个文件需要的空间大小,因而只适用于长度固定的文件。

2. 链接分配

链接分配是一种采用离散分配的方式。它消除了磁盘的外部碎片,提高了磁盘的利用率。可以动态地为文件分配离散的磁盘块,因此无须事先知道文件的大小。此外,对文件的插入、删除和修改也非常方便。链接分配又可分为隐式链接和显式链接两种形式。

1)隐式链接

隐式链接方式如下图所示。目录项中含有文件第一块的指针和最后一块的指针。每个文件对应一个磁盘块的链表;磁盘块分布在磁盘的任何地方,除最后一个盘块外,每个盘块都含有指向文件下一个盘块的指针,这些指针对用户是透明的。

【优点】:

① 采用隐式链接的链接分配方式,很方便文件拓展。(若此时要拓展文件,则可以随便找一个空闲磁盘块,挂到文件的磁盘块链尾,并修改文件的 FCB)

② 所有的空闲磁盘块都可以被利用,不会有碎片问题,外存利用率高。

【缺点】:

① 只适合顺序访问,不支持随机访问。若要访问文件的第 i 个盘块,则只能从第 1 个盘块开始通过盘块指针顺序查找到第 i 块,随机访问效率很低。

② 隐式链接的稳定性也是一个问题,系统在运行过程中由于软件或硬件错误导致链表中的指针丢失或损坏,会导致文件数据的丢失。

③ 指向下一个盘块的指针也需要耗费少量的存储空间。

通常的解决方案是,将几个盘块组成簇(cluster),按簇而不按块来分配,可以成倍地减少查找时间。比如一簇为 4 块,这样,指针所占的磁盘空间比例也要小得多。这种方法的代价是增加了内部碎片。簇可以改善许多算法的磁盘访问时间,因此应用于大多数操作系统。

注意:考试题目中遇到未指明隐式/显式的 “链接分配” ,默认指的是隐式链接的链接分配。

2)显式链接

显式链接是指把用于链接文件各物理块的指针,从每个物理块的末尾中提取出来,显式地存放在内存的一张链接表中。该表在整个磁盘中仅设置一张,称为文件分配表(File Allocation Table, FAT)。

每个表项中存放链接指针,即下一个盘块号。文件的第一个盘块号记录在目录项 “物理地址” 字段中,后续的盘块可通过查 FAT 找到。

不难看出,文件分配表 FAT 的表项与全部磁盘块一一对应,并且可以用一个特殊的数字 -1 表示文件的最后一块,可以用 -2 表示这个磁盘块是空闲的(当然也可指定为 -3 ,-4)。因此,FAT 不仅记录了文件各块之间的先后链接关系,同时还标记了空闲的磁盘块,操作系统也可以通过 FAT 对文件存储空间进行管理。当某进程请求操作系统分配一个磁盘块时,操作系统只需从 FAT 中找到 -2 的表项,并将对应的磁盘块分配给进程即可。

【优点】:

① 显式链接也不会产生外部碎片,也可以很方便地对文件进行拓展,外存利用率高。

② 采用链式分配(显式链接)方式的文件,支持顺序访问,也支持随机访问(想访问 i 号逻辑块时,并不需要依次访问之前的 0 ~ i-1 号逻辑块)。

③ FAT 表在系统启动时就会被读入内存,因此查找记录的过程是在内存中进行的(块号转换的过程不需要访问磁盘),因而不仅显著地提高了检索速度,而且明显减少了访问磁盘的次数。相比于隐式链接来说,访问速度快很多。

【缺点】:文件分配表的需要占用一定的存储空间。

3. 索引分配

链接分配解决了连续分配的外部碎片和文件大小管理的问题。但依然存在问题:① 链接分配不能有效支持直接访问(FAT 除外);② FAT 需要占用较大的内存空间。

事实上,在打开某个文件时,只需将该文件对应盘块的编号调入内存即可,完全没有必要将整个 FAT 调入内存。为此,索引分配将每个文件所有的盘块号都集中放在一起构成索引块(表),如下图所示。

索引分配允许文件离散地分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块(索引表的功能类似于内存管理中的页表——建立逻辑页面到物理页之间的映射关系)。索引表存放的磁盘块称为索引块。文件数据存放的磁盘块称为数据块

【优点】:支持直接访问,且没有外部碎片问题。

每个文件都有其索引块,这是一个磁盘块地址的数组。索引块的第 i 个条目指向文件的第 i 个块。要读第 i 块,通过索引块的第 i 个条目的指针来查找和读入所需的块。可见,索引分配方式可以支持随机访问。文件拓展也很容易实现(只需要给文件分配一个空闲块,并增加一个索引表项即可)。

【缺点】:是由于索引块的分配,增加了系统存储空间的开销(索引表需要占用一定的存储空间)。

索引块的大小是一个重要的问题,每个文件必须有一个索引块,因此索引块应尽可能小,但索引块太小就无法支持大文件。可以采用以下机制来处理这个问题:

1)链接方案

一个索引块通常为一个磁盘块,因此它本身能直接读写。如果索引表太大,一个索引块装不下,那么可以将多个索引块链接起来存放。

缺点:多个索引块链接起来后,想要找到 i 号索引块,必须先依次读入 0~i-1 号索引块,这就导致磁盘 I/O次数过多,查找效率低下。

2)多层索引

多层索引(原理类似于多级页表)通过第一级索引块指向一组第二级的索引块,第二级索引块再指向文件块。查找时,通过第一级索引查找第二级索引,再采用这个第二级索引查找所需数据块。这种方法根据最大文件大小,可以继续建立第三层、第四层索引块。

结论:采用 K 层索引结构,且顶级索引表未调入内存,则访问一个数据块需要 K+1 次读磁盘操作。

缺点:即使是小文件,访问一个数据块依然需要 K+1 次读磁盘。

3)混合索引

将多种索引分配方式相结合的分配方式。例如,一个文件的顶级索引表中,既包含直接地址索引(直接指向数据块),又包含一级间接索引(指向单层索引表)、还包含两级间接索引(指向两层索引表) 。

优点:对于小文件来说,访问一个数据块所需的读磁盘次数更少。

此外,访问文件需两次访问外存,先读取索引块的内容,然后访问具体的磁盘块,因而降低了文件的存取速度。为了解决这一问题,通常将文件的索引块读入内存,以提高访问速度。

4)总结

概念目录项内容优点缺点
顺序分配为文件分配的必须是连续的磁盘块起始块号、文件长度顺序存取速度快,支持随机访问会产生碎片,不利于文件拓展
隐式链接除文件的最后一个盘块之外,每个盘块中都存有指向下一个盘块的指针起始块号、结束块号可解决碎片问题,外存利用率高,文件拓展实现方便只能顺序访问,不能随机访问
显式链接建立一张文件分配表(FAT),显式记录盘块的先后关系(开机后FAT常驻内存)起始块号除了拥有隐式链接的优点之外,还可通过查询内存中的FAT实现随机访问FAT需要占用一定的存储空间
索引分配为文件数据块建立索引表。若文件太大,可采用链接方案、多层索引、混合索引链接方案记录的是第一个索引块的块号,多层/混合索引记录的是顶级索引块的块号支持随机访问,易于实现文件的拓展索引表需占用一定的存储空间。访问数据块前需要先读入索引块。若采用链接方案,查找索引块时可能需要很多次读磁盘操作

重要考点:

① 要会根据多层索引、混合索引的结构计算出文件的最大长度。
(Key:各级索引表最大不能超过一个块)

② 要能自己分析访问某个数据块所需要的读磁盘次数。
(Key:FCB 中会存有指向顶级索引块的指针,因此可以根据 FCB 读入顶级索引块。每次读入下一级的索引块都需要一次读磁盘操作。另外,要注意题目条件——顶级索引块是否已调入内存)

随机访问的概念:

二、文件存储空间管理(外存空闲空间管理)

【总结】:

一个存储设备可以按整体用于文件系统,也可以细分。例如,一个磁盘可以划分为 4 个分区,每个分区都可以有单独的文件系统。包含文件系统的分区通常称为(volume)。卷可以是磁盘的一部分,也可以是整个磁盘,还可以是多个磁盘组成 RAID 集,如下图所示。

在一个卷中,存放文件数据的空间(文件区)和 FCB 的空间(目录区)是分离的。由于存在很多种类的文件表示和存放格式,所以现代操作系统中一般都有很多不同的文件管理模块,通过它们可以访问不同格式的卷中的文件。卷在提供文件服务前,必须由对应的文件程序进行初始化,划分好目录区和文件区,建立空闲空间管理表格及存放卷信息的超级块。

文件存储设备分成许多大小相同的物理块,并以块为单位交换信息,因此,文件存储设备的管理实质上是对空闲块的组织和管理,它包括空闲块的组织、分配与回收等问题。

1. 空闲表法

空闲表法属于连续分配方式,它与内存的动态分配方式类似,为每个文件分配一块连续的存储空间。系统为外存上的所有空闲区建立一张空闲表,每个空闲区对应一个空闲表项,其中包括表项序号、该空闲区的第一个盘块号、该区的空闲盘块数等信息。再将所有空闲区按其起始盘块号递增的次序排列,如下图所示。

2. 空闲链表法

将所有空闲盘区拉成一条空闲链。根据构成链所用基本元素的不同,分为两种形式:

1)空闲盘块链

将磁盘上的所有空闲空间以盘块为单位拉成一条链。当用户因创建文件而请求分配存储空间时,系统从链首开始,依次摘下适当数目的空闲盘块分配给用户。当用户因删除文件而释放存储空间时,系统将回收的盘块依次插入空闲盘块链的末尾。

这种方法的优点是分配和回收一个盘块的过程非常简单,但在为一个文件分配盘块时可能要重复操作多次, 效率较低。又因它是以盘块为单位的,空闲盘块链会很长。

2)空闲盘区链

将磁盘上的所有空闲盘区(每个盘区可包含若干个盘块)拉成一条链。每个盘区除含有用于指示下一个空闲盘区的指针外,还应有能指明本盘区大小(盘块数)的信息。分配盘区的方法与内存的动态分区分配类似,通常采用首次适应算法。在回收盘区时,同样也要将回收区与相邻接的空闲盘区合并。

这种方法的优缺点刚好与第一种方法的相反,即分配与回收的过程比较复杂,但效率通常较高,且空闲盘区链较短。

3. 位示图法

位示图法属于连续分配、离散分配都适用的方式。位示图是利用二进制的一位来表示磁盘中一个盘块的使用情况,磁盘上所有的盘块都有一个二进制位与之对应。当其值为 “0” 时,表示对应的盘块空闲;为 “1” 时,表示已分配。这样,一个 m×n 位组成的位示图就可用来表示 m×n 个盘块的使用清况,如下图所示。

位示图一般用连续的 “字” 来表示,如上图中一个字的字长是 16 位,字中的每一位对应一个盘块。因此可以用(字号,位号)对应一个盘块号。(字号,位号)也可描述为(行号,列号)。

1)盘块的分配

假设盘块号、字号(行号)、位号(列号)均从 1 开始,n 表示字长。

  • 顺序扫描位示图,从中找出一个或一组其值为 “0” 的二进制位。

  • 将找到的一个或一组二进制位,转换成与之对应的盘块号。若找到的其值为 “0” 的二进制位位于位示图的第 i 行、第 j 列,则其相应的盘块号应按下式计算(n 为每行位数):b = n × (i - 1) + j 。

  • 修改位示图,令 map[i, j] = 1 。

2)盘块的回收

假设盘块号、字号(行号)、位号(列号)均从 1 开始,n 表示字长。

  • 将回收盘块的盘块号转换成位示图中的行号和列号。转换公式为:i = (b - 1) / n + 1 ;j = (b - 1) MOD n + 1 。

  • 修改位示图,令 map[i, j] = 0 。

4. 成组链接法

空闲表法和空闲链表法都不适用于大型文件系统,因为这会使空闲表或空闲链表太大。在 UNIX 系统中采用的是成组链接法对磁盘空闲块进行管理,这种方法结合了空闲表和空闲链表两种方法,它具有上述两种方法的优点,克服了两种方法均有的表太长的缺点。

先来介绍 “超级块” 的概念:文件卷的目录区中专门用一个磁盘块作为 “超级块” ,当系统启动时需要将超级块预先读入系统空闲的主存,并且要保证内存与外存中的 “超级块” 数据一致。

用来存放一组空闲盘块号(空闲盘块的块号)的盘块称为成组链块。成组链接法的大致思想是:把顺序的 n 个空闲盘块号保存在第一个成组链块中,其最后一个空闲盘块(作为成组链块)则用于保存另一组空闲盘块号,如此继续,直至所有空闲盘块均予以链接。系统只需保存指向第一个成组链块的指针。假设磁盘最初全为空闲盘块,其成组链接如下图所示。

1)盘块的分配

根据第一个成组链块的指针,将其对应的盘块分配给用户,然后将指针下移一格。若该指针指向的是最后一个盘块(即成组链块),由于该盘块记录的是下一组空闲盘块号,因此要将该盘块读入内存,并将指针指向新的成组链块的第一条记录,然后执行上述分配操作。

2)盘块的回收

成组链块的指针上移一格,再记入回收盘块号。当成组链块的链接数达到 n 时,表示已满,便将现有已记录 n 个空闲盘块号的成组链块号记入新回收的盘块(作为新的成组链块)。

三、小结

1、单个文件的逻辑结构和物理结构之间是否存在某些制约关系?

  • 文件的逻辑结构是用户可见的结构,即从用户角度看到的文件的全貌。

  • 文件的物理结构是文件在存储器上的组织结构,它表示一个文件在辅存上安置、链接、编目的方法,它和文件的存取方法以及存储设备的特性等都有着密切的联系。

单个文件的逻辑结构和物理结构之间虽无明显的制约或关联关系,但是如果物理结构选择不慎,也很难体现出逻辑结构的特点,比如一个逻辑结构是顺序结构,而物理结构是隐式链接结构的文件,即使理论上可以很快找出某条记录的地址,而实际找时仍然需要在磁盘上一块一块地找。

2、文件的物理分配方式的比较

文件的三种物理分配方式的比较如下表所示。

访问第 n 条记录优点缺点
连续分配需访问磁盘 1 次顺序存取时速度快,文件定长时可根据文件起始地址及记录长度进行随机访问文件存储要求连续的存储空间,会产生碎片,不利于文件的动态扩充
链接分配需访问磁盘 n 次可解决外存的碎片问题,提高外存空间的利用率,动态增长较方便只能按照文件的指针链顺序访问,查找效率低,指针信息存放消耗外存空间
索引分配m 级需访问磁盘 m+1 次可以随机访问,文件易于增删索引表增加存储空间的开销,索引表的查找策略对文件系统效率影响较大

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/476877.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据新视界 -- 大数据大厂之 Impala 性能优化:跨数据中心环境下的挑战与对策(上)(27 / 30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

利用 GitHub 和 Hexo 搭建个人博客【保姆教程】

利用 GitHub 和 Hexo 搭建个人博客 利用 GitHub 和 Hexo 搭建个人博客一、前言二、准备工作(一)安装 Node.js 和 Git(二)注册 GitHub 账号 三、安装 Hexo(一)创建博客目录(二)安装 H…

ABAP开发-CO的底层表-物料价格分析CKM3

系列文章目录 文章目录 系列文章目录[TOC](文章目录) 前言一、物料分类账与CKM3二、CKM3界面分析三、CKM3的主要功能1、物料价格分析2、成本构成分析3、价格差异分析4、期间状态查看 四、物料分类账与CKM3的关系五、CKM3的底层表及数据支持1、核心数据表2、取数逻辑 总结 前言 …

汽车被追尾了怎么办?

今天开车上班的路上发生了一起4车追尾的交通事故,作为过来人我复盘了下交通追尾的处理过程。简述如下: 发生追尾后打双闪及时放置三角架,提醒后面车这里发生交通事故了 打122交警电话和自行拍下事故现场的远近照片。如果车子损伤严重或事故复…

了解Redis(第一篇)

目录 Redis基础 什么事Redis Redis为什么这么快 除了 Redis,你还知道其他分布式缓存方案吗? 说-下 Redis 和 Memcached 的区别和共同点 为什么要用Redis? 什么是 Redis Module?有什么用? Redis基础 什么事Redis Redis (REmote DIctionary S…

javascrip页面交互

元素的三大系列 offset系列 offset初相识 offset系列属性 作用 element.offsetParent 返回作为该元素带有定位的父级元素,如果父级没有定位,则返回body element.offsetTop 返回元素相对于有定位父元素上方的偏移量 element.offsetLeft 返回元素…

K8S + Jenkins 做CICD

前言 这里会做整体CICD的思路和流程的介绍,会给出核心的Jenkins pipeline脚本,最后会演示一下 实验/实操 结果 由于整体内容较多,所以不打算在这里做每一步的详细演示 - 本文仅作自己的实操记录和日后回顾用 要看保姆式教学的可以划走了&…

nvm安装node遇到的若干问题(vscode找不到npm文件、环境变量配置混乱、npm安装包到D盘)

问题一:安装完nvm后需要做哪些环境变量的配置? 1.打开nvm文件夹下的setting文件,设置nvm路径和安装node路径,并添加镜像。 root: D:\software\nvm-node\nvm path: D:\software\nvm-node\nodejs node_mirror: https://npmmirror.c…

shell脚本(五)

声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&#…

如何使用ChatGPT整理和收集论文实验数据?

学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 使用ChatGPT整理和收集论文实验数据,需要通过一些具体的方法和提示词。以下几个步骤和技巧,告诉你如何借助ChatGPT更好地完成工作: 1. 数据格式化和…

PDF电子发票信息转excel信息汇总

PDF电子发票信息提取,支持将pdf发票文件夹下的剩所有发票,转为excel格式的信息,对于发票量比较大,不好统计,需要一个一个去统计的情况,可节省2个点以上的时间,一次下载,终身有效。 使…

小鹏汽车智慧材料数据库系统项目总成数据同步

1、定时任务处理 2、提供了接口 小鹏方面提供的推送的数据表结构: 这几个表总数为100多万,经过条件筛选过滤后大概2万多条数据 小鹏的人给的示例图: 界面: SQL: -- 查询车型 select bmm.md_material_id, bmm.material_num, bm…

嵌入式硬件实战基础篇(二)-稳定输出3.3V的太阳能电池-无限充放电

引言:本内容主要用作于学习巩固嵌入式硬件内容知识,用于想提升下述能力,针对学习稳压芯片和电容以及电池之间的运用,对于硬件PCB以及原理图的练习和前面硬件篇的实际运用;太阳能是一种清洁、可再生的能源,广…

【海思Hi3519DV500】双目网络相机套板硬件规划方案

Hi3519DV500双目网络相机套板是针对该芯片设计的一款 IP 编码板 PCBA,硬件接口支持双目sensor 接入,SDIO3.0 接口、USB2.0、USB3.0、UART 接口以及丰富的 IO 扩展应用,可根据各种使用场景设计相应扩展板,丰富外围接口,…

淘宝商品评论爬虫:Java实现指南

在当今的互联网时代,数据的价值日益凸显,尤其是用户生成的内容,如商品评论,对于理解消费者行为和市场趋势具有重要意义。淘宝作为中国最大的电商平台之一,拥有海量的商品评论数据。本文将介绍如何使用Java编写一个简单…

Java项目实战II基于微信小程序的校运会管理系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导 一、前言 在充满活力与激情的校园生活中,校运会不仅是…

tensorflow案例7--数据增强与测试集, 训练集, 验证集的构建

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 前言 这次主要是学习数据增强, 训练集 验证集 测试集的构建等等的基本方法, 数据集还是用的上一篇的猫狗识别;基础篇还剩下几个, 后面的难度会逐步提升;欢迎…

SpringBoot多环境+docker集成企业微信会话存档sdk

SpringBoot多环境docker集成企业微信会话存档sdk 文章来自于 https://developer.work.weixin.qq.com/community/article/detail?content_id16529801754907176021 SpringBoot多环境docker集成企业微信会话存档sdk 对于现在基本流行的springboot环境,官方文档真是比…

VSCode快速生成vue组件模版

1&#xff0c;点击设置&#xff0c;找到代码片段 2&#xff0c;搜索vue&#xff0c;打开vue.json 3&#xff0c;添加模版 vue2模板 "vue2": {"prefix": "vue2","body": ["<template>"," <div>$0</di…

【爬虫】Firecrawl对京东热卖网信息爬取(仅供学习)

项目地址 GitHub - mendableai/firecrawl: &#x1f525; Turn entire websites into LLM-ready markdown or structured data. Scrape, crawl and extract with a single API. Firecrawl更多是使用在LLM大模型知识库的构建&#xff0c;是大模型数据准备中的一环&#xff08;在…