当前课程知识点:操作系统(RISC-V) >  第十七讲 文件系统概念 >  17.7 空闲空间管理和冗余磁盘阵列RAID >  17.7 空闲空间管理和冗余磁盘阵列RAID

返回《操作系统(RISC-V)》慕课在线视频课程列表

17.7 空闲空间管理和冗余磁盘阵列RAID在线视频

17.7 空闲空间管理和冗余磁盘阵列RAID

讲义PDF版本参见课程wiki页面:

http://os.cs.tsinghua.edu.cn/oscourse/OS2020spring/lecture17


下一节:18.1 FAT文件系统

返回《操作系统(RISC-V)》慕课在线视频列表

17.7 空闲空间管理和冗余磁盘阵列RAID课程教案、知识点、字幕

下面来我们来讨论

空闲空间的管理

有了前面的文件分区

空闲空间的管理呢

相对来说就变得更容易了

原因在于 这地方我们

不需要记录它的顺序

只需要记录和跟踪文件卷当中

未分配的数据块的分布情况

当然在这里头呢它也会有

跟前面的文件分配不一样的地方

那就是这个里头内容呢

随着文件的创建和删除

它的状态是随时发生变化的

我们在这里 有些什么样的

办法来说这事呢

我们需要考虑的问题是

我用什么样的数据结构

来表示空闲空间的这个列表

我们首先看到第一种呢是位图

每一个块占一位

然后所有的块

对应到所有位放到一起

就构成一个空闲数据块的列表

在这个列表里头呢

零表示对应的数据块i

比如说Di等于0

表示数据块i是空闲的

否则呢就表示这一块

已经分配出去了

用这种办法之后呢

我们看到 如果说你的

文件分区很大的话

那么这时候呢

这个向量表占的空间也是很大的

这地方给出一个例子是说

我有一个160GB的磁盘

然后我4KB为一块

那这样的话

2的30次方乘以160

然后我4K 2的12次方为一块

那这样的话我有40兆数据块

如果说我在这里头呢

每一个8位能表示8个数据块

那就是5M字节的位图

所占用的存储空间

这个空间你是需要频繁进行修改的话

那这时候呢它的修改量也是很大的

与此同时说我们要想去

找到磁盘上一个空闲块

那我需要去查这个表

在查的范围是什么样子呢

假定空闲块的分布呢是均匀的

那这时候我在找所需要花的时间呢

基本上是说磁盘块的总数

和空闲块的数目之间一个比

你占的比例越高它越容易找着

这是位图表示空闲空间的方法

那同时呢也还有其他一些办法

比如说像我们前面说到链表法

我仍然可以用这种方式来表示

每一个空闲块里头呢

有一个指针指向下一块

那这样的话我在这里呢很方便

也能找到我的空闲块组织起来

当然这种办法呢它的开销会比较大

我们也可以把它

跟其他办法组合到一块

那就是这里的链式索引

我最底下一层是用索引

上边用链表

这样的话既可以节省相应的空间

又找起来不是很费事

这是我们用来表示

空闲空间的几种方法

在实际系统里呢

也是这几种方法组合起来使用的

下面我们来讨论磁盘阵列

冗余磁盘阵列raid实际上是一种

提高文件系统可靠性

和读写性能的一组技术

通常情况下我们在访问磁盘的时候

由于磁盘上有磁头的移动

这是一种机械运动

所以它的性能呢相对来说是比较慢的

通常情况下这里头呢

我们会通过磁盘分区

来限制这个寻道的时间

从而提高它的性能

分区是一组柱面的集合

比如说在这里头

我们把一个磁盘上

分成了A B两个分区

那在每一个分区呢

我们都可以视为逻辑上独立的一个磁盘

但实际上它是没办法完全独立的

比如说我在这里头

我要是只在A分区上进行文件读写

那么它的性能是会提高的

但如果说你把这一个磁盘

分成了A和B两个分区

但是你的操作系统

同时在两个分区上进行操作

那么这时候呢在A B分区上进行切换

它的性能呢是很差的

这是一个呢典型的

文件系统分区的做法

我们在这儿呢介绍一个

典型的磁盘文件系统的组织

首先我们说一下文件卷

和磁盘分区的关系

文件卷是指拥有一个完整的

文件系统实例的外存空间

通常情况下它对应到

我们磁盘上一个分区

比如说在这里头

我们把一号磁盘分成A和B两个分区

每一个分区呢有一套自己的

完整的文件系统实例

它有目录 文件

通常前面还有文件卷控制块

还有一种做法呢是说

我们也可以把多个磁盘合在一起

变成一个逻辑的分区

这些呢 它是可以扩大

你的磁盘分区的容量

以便于你能在一个分区里存更多的数据

这些呢 都没有办法

提高我们的读写性能和可靠性

多分区管理呢 实际上就想

利用多个独立的磁盘

同时使用来提高它的性能

也就说通过并行提高它的吞吐量

然后来提高它的可靠性

相当于是说我通过冗余

你比如说数据存多份

来提高它的可靠性和可用性

具体说起来呢冗余磁盘阵列

实际上raid是一组磁盘管理的技术

它通过条带化 映像

和带校验的条带化

来实现对磁盘可靠性性能的提升

这组技术的实现方法呢有两种

一种我们可以做到

操作系统文件系统里头

通过文件系统的卷管理

来实现上面说到这些

冗余磁盘阵列的技术

也可以呢用硬件来实现

用硬件的raid控制器

用这种控制器 实际上在你的操作系统

感觉不到它的存在

就像是用一个分区一样的

下面我们来看这几种冗余磁盘阵列技术

它所能带来的好处和它的具体做法

第一种呢raid0它是一种磁盘条带化技术

它通过把数据块分成若干个子块

然后把这些子块存在独立的磁盘上

注意这地方一定是要独立

我在一个硬盘上

把它分成多个逻辑分区是不起作用的

通过这些独立硬盘上的并行数据块访问

来提高磁盘的带宽

我们看一下具体做法

假定我这儿有三个磁盘

然后在操作系统层面上

看到一个数据块是这样的

那我在存储的时候呢

我把它分成三个子块

这里一行是一块

这是一个示意

然后我把它存到这三个磁盘上

这样的话我如果说是写数据

那么我是三个磁盘同时写

应该它的速度呢会提高接近它的三倍

如果是读呢我可以从三个一块来读

那这时候它速度也会提升三倍

但如果说你读取的数据量小

这时候你读三个

但是我只要第一个里的数据

那这时候它的速度是没有提升的

这是第一种做法 raid0

通过条带化来提高读写的磁盘带宽

从而呢提高它的性能

第二种做法呢是raid1 磁盘镜像

它通过同时向两个磁盘

写入相同的数据

来提高它的可靠性

当然你读取的时候呢

可以从任何一个来读

如果你读的数据可以同时从两个里读的话

那么它的读性能呢也会提高一倍

那它具体做法是什么呢

那这里呢可以提高它的可靠性

可靠性是成倍增加的

而读性能呢它是线性增加的

具体怎么做呢

这有两个物理的硬盘

我们把它划成分区

然后把我数据呢

同时存在这两个上头

这时候写的性能呢是跟原来一样的

然后读的性能呢是会提高的

如果你读很多数据的话

这是磁盘镜像 它的主要特征

是提高可靠性

然后接下来一个呢

是带校验的磁盘条带化

这是我们这里的raid4

它的做法是

把数据块做条带化

并且加了一个校验磁盘

这个校验磁盘呢

专门用来存校验和

这时候你的存储容量

是没有条带化那么高的

但是它的可靠性呢是提高了

也就说N个磁盘的话

它其中有一个错误的时候

它是可以恢复过来的

它允许任意一个故障磁盘出问题的时候

它可以从里头能把数据完整恢复出来

那它具体怎么做呢

假定我这儿有五个磁盘

那我用来存数据采用条带化呢是前面四个

最后一个来存它的校验和

在存校验和的时候呢

我需要依据前面四个数据

来算这个校验和

这是我存的里头

如果我读数据的时候

我需要把它们全部一块读出来

然后去判断它是否正确

任何一个有错

我可以从这里把它恢复回来

这样的话就提高了它的可靠性

也提高了它的读写性能

当然这里的可靠性是说

没有我们刚才这个镜像

可靠性提高那么高

那我在这里头N个磁盘里

N分之一可能性它坏掉

那我是能恢复的

如果更多那它就不行了

再有一个呢

是带分布式校验的磁盘条带化

这种做法呢和raid4相比呢

它就是把校验和的存放位置 做了一个分布

不是把校验和固定的存在校验磁盘上

这样的做法呢

可以把校验磁盘的访问瓶颈呢分摊开

从而提高它的性能

那我们看具体怎么做

我们把每一个数据块分散到这5个磁盘上

第一个X 它的校验和呢

假定我们说它是在5号磁盘上

最后一个

然后下一个时候的呢

它的校验和就不存在这5上了

而是存在1上 这是第二个

第三个时候呢

我再放到第2个磁盘

第四个时候呢再放到第3个(磁盘上)

那这样的话

我们在每次读写的时候呢

这个校验和的这种依赖

也就变得分散开去了

从而这样的话就可以减少

它对校验和所在那个磁盘的读写压力

这是我们说到的几种Raid技术

用来提高它的读写性能和它的可靠性

这些技术呢我们都是基于数据块的

实际上它也可以基于字节

或者基于比特位

这种做法呢 实际上相当于

我们这里raid0 4 5

就我们刚才说都是基于数据块的

raid3呢是基于位的

那这种做法它实际上区别在什么地方呢

假定我有三个磁盘

它做校验怎么办

这是基于每一块里的

每一位组合到一起来使用的

当然现在我们在实际系统里

用最多的还是基于数据块的

这是基于字节和位的磁盘冗余技术

我们还可以再进一步扩展

raid5可以恢复一个磁盘的错误

那如果有多个呢

实际上我们在这里呢有raid6

它增加了两个冗余块

那这样的话我可以允许呢

有两个磁盘出错的时候

它也是可以恢复的

这样的话就进一步提高它的可靠性

当然这种可靠性到底提了多少

要跟你数据重要性和

你对可靠性的要求的不同而不同

与此同时我们这些技术呢

也允许把它嵌套到一起来使用

比如说我们raid0是提高它的性能

而raid1可以提高它的可靠性

那这时候我是不是可以

在提高性能的同时

提高它的可靠性呢

那这时候就把这两个组合起来

那是raid0+1

首先是两个磁盘之间做条带化

这时候呢你往里读写的时候

它的性能会提高

然后在这基础上我再做一个磁盘镜像

这一组和这一组之间做镜像

那么这时候可靠性提高了

当然我们在这里头呢

以用这种办法来提高性能和可靠性

它的成本也是大幅度增加的

所以这是这上头呢

再把它搁在一起变成raid1

组合到一起是raid嵌套

这个嵌套也可以反过来

底下是raid1我先做镜像

然后在这里头呢在上面再套一层raid0

我往两个里头呢同时写

这样的话也是可以起到类似的效果

通过这一系列的技术呢

我们可以在文件系统基础上

来不断提高它的性能和可靠性

这是我们今天说到的文件系统

今天的课就上到这里 下课

操作系统(RISC-V)课程列表:

第一讲 操作系统概述

-1.1 课程概述

--课程概述

-1.2 教学安排

--视频

-1.3 什么是操作系统

--Video

-1.4 为什么学习操作系统,如何学习操作系统

--Video

-1.5 操作系统实例

--视频

-1.6 操作系统的演变

--视频

-1.7 操作系统结构

--视频

-1.8 OS实验概述

--视频

第二讲 操作系统与系统结构和程序设计语言

-2.1 从OS角度看计算机系统

--2.1 从OS角度看计算机系统

-2.2 从OS角度看RISC-V

--2.2 从OS角度看RISC-V

-2.3 Rust语言与系统编程

--2.3 Rust语言与系统编程

-2.4 RISC-V CPU启动

--2.4 RISC-V CPU启动

-2.5 RISC-V CPU启动进一步分析

--2.5 RISC-V CPU启动进一步分析

第三讲 中断、异常和系统调用

-3.1 基本概念与原理

--3.1 基本概念与原理

-3.2 硬件架构支持

--3.2 硬件架构支持

-3.3 中断处理机制

--3.3.1 中断处理机制–Overview

--3.3.2 中断处理机制–Detail-1

--3.3.3 中断处理机制–Detail-2

--3.3.4 中断处理机制–Detail-3

--3.3.5 中断处理机制–Summary

-3.4 系统调用

--3.4 系统调用

第四讲 物理内存管理: 连续内存分配

-4.1 计算机体系结构和内存层次

--4.1 计算机体系结构和内存层次

-4.2 地址空间和地址生成

--4.2 地址空间和地址生成

-4.3 连续内存分配

--4.3 连续内存分配

-4.4 碎片整理

--4.4 碎片整理

-4.5 伙伴系统

--4.5 伙伴系统

-4.6 SLAB分配器

--4.6 SLAB分配器

第五讲 物理内存管理: 非连续内存分配

-5.1 非连续内存分配的需求背景

--5.1 非连续内存分配的需求背景

-5.2 段式存储管理

-- 5.2 段式存储管理

-5.3 页式存储管理

--5.3 页式存储管理

-5.4 页表概述

--5.4 页表概述

-5.5 快表和多级页表

--5.5 快表和多级页表

-5.6 RISC-V页映射机制

--5.6 RISC-V页映射机制

-5.7 使能RISC-V页表

--5.7 使能RISC-V页表

第六讲 虚拟存储概念

-6.1 虚拟存储的需求背景

--6.1 虚拟存储的需求背景

-6.2 覆盖和交换

--6.2 覆盖和交换

-6.3 局部性原理

--6.3 局部性原理

-6.4 虚拟存储概念

--6.4 虚拟存储概念

-6.5 虚拟页式存储

--6.5 虚拟页式存储

-6.6 缺页异常

--6.6 缺页异常

-6.7 RISC-V缺页异常

--6.7 RISC-V缺页异常

第七讲 虚拟存储:局部页面置换算法

-7.1 页面置换算法的概念

--7.1 页面置换算法的概念

-7.2 最优算法、先进先出算法和最近最久未使用算法

--7.2 最优算法、先进先出算法和最近最久未使用算法

-7.3 时钟置换算法和最不常用算法

--7.3 时钟置换算法和最不常用算法

-7.4 Belady现象和局部置换算法比较

--7.4 Belady现象和局部置换算法比较

-7.5 页表自映射

--7.5 页表自映射

第八讲 虚拟存储:全局页面置换算法

-8.1 工作集置换算法

--8.1 工作集置换算法

-8.2 缺页率置换算法

--8.2 缺页率置换算法

-8.3 抖动和负载控制

--8.3 抖动和负载控制

-8.4 面向缓存的页替换算法

--8.4.1 面向缓存的页替换算法-FBR

--8.4.2 面向缓存的页替换算法-LRU-K 2Q

--8.4.3 面向缓存的页替换算法-LIRS

第九讲 进程和线程

-9.1 进程的概念

--11.1 进程的概念

-9.2 进程控制块

--9.2 进程控制块

-9.3 进程状态

--9.3 进程状态

-9.4 三状态进程模型

--9.4 三状态进程模型

-9.5 挂起进程模型

--9.5 挂起进程模型

-9.6 线程的概念

--9.6 线程的概念

-9.7 用户线程

--9.7 用户线程

-9.8 内核线程

--9.8 内核线程

-9.9 进程地址空间与熔断 (meltdown) 漏洞

--9.9 进程地址空间与熔断 (meltdown) 漏洞

第十讲 进程和线程控制

-10.1 进程切换

--10.1 进程切换

-10.2 进程创建

--10.2 进程创建

-10.3 进程加载

--10.3 进程加载

-10.4 进程等待与退出

--10.4 进程等待与退出

-10.5 rCore进程和线程控制

--10.5 rCore进程和线程控制

第十一讲 处理机调度

-11.1 处理机调度概念

--11.1 处理机调度概念

-11.2 调度准则

--11.2 调度准则

-11.3 先来先服务、短进程优先和最高响应比优先调度算法

--11.3 先来先服务、短进程优先和最高响应比优先调度算法

-11.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架

--11.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架

-11.5 实时调度

--11.5 实时调度

-11.6 优先级反置

--11.6 优先级反置

-11.7 rCore调度框架

--11.7 rCore调度框架

第十二讲 多处理机调度

-12.1 对称多处理与多核架构

--12.1 对称多处理与多核架构

-12.2 多处理器调度概述

--12.2 多处理器调度概述

-12.3 O(1)调度

--12.3 O(1)调度

-12.4 CFS调度

--12.4 CFS调度

-12.5 BFS调度算法

--12.5 BFS调度算法

第十三讲 同步互斥

-13.1 背景

--13.1 背景

-13.2 现实生活中的同步问题

--13.2 现实生活中的同步问题

-13.3 临界区和禁用硬件中断同步方法

--13.3 临界区和禁用硬件中断同步方法

-13.4 基于软件的同步方法

--13.4 基于软件的同步方法

-13.5 高级抽象的同步方法

--13.5 高级抽象的同步方法

第十四讲 信号量与管程

-14.1 信号量

--14.1 信号量

-14.2 信号量使用

--14.2 信号量使用

-14.3 管程

--14.3 管程

-14.4 哲学家就餐问题

--14.4 哲学家就餐问题

-14.5 读者-写者问题

--14.5 读者-写者问题

-14.6 Rust语言中的同步机制

--14.6 Rust语言中的同步机制

第十五讲 死锁和并发错误检测

-15.1 死锁概念

--15.1 死锁概念

-15.2 死锁处理方法

--15.2 死锁处理方法

-15.3 银行家算法

--15.3 银行家算法

-15.4 死锁检测

--15.4 死锁检测

-15.5 并发错误检测

--15.5 并发错误检测

第十六讲 进程通信

-16.1 进程通信概念

--16.1 进程通信概念

-16.2 信号和管道

--16.2 信号和管道

-16.3 Linux信号机制

--16.3 Linux信号机制

-16.4 消息队列和共享内存

--16.4 消息队列和共享内存

-16.5 D-Bus机制

--16.5 D-Bus机制

-16.6 Binder机制

--16.6 Binder机制

第十七讲 文件系统概念

-17.1 文件系统和文件

--17.1 文件系统和文件

-17.2 文件描述符

--17.2 文件描述符

-17.3 目录、文件别名和文件系统种类

--17.3 目录、文件别名和文件系统种类

-17.4 虚拟文件系统

--17.4 虚拟文件系统

-17.5 文件缓存和打开文件

--17.5 文件缓存和打开文件

-17.6 文件分配

--17.6 文件分配

-17.7 空闲空间管理和冗余磁盘阵列RAID

--17.7 空闲空间管理和冗余磁盘阵列RAID

第十八讲 文件系统实例

-18.1 FAT文件系统

--18.1 FAT文件系统

-18.2.1 EXT4文件系统-历史

--18.2.1 EXT4文件系统-历史

-18.2.2 EXT4文件系统-支持大容量存储

--18.2.2 EXT4文件系统-支持大容量存储

-18.2.3 EXT4文件系统-支持恢复异常

--18.2.3 EXT4文件系统-支持恢复异常

-18.3 ZFS文件系统

--18.3 ZFS文件系统

第十九讲 I/O子系统

-19.1 I/O特点

--19.1 I/O特点

-19.2 I/O结构

--19.2 I/O结构

-19.3 I/O数据传输

--19.3 I/O数据传输

-19.4 磁盘调度

--19.4 磁盘调度

-19.5 Linux I/O子系统

--19.5 Linux I/O子系统

第二十讲 内核与程序设计语言

-20.1 Linux内核错误分析

--20.1 Linux内核错误分析

-20.2.1 用rust写操作系统-系统编程语言rust

--20.2.1 用rust写操作系统-系统编程语言rust

-20.2.2 用rust写操作系统-rust与操作系统开发

--20.2.2 用rust写操作系统-rust与操作系统开发

第二十一讲 异步编程 (Asynchronous Programming)

-21.1 Background

--21.1 Background

-21.2 Futures in Rust

--21.2 Futures in Rust

-21.3 Generators and async/await

--21.3 Generators and async/await

-21.4 Self-Referential Structs & Pin

--21.4 Self-Referential Structs & Pin

-21.5 Waker and Reactor

--21.5 Waker and Reactor

第二十二讲 Virtual Machine Monitor

-22.1 Overview

--22.1 Overview

-22.2.1 How VMM works - CPU

--22.2.1 How VMM works - CPU

-22.2.2 How VMM works - memory & I/O

--22.2.2 How VMM works - memory & I/O

17.7 空闲空间管理和冗余磁盘阵列RAID笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。