当前课程知识点:操作系统 > 第二十一讲 文件系统 > 21.7 空闲空间管理和冗余磁盘阵列RAID > 21.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
我往两个里头呢同时写
这样的话也是可以起到类似的效果
通过这一系列的技术呢
我们可以在文件系统基础上
来不断提高它的性能和可靠性
这是我们今天说到的文件系统
今天的课就上到这里 下课
-0.1 Piazza讨论区
--html
-0.2 在线实验平台
--实验平台使用帮助
--平台使用帮助
-0.2在线实验平台
--Raw HTML
-1.1 课程概述
--视频
-第一讲 操作系统概述--练习
-1.2 教学安排
--视频
-1.3 什么是操作系统
--Video
-1.4 为什么学习操作系统,如何学习操作系统
--Video
-1.5 操作系统实例
--视频
-1.6 操作系统的演变
--视频
-1.7 操作系统结构
--视频
-2.1 前言和国内外现状
-2.2 OS实验目标
-2.3 8个OS实验概述
-2.4 实验环境搭建
-2.5 x86-32硬件介绍
-2.6 ucore部分编程技巧
-2.7 演示实验操作过程
--Q6
--Q7
--Q10
-3.1 BIOS
--3.1 BIOS
-3.2 系统启动流程
-3.3 中断、异常和系统调用比较
-第三讲 启动、中断、异常和系统调用--3.3 中断、异常和系统调用比较
-3.4 系统调用
--3.4 系统调用
-第三讲 启动、中断、异常和系统调用--3.4 系统调用
-3.5 系统调用示例
-3.6 ucore+系统调用代码
-4.1 启动顺序
--4.1 启动顺序
-4.2 C函数调用的实现
-4.3 GCC内联汇编
-4.4 x86中断处理过程
-4.5 练习一
--4.5 练习一
-4.6 练习二
--4.6 练习二
-4.7 练习三
--4.7 练习三
-4.8 练习四 练习五
-4.9 练习六
--4.9 练习六
-5.1 计算机体系结构和内存层次
-5.2 地址空间和地址生成
-5.3 连续内存分配
-5.4 碎片整理
--5.4 碎片整理
-5.5 伙伴系统
--5.5 伙伴系统
-第五讲 物理内存管理: 连续内存分配--5.6 练习
-6.1 非连续内存分配的需求背景
-6.2 段式存储管理
-- 6.2 段式存储管理
-6.3 页式存储管理
-6.4 页表概述
--6.4 页表概述
-6.5 快表和多级页表
-6.6 反置页表
--6.6 反置页表
-6.7 段页式存储管理
-第六讲 物理内存管理: 非连续内存分配--6.8 练习
-7.1 了解x86保护模式中的特权级
-第七讲 实验二 物理内存管理--7.1 了解x86保护模式中的特权级
-7.2 了解特权级切换过程
-第七讲 实验二 物理内存管理--7.2 了解特权级切换过程
-7.3 了解段/页表
-第七讲 实验二 物理内存管理--7.3 了解段/页表
-7.4 了解UCORE建立段/页表
-第七讲 实验二 物理内存管理--7.4 了解UCORE建立段/页表
-7.5 演示lab2实验环节
-8.1 虚拟存储的需求背景
-8.2 覆盖和交换
-8.3 局部性原理
-8.4 虚拟存储概念
-8.5 虚拟页式存储
-8.6 缺页异常
--8.6 缺页异常
-9.1 页面置换算法的概念
-9.2 最优算法、先进先出算法和最近最久未使用算法
-第九讲 页面置换算法--9.2 最优算法、先进先出算法和最近最久未使用算法
-9.3 时钟置换算法和最不常用算法
-第九讲 页面置换算法--9.3 时钟置换算法和最不常用算法
-9.4 Belady现象和局部置换算法比较
-第九讲 页面置换算法--9.4 Belady现象和局部置换算法比较
-9.5 工作集置换算法
-第九讲 页面置换算法--9.5 工作集置换算法
-9.6 缺页率置换算法
-第九讲 页面置换算法--9.6 缺页率置换算法
-9.7 抖动和负载控制
-10.1 实验目标:虚存管理
-第十讲 实验三 虚拟内存管理--10.1 实验目标:虚存管理
-10.2 回顾历史和了解当下
-第十讲 实验三 虚拟内存管理--10.2 回顾历史和了解当下
-10.3 处理流程、关键数据结构和功能
-第十讲 实验三 虚拟内存管理--10.3 处理流程、关键数据结构和功能
-10.4 页访问异常
-第十讲 实验三 虚拟内存管理--10.4 页访问异常
-10.5 页换入换出机制
-第十讲 实验三 虚拟内存管理--10.5 页换入换出机制
-11.1 进程的概念
-第十一讲 进程和线程--11.1 进程的概念
-11.2 进程控制块
-第十一讲 进程和线程--11.2 进程控制块
-11.3 进程状态
-第十一讲 进程和线程--11.3 进程状态
-11.4 三状态进程模型
-11.5 挂起进程模型
-第十一讲 进程和线程--11.5 挂起进程模型
-11.6 线程的概念
-第十一讲 进程和线程--11.6 线程的概念
-11.7 用户线程
-第十一讲 进程和线程--11.7 用户线程
-11.8 内核线程
-第十一讲 进程和线程--11.8 内核线程
-12.1 进程切换
-第十二讲 进程控制--12.1 进程切换
-12.2 进程创建
-第十二讲 进程控制--12.2 进程创建
-12.3 进程加载
-第十二讲 进程控制--12.3 进程加载
-12.4 进程等待与退出
-第十二讲 进程控制--12.4 进程等待与退出
-13.1 总体介绍
-13.2 关键数据结构
-13.3 执行流程
-13.4 实际操作
-14.1 总体介绍
-14.2 进程的内存布局
-14.3 执行ELF格式的二进制代码-do_execve的实现
--14.3 执行ELF格式的二进制代码-do_execve的实现
-14.4 执行ELF格式的二进制代码-load_icode的实现
--14.4 执行ELF格式的二进制代码-load_icode的实现
-14.5 进程复制
-14.6 内存管理的copy-on-write机制
-15.1 处理机调度概念
-第十五讲 处理机调度--15.1 处理机调度概念
-15.2 调度准则
-15.3 先来先服务、短进程优先和最高响应比优先调度算法
--15.3 先来先服务、短进程优先和最高响应比优先调度算法
-第十五讲 处理机调度--15.3 先来先服务、短进程优先和最高响应比优先调度算法
-15.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架
--15.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架
-第十五讲 处理机调度--15.4 时间片轮转、多级反馈队列、公平共享调度算法和uc
-15.5 实时调度和多处理器调度
-第十五讲 处理机调度--15.5 实时调度和多处理器调度
-15.6 优先级反置
-第十五讲 处理机调度--15.6 优先级反置
-16.1 总体介绍和调度过程
-16.2 调度算法支撑框架
-16.3 时间片轮转调度算法
-16.4 Stride调度算法
-17.1 背景
--17.1 背景
-17.2 现实生活中的同步问题
-第十七讲 同步互斥--17.2 现实生活中的同步问题
-17.3 临界区和禁用硬件中断同步方法
-第十七讲 同步互斥--17.3 临界区和禁用硬件中断同步方法
-17.4 基于软件的同步方法
-第十七讲 同步互斥--17.4 基于软件的同步方法
-17.5 高级抽象的同步方法
-第十七讲 同步互斥--17.5 高级抽象的同步方法
-18.1 信号量
--18.1 信号量
-第十八讲 信号量与管程--18.1 信号量
-18.2 信号量使用
-第十八讲 信号量与管程--18.2 信号量使用
-18.3 管程
--18.3 管程
-第十八讲 信号量与管程--18.3 管程
-18.4 哲学家就餐问题
-18.5 读者-写者问题
-19.1 总体介绍
-19.2 底层支撑
-第十九讲 实验七 同步互斥--19.2 底层支撑
-19.3 信号量设计实现
-第十九讲 实验七 同步互斥--19.3 信号量设计实现
-19.4 管程和条件变量设计实现
-第十九讲 实验七 同步互斥--19.4 管程和条件变量设计实现
-19.5 哲学家就餐问题
-20.1 死锁概念
-第二十讲 死锁和进程通信--20.1 死锁概念
-20.2 死锁处理方法
-第二十讲 死锁和进程通信--20.2 死锁处理方法
-20.3 银行家算法
-第二十讲 死锁和进程通信--20.3 银行家算法
-20.4 死锁检测
-第二十讲 死锁和进程通信--20.4 死锁检测
-20.5 进程通信概念
-第二十讲 死锁和进程通信--20.5 进程通信概念
-20.6 信号和管道
-第二十讲 死锁和进程通信--20.6 信号和管道
-20.7 消息队列和共享内存
-第二十讲 死锁和进程通信--20.7 消息队列和共享内存
-21.1 文件系统和文件
-第二十一讲 文件系统--21.1 文件系统和文件
-21.2 文件描述符
-第二十一讲 文件系统--21.2 文件描述符
-21.3 目录、文件别名和文件系统种类
-第二十一讲 文件系统--21.3 目录、文件别名和文件系统种类
-21.4 虚拟文件系统
-第二十一讲 文件系统--21.4 虚拟文件系统
-21.5 文件缓存和打开文件
-第二十一讲 文件系统--21.5 文件缓存和打开文件
-21.6 文件分配
-第二十一讲 文件系统--21.6 文件分配
-21.7 空闲空间管理和冗余磁盘阵列RAID
-第二十一讲 文件系统--21.7 空闲空间管理和冗余磁盘阵列RAID
-22.1 总体介绍
-第二十二讲 实验八 文件系统--22.1 总体介绍
-22.2 ucore 文件系统架构
-第二十二讲 实验八 文件系统--22.2 ucore 文件系统架构
-22.3 Simple File System分析
-第二十二讲 实验八 文件系统--22.3 Simple File System分析
-22.4 Virtual File System分析
-第二十二讲 实验八 文件系统--22.4 Virtual File System分
-22.5 I/O设备接口分析
-第二十二讲 实验八 文件系统--22.5 I/O设备接口分析
-22.6 执行流程分析
-23.1 I/O特点
--视频
-第二十三讲 I/O子系统--23.1 I/O特点
-23.2 I/O结构
--816C80A0F5E3B8809C33DC5901307461
-第二十三讲 I/O子系统--23.2 I/O结构
-23.3 I/O数据传输
--C58221E14388B9DB9C33DC5901307461
-第二十三讲 I/O子系统--23.3 I/O数据传输
-23.4 磁盘调度
--567A3F1FCBFB3F4C9C33DC5901307461
-第二十三讲 I/O子系统--23.4 磁盘调度
-23.5 磁盘缓存
--C327536B80D25CE79C33DC5901307461
-第二十三讲 I/O子系统--23.5 磁盘缓存
-html
--html