第八章 磁盘存储器的管理 【操作系统】

简介: 第八章 磁盘存储器的管理 【操作系统】

前言

以下内容源自计算机操作系统(第四版)

关于操作系统,
CSDN有很多的优秀博客。
在这里,
本文摘取其他博客内容,
并附上相关链接,
如有侵权,
联系删除,
仅供学习交流使用

请您阅读文章声明,默认同意该声明

推荐

计算机操作系统(第四版)之文件管理、磁盘存储器的管理要点梳理

第八章 磁盘存储器的管理

8.1 外存的组织方式

文件的物理结构直接与外存的组织方式有关。对于不同的外存组织方式,将形成不同的文件物理结构。目前常用的外存组织方式有:

1)连续组织方式。

2)链接组织方式.

3)索引组织方式。

8.1.1 连续组织方式

为每个文件分配一组连续的相邻物理块, 形成的文件结构称顺序文件结构, 物理文件称顺序文件。这种分配方式保证了记录的逻辑顺序, 与占用盘块的物理顺序一致; 在目录项的"文件物理地址"字段中存放该文件的第一个记录所在盘块号和文件长度(块数)。如:


连续分配的优缺点

优点: 顺序存取简单容易, 也支持直接(随机)存取。
顺序存取速度快, 寻道次数和寻道时间最少。
也适合随机访问, 计算出盘块地址直接访问。
缺点: 易产生外部碎片, 降低外存空间的利用率; 可利
     用紧凑法将外部碎片拼接成连续存储空间, 但紧凑
     一次需要进行大量的磁盘操作花费大量的时间。
     不利于文件的插入和删除。
     必须事先知道文件的大小, 对于动态增长的文件效果较差。需要估算预留的连续外存空间, 预留空间不足将引起大片磁盘空间的移动, 预留空间太大将使大量的外存空间长期空闲。

8.1.2 链接组织方式

将文件存放在多个离散的盘块中, 同一文件的盘块链接成一个链表, 消除外部碎片, 显著的提高了外存空间的利用率, 有利于文件插入和删除, 有利于文件的动态扩充。

1. 隐式链接
在文件目录的每个目录项中,都含有指向链接文件第一个盘块和最后一个盘块的指针,

而在每个盘块中都含有指向下一个盘块的指针,只有508字节供使用。

缺点: 只适合顺序访问, 随机访问要从头查找极低效。

可靠性差, 盘块的指针出现问题会导致链断开。

更多的寻道次数和寻道时间。

解决方法:

可将几个盘块组成一个簇, 减少查找指定块的时间。


2. 显式链接
将链接文件各物理块的指针存放在内存的一张链接表中, 整个磁盘仅设一张表称为文件分配表(FAT), 表项的序号是物理盘块号, 每个表项中存放链接指针(下一盘块号)。每个文件的第一个盘块号填入该文件的文件控制块(FCB)的"物理地址"字段中。记录的查找过程全部在内存中进行, 检索速度快、访问磁盘磁盘次数少、可靠性高。



8.1.3 FAT技术

8.1.4 NTFS的文件组织方式

8.1.5 索引组织方式

链接分配存在的问题:

要顺序查找许多盘块号, 不支持高效的直接存取。

FAT占用较大的内存空间。
1. 单级索引分配

为每个文件分配一个集中存放的索引块(表), 该表实质就是磁盘块地址数组,其中第i项存放指向文件的第i块盘块号, 该文件的目录项中存储了指向该索引块的指针;支持直接存取, 如:记录号m 第i块 盘块号


2. 多级索引分配

对于大文件, 当分配的盘块号已装满一个索引块时, 必须另分配索引块, 各索引块通过指针连结起来,文件太大索引块太多时, 检索索引块将是低效的, 此时应为这些索引块再建立一级索引, 形成了两级索引, 必要时还可建立更多级的索引分配方式。




3. 混合(增量式)索引分配方式

索引分配方式的索引块花费较多空间,小文件索引块利用率更低。UNIX用混合索引模式避免此缺点。每个文件的索引结点含13个地址项 i.addr(0)~ i.addr(12), 每项4个字节; 前10项存放直接地址(物理块号), 若文件大于40kB,则用i.addr(10)指向单级索引块进行一次间接寻址,该块中最多可放1k个物理块号,文件可长达4MB; 还可用 i.addr(11) 和 i.addr(12) 作为二次和三次间接寻址, 文件最大长度分别可达4GB和4TB。

对比三种分配的优缺点

连续分配
优点:顺序存取简单高效,寻道距离次数少,访问速度快, 也适合随机访问,算出块地址直接访问。

缺点: 有外部碎片,外存利用率低,插入和删除不容易


链接分配

优点: 消除外存碎片, 外存利用率高, 有利于文件的动态扩充, 容易插入和删除,

缺点:不适合随机访问,可靠性差,寻道次数多速度慢

显式链接分配可显著减少寻道次数,提高检索速度, 但FAT占用了较大的内存空间


索引分配

优点: 链接分配的全部优点, 还适合随机访问,寻道次数少, 检索速度快。

缺点: 索引块费较多空间,小文件尤甚,混合索引可避免

8.2 文件存储空间的管理

为了实现前面任何一种文件组织方式,都需要为文件分配盘块,因此必须知道磁盘上哪些盘块是可用于分配的。故在文件分配磁盘时,除了需要文件分配表外,系统还应为可分配存储空间设置相应的数据结构,即设置一个磁盘分配表,用于记住可供分配的存储空间情况。此外,还应提供对盘块进行分配和回收的手段。不论哪种分配和回收方式,存储空间的基本分配单位都是磁盘块而非字节。

8.2.1 空闲表法和空闲链表法

1. 空闲表法
1)空闲表。

空闲表法属于连续分配方式,它与内存的动态分配方式雷同。

即系统也为外存上的所有空闲区建立一张空闲表,每个空闲区对应于一个空闲表项,其中包括表项序号、该空闲区的第一个盘块号、该区的空闲盘块数等信息。再将所有空闲区按其起始盘块号递增的次序排列。

2)存储空间的分配与回收。

空闲盘区的分配与内存的动态分配类似,同样是采用首次适应算法、循环首次适应算法等。

系统在对用户所释放的存储空间进行回收时,也采取类似于内存回收的方法,即要考虑回收区是否与空闲表中插入点的前区和后区相邻接,对相邻接者应予以合并。

应该说明,在内存分配上,虽然很少采用连续分配方式,然而在外存的管理中,由于这种分配方式具有较高的分配速度,可减少访问磁盘的 I/O 频率,故它在诸多分配方式中仍占有一席之地。例如,在前面所介绍的对换方式中,对对换空间一般都采用连续分配方式。对于文件系统,当文件较小(1~4 个盘块)时,仍采用连续分配方式,为文件分配相邻接的几个盘块;当文件较大时,便采用离散分配方式。另外,对于多媒体文件,为了能减少磁头的寻道时间,也采用连续分配方式。

2. 空闲链表法
1)空闲盘块链。

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

尾。

2)空闲盘区链。

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

位示图法

8.2.2 位示图

1. 位示图
位示图是利用二进制的一位来表示磁盘中一个盘块的使用情况。当其值为“0”时,表示对应的盘块空闲;为“1”时,表示已分配。这样,由所有盘块所对应的位构成一个集合,称为位示图。通常可用 m × n 个位数来构成位示图,并使 m × n 等于磁盘的总块数。位示图也可描述为一个二维数组 map[m, n]。


2. 盘块的分配
根据位示图进行盘块分配时,可分三步进行:

1)顺序扫描位示图,从中找出一个或一组其值为“0”的二进制位(“0”表示空闲时)。

2)将所找到的一个或一组二进制位转换成与之相应的盘块号。假定找到的其值为“0”的二进制位位于位示图的第 i 行、第 j 列,则其相应的盘块号应按下式计算:

b = n * (i - 1) + j;

式中,n 代表每行的位数。

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

3. 盘块的回收
盘块的回收分两步:

1)将回收盘块的盘块号转换成位示图中的行号 i 和列号 j 。转换公式为:

i = (b - 1) / n + 1;

j = (b - 1) % n + 1;

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

位示图常用于微型机和小型机中。

8.2.3 成组链接法

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

8.3 提高磁盘I/O速度的途径

其中最主要的技术便是磁盘高速缓存。

8.3.1 磁盘高速缓存(Disk Cache)

磁盘高速缓存的形式

(1) 专用: 在内存中单独开辟一块固定的区域专用。

(2) 共享: 所有空闲内存为缓冲池与请求分页系统共享
1. 数据交付方式

(1) 数据交付

(2) 指针交付

2. 置换算法

常用的算法有:最近最久未使用算法LRU, 最近未使用算法NRU和最少使用算法LFU。

许多系统除了考虑最近最久未使用这一原则外还要考虑:访问频率、可预见性、数据的一致性。

3. 周期性地写回磁盘

根据LRU算法,经常访问的盘块可能长期不被回写,可能导致丢失数据, 可采用周期性(几十秒)地写回磁盘。

8.3.2 提高磁盘I/O速度的其他方法

1. 提前读

预先将下一盘块数据一次读入减少读盘次数。
2. 延迟写

考虑缓冲区的数据不久之后可能还会访问故暂时不写入磁盘, 将它挂在空闲队列的末尾, 当它最久未被访问,到了队列之首要被淘汰时再写入磁盘。
3. 优化物理块的分布

分配物理块时, 把有可能顺序存取的块放在一起, 尽量分布在同一柱面或相邻柱面上, 从而减少磁盘臂的移动次数。但采用线性链表来组织空闲块时比较困难, 此时, 将同一磁道的若干个盘块组织成一簇, 以簇为单位进行分配, 可减少磁头的平均移动距离。

4. 虚拟盘
利用内存空间区仿真磁盘,又称RAM盘; 断电或关机后虚拟盘的数据将丢失, 因此虚拟盘仅放临时数据。与磁盘高速缓存的区别在于:内容由用户控制,而不是OS控制。

8.3.3 磁盘冗余阵列

1. 并行交叉存取
为提高对磁盘的访问速度, 用N台磁盘驱动器组成磁盘阵列, 系统将数据分为若干个子盘块数据分别存储到各个磁盘的相同位置上,并行传输到内存,由于采用了并行存取方式加快了访问速度N-1倍。

2. 廉价磁盘冗余阵列(Redundant Array of Inexpensive Disk)
为提高磁盘存储数据的可靠性,采用冗余存储; 如: N=7, 6个盘做数据盘,1个盘做奇偶校验盘, 校验盘存储6个数据盘的奇偶校验值; 当某个盘损坏时可以用其它6个盘的数据盘恢复数据; RAID 有 0-7级, 其中 0 级无冗余, 1 级是镜像存储冗余50%, 3 级使用专用校验盘, 5 级将校验值螺旋分布在阵列的所有磁盘上。

3. RAID的优点

可靠性高、磁盘的访问速度高、性能/价格比高。

8.4 提高磁盘可靠性的技术

容错技术是通过在系统中设置冗余部件的办法,来提高系统可靠性的一种技术。
磁盘容错技术往往也被人们称为系统容错技术 SFT。可把它分成三个级别:第一级(SFT-I)是低级磁盘容错技术;第二级(SFT-II)是中级磁盘容错技术;第三级是系统容错技术,它基于集群技术实现容错。

8.4.1. 第一级 磁盘容错技术SFT-1

防止因磁盘表面缺陷造成的数据破坏或丢失, 包括双份目录、双份文件分配表和写后读校验等措施

(1)双份目录和双份文件分配表

(2)热修复重定向和写后读校验

热修复重定向:将磁盘的2~3%作为热修复重定向区

写后读校验:写盘后立即读并与原数据校验

8.4.2. 第二级 磁盘容错技术SFT-2

(1) 磁盘镜像

两个磁盘驱动器互为备份

(2)磁盘双工

通道、磁盘控制器和磁盘驱动都为双份


廉价磁盘冗余阵列(RAID):第5章已介绍块

交错校验



8.4.3 基于集群技术的容器功能

8.4.4 后背习题

8.5 数据一致性控制

同一数据存放在不同的文件中, 对它修改时应对不同的文件都统一修改, 才能保证数据的一致性。修改时数据的流向是, 磁盘块内存写回磁盘块。若在写回之前, 系统崩溃, 则文件系统数据出现不一致。


系统应配置保证数据一致性的软件和相应的硬件,硬件采取冗余技术配置一个高度可靠的存储系统, 称为稳定存储器; 目前广泛采用磁盘双工方式来实现稳定存储器。设计保证数据一致性的实用程序, 当系统再次启动时, 运行该程序, 检查磁盘块和目录系统。



8.5.1 事务

1. 事务的定义
事务是用于访问和修改数据的一个程序单位, 由一系列相关的读写操作组成; 被访问的数据可以分散在不同位置, 只有一系列读写操作全部完成才能以托付操作(Commit Operation)终止操作; 而只要有一个操作失败就执行夭折操作(Abort Operation)。


为了保证数据的一致性, 对于夭折事务所操作过的数据必须恢复原来的状态, 使该事务退回(rolled back),保证一个事务对一批数据修改操作,要么全部完成要么 一个也不修改, 这种特性称事务的原子性。

2. 事务记录(Transaction Record)
为了实现事务的原子修改, 用事务记录这种数据结构来实现, 它被存放在稳定存储器中, 用来存储事务运行时数据项修改的全部信息, 故又称为运行记录(Log), 该记录包括下列字段:

事务名

数据项名

旧值

新值
3. 恢复算法
如果系统发生故障,应对以前的事务进行清理, 通过查找事务记录表做如下操作:

(1) 如果在Log表中只有(Ti开始)记录无(Ti托付)记录则调用undo(Ti ) 把所有被Ti修改过的数据恢复为原值。

(2)如果在Log表中既有(Ti开始)记录又有(Ti托付)记录则调用redo(Ti ) 把已被Ti修改过的数据设置为新值。

8.5.2 检查点(Check Points)

1. 检查点的作用
引入检查点的主要目的,是为了对事务记录的清理工作经常化, 设置检查点记录; 每隔一定的时间做一次清理:

将内存中的当前事务记录表的所有记录, 和所有已修改的数据, 输出到稳定存储器中; 再将检查点记录输出到稳定存储器中; 每当出现一个检查点记录便执行恢复操作。
2. 新的恢复算法
发生故障后,恢复算法只需对最后一个检查点之后的事务记录进行处理。

即从最后一个检查点之后的第一个事务记录开始,对所有的事务Tk , 在Log表中出现(Tk托付)记录则执行redo(Tk ), 未出现(Tk托付)记录则执行undo(Tk )。

8.5.3 并发控制

由于事务具有的原子性, 使得一个事务执行完后才允许另一事务执行, 即事务对数据项的修改是互斥的,事务的这种特性称为顺序性,将实现顺序性的技术称为并发控制。可以用互斥信号量来保证事务处理的顺序性,但用的最广的是“锁”。
1. 利用互斥锁实现顺序性
设置一种用于实现互斥的锁, 简称互斥锁,为每一个共享对象设一把互斥锁, 如果事务 Ti 需要对一批对象进行访问,则为了保证事务操作的原子性, 应先获得这批对象的互斥锁, 将他们全部锁住, 如果成功便可以对这批对象执行读写操作,然后全部开锁, 若某对象已被其它事务锁住, 则Ti 要将已锁住的对象全部开锁。

2. 利用互斥锁和共享锁实现顺序性
对于共享文件,写只能互斥进行, 但读操作却允许多个事务同时去读, 显然用互斥锁不能实现同时读, 为此引入另一种锁共享锁。互斥锁仅允许一个事务对相应的对象执行读或写, 共享锁则允许多个事务对相应的对象执行读操作, 同时不允许任何一个事务对相应的对象执行写操作。类似于读者写者问题。

8.5.4 重复数据的一致性问题

1.重复文件的一致性

以UNIX类型的文件系统为例,通常一个文件的目录项由一个文件名和一个索引结点号组成; 当有重复文件时, 一个文件的目录项由一个文件名和若干个索引结点号组成。保证重复文件的一致性用两种方法:

(1) 当一个文件被修改后,可查目录, 从各i结点找到各拷贝的物理位置, 对这些拷贝做同样修改。

(2) 为新修改的文件建立几个新拷贝取代原来的拷贝。


2. 盘块号一致性的检查

两张表,每块对应一个表中的计数器,初值为0

表一:记录了每块在空闲块表中出现的次数

表二:记录了每块在文件中出现的次数




最后

请您阅读文章声明,默认同意该声明

相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
相关文章
|
7月前
|
缓存 Linux UED
深入理解操作系统的虚拟内存管理
【5月更文挑战第30天】 在现代计算机系统中,虚拟内存是允许用户程序逻辑地址空间与物理内存解耦的关键概念。此技术不仅增强了多任务处理能力,还提供了内存保护和简化了内存管理。尽管虚拟内存的基本概念广为人知,但本文将探讨其背后的机制,以及如何通过分页和分段优化系统性能。我们将分析虚拟内存对操作系统稳定性的影响,并讨论当前操作系统中虚拟内存管理的最佳实践。
|
7月前
|
安全 算法 网络协议
探索Linux操作系统的内核管理
【5月更文挑战第31天】本文将深入探讨Linux操作系统的内核管理机制,包括其设计原则、主要组件以及它们如何协同工作以提供高效的系统性能。通过分析Linux内核的关键特性和功能,我们将揭示这一开源操作系统如何在各种计算环境中保持其稳定性和灵活性。
|
5月前
|
算法
深入理解操作系统的虚拟内存管理
【7月更文挑战第24天】在现代操作系统中,虚拟内存管理是一项至关重要的技术,它允许系统拥有比物理内存更大的地址空间,从而提升多任务处理能力。本文将详细探讨虚拟内存的工作原理、关键技术及其对操作系统性能的影响,帮助读者构建对虚拟内存管理的深入理解。
|
5月前
|
Cloud Native Devops 数据库
云原生架构:未来软件开发的引擎深入理解操作系统的虚拟内存管理
【7月更文挑战第30天】在这篇文章中,我们将深入探讨云原生架构的概念,以及它如何改变软件开发的世界。我们将从云原生的基本概念开始,然后深入到它的关键技术和实践,最后讨论它对软件开发的未来影响。无论你是软件开发者,还是IT专业人士,这篇文章都将为你提供深入理解和掌握云原生架构的重要信息。 【7月更文挑战第30天】在数字世界的构建中,虚拟内存是操作系统不可或缺的一环。本文将探索虚拟内存的核心概念、工作机制及其对现代计算环境的重要性,同时揭示其背后的技术细节和面临的挑战。
52 3
|
5月前
|
缓存 算法
操作系统的虚拟内存管理
【7月更文挑战第29天】本文深入探讨了操作系统中至关重要的虚拟内存管理机制,包括其设计原理、实现方式以及在现代计算机系统中的作用。通过分析分页系统、分段系统、页面置换算法和内存分配策略,揭示了虚拟内存如何优化资源利用,提高系统性能,并确保进程间的安全性与隔离性。此外,文章还讨论了虚拟内存管理面临的挑战及未来的发展方向。
|
5月前
|
缓存 算法 程序员
深入理解操作系统中的虚拟内存管理
【7月更文挑战第14天】本文将深入探讨操作系统中至关重要的组成部分——虚拟内存管理。通过分析其设计原理、实现机制以及性能优化策略,旨在为读者提供一个全面而深入的视角来理解虚拟内存在现代操作系统中的作用和重要性。文章不仅会涵盖虚拟内存的基本概念和功能,还会讨论其在多任务处理、内存保护及系统性能提升方面的贡献。
|
5月前
|
算法 Linux 调度
操作系统中的虚拟内存管理:原理与实现
本文深入探讨了操作系统中虚拟内存管理的核心概念,包括分页、分段、需求分页和页面置换算法。通过分析现代操作系统如Linux和Windows的虚拟内存实现机制,文章揭示了虚拟内存在提升内存利用率、进程隔离和保护内存中的关键作用。同时,讨论了虚拟内存管理面临的挑战,如内存泄漏、碎片化以及性能开销,并提出了相应的优化策略。
|
6月前
|
算法
深入理解操作系统中的虚拟内存管理
【6月更文挑战第19天】在现代操作系统中,虚拟内存管理是一个至关重要的组件。它不仅使得程序能够在有限的物理内存中运行更大的地址空间,还为系统提供了多任务处理能力。本文将深入探讨虚拟内存的概念、实现机制以及它在操作系统中的重要性,同时也会讨论虚拟内存管理中遇到的挑战和解决方案。
85 4
|
6月前
|
Python
Python中使用os库管理环境变量
在Python中,可以使用os库来管理操作系统的环境变量。通过os.environ对象,我们可以获取、修改和删除环境变量的值。
125 3
|
5月前
|
Windows 内存技术
nvm 管理和切换 node版本(windows操作系统)
nvm 管理和切换 node版本(windows操作系统)
90 0
下一篇
DataWorks