当前课程知识点:操作系统 > 第二十三讲 I/O子系统 > 23.5 磁盘缓存 > C327536B80D25CE79C33DC5901307461
下面我们来讨论磁盘缓存
磁盘缓存是放在内存里的
磁盘数据的缓存
那这些缓存呢 是为了避免
对同一块磁盘扇区里的内容
进行反复引用时候的多次磁盘访问
我们先说什么是缓存
缓存实际上是数据传输过程当中
双方速度差异比较大的时候
我在中间为了匹配速度
引入的一个中间层
我们这里磁盘缓存呢
就是把磁盘扇区的内容
在内存当中做一个缓存区
如果内存里有
我就可以直接用内存里的缓存数据了
在这儿我们可以看到这种做法
和我们前面讲的虚拟存储很类似
虚拟存储是用磁盘空间
来存内存里存不下的这些数据
而现在这个磁盘缓存是倒过来
所以从这个角度来讲呢
它们俩有很多地方是相似的
但是它们也有很多地方是不一样的
比如说内存和磁盘缓存
磁盘的访问频度呢
它是要远低于虚拟存储的访问频率的
由于访问频率比较低
这个算法我就会做的
比虚拟存储会复杂
磁盘缓存的置换算法到底怎么来做
也就是说我到底该
把哪些磁盘块的内容在内存里做缓存
哪些不做
在具体讨论
一种磁盘缓存置换算法之前
我们先讨论一下单缓存和双缓存
这里单缓存和双缓存呢
指的是这个缓存区
到底是一个还是两个
首先我们来看单缓存
它的做法是什么呢
设了一个缓存区
然后有两头
一头是CPU 一头是设备
设备往这缓存区里写数据的时候呢
由于我只有单缓存
这时候CPU这头呢是不能操作的
等CPU这一头能够从缓存区里
读数据的时候
设备这一头是不能往里写的
大家还记得吗
我们前面讨论到的生产者 消费者问题
就是跟这儿是很类似的
由于在这里我任何一个时刻
只有一个可以对这个缓存区进行操作
它的速度就很受限制
如果说你两边交互频繁的话
那这时候就有我们这里的双缓存
它是设置两个缓存区
在一个缓存区
由一头在进行操作的时候
比如说这里头I/O设备
往缓存区1里头写数据
那么这时候缓存区2呢
就可以由CPU来从里读数据
这两个是可以同时进行的
因为它俩在不同的缓存区里头
一旦是我写完了 这回也读空了
它两头做一个切换
我们两头又都可以继续进行了
这样的话它的交换速度就会更快
有了这个讨论之后 我们来看
磁盘缓存的访问频率置换算法
在这里设计这个算法
要解决的问题是在于
在磁盘访问的时候
我有可能访问某一个扇区里的数据
我频繁的访问
这个频繁的访问如果说我们用LFU的话
那这个计数就会很快速的增加到很大
这时候你再往后用LFU它就不能反映
当前你进行引用的真实情况
我怎么来做呢
它的思路是这样
对于密集访问的这一段
我不对它进行引用计数
基本上说起来就是
在短周期之内我用LRU
在长周期里我用LFU
这样的话我就可以在短周期里头
靠特殊的栈的处理
来描述我的访问顺序
然后在长的时间尺度里
我用LFU来进行访问次数的计数
具体怎么做呢 我们来看
这是访问频率置换算法的示意图
首先这是LRU里的那个特殊的栈
这是栈底 这是栈顶
和前面的LRU不同的地方是在于
我把这个栈分成了三段
第一段叫新区域
第二段叫中间区域
然后第三段叫旧区域
分三段的目的呢
是为了这三段我做不同的处理
具体这种不同的处理在什么地方呢
每一次访问的时候
访问某一块数据块
那我把这一块放到这个栈顶
这是LRU的要求
然后我又附着上两个
如果说你这个引用的这一块
是在新区域里头
它往前移的时候
它的计数是不变的
这就是我们真正的LRU
如果说不是在这新区域里头
是在中间区域或者是旧区域里头
那么引用的时候
不但挪过去并且把计数要加一
那么这样一来我们就可以实现
在新区域里头不加一
避免了你这密集访问所带来的
引用计数的快速增加
而在中间区域和旧区域里头我加一
那这是我们LFU的要求
有了这两个之后呢
我新加入的这些块
我直接把它放到栈顶
这是LRU的要求
并且把它引用计数置为1
然后说我淘汰的时候怎么办呢
原来淘汰说我在这里栈底的
现在它是在旧区域里去找计数最小的
这是LFU的要求
但是和LFU的区别是在于
我不在整个栈里去找计数最小的
有可能这个密集访问
和中间这种新加进来的它的计数很小
这样一来的话就定义这个中间区域
就是为了避免
我的计数刚进来用了没多长时间
它正是我们频繁要使用的
但是由于计数比较小
你把它置换出去的这种情况
我只是在旧区域里头
我才按照计数大小来选
使得这个中间区域呢
变成是一个过渡的
有了这样一种做法之后
我们就把原来在虚拟存储里的算法
改造成一个更复杂
可以用来做磁盘缓存置换算法的
这个访问频率置换算法
这是磁盘缓存置换算法
那到这儿我们就讲完了
I/O子系统里的磁盘缓存
我们把刚才讲过的内容总结一下
我们在这节课里呢
首先对I/O访问的特征进行了一个介绍
我们有多种不同的设备
然后这些设备的访问方式呢
各有各的特点
针对块设备 字符设备
和网络设备这三种不同情况
我们进行不同的处理
然后数据传输我们可以分成
轮询方式 中断方式 DMA方式
这几种方式
是我们在I/O子系统里常用的
然后接下来我们介绍了
我们常用的一种设备
磁盘设备里头的优化
这里面优化又分成两个
一个是我对I/O请求
到底我哪个先去访问
这是磁盘调度讨论的问题
第二个是磁盘缓存
我把磁盘上的数据
哪些放到内存里做缓存
也给了一个算法
I/O设备有很多种
其它各种各样的设备
也有针对各自的特点进行的一些优化
只是由于时间的缘故
我们在这儿没有做深入的讨论了
那到这个地方呢
我们这学期的课就讲完了
好 谢谢大家
我们这节课就上到这里 下课
-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