当前课程知识点:操作系统 > 第十五讲 处理机调度 > 15.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架 > 15.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架
下面我们继续来讨论置换算法
那首先我们讨论的
是时间片轮转算法
在时间片轮转算法里头呢
我们首先要约定一个
进程调度的基本时间单位
就这里的时间片
它是处理机资源分配的基本单位
每个进程上来之后执行一个时间片
那我们用下面这个图示
来说明时间片轮转算法
它的基本工作原理
这头呢是CPU
然后这是它的就绪队列
中间会时间片结束的时候
会有时钟中断导致后续的处理
那具体处理是这样的
时间片结束的时候
那按照先来先服务算法
切换到下一个就绪进程
那这里的下一个就绪进程
是排到这里的第一位
好 结束的这个呢
是排到它的队的最后
好 这样一来的话
就是如果有n个进程
那每个进程呢占一个时间片
那这就是每隔n-1个时间片
进程占用一个时间片来执行
那在这个周期性的轮转当中
每一个进程呢分到了1/n的时间
这是时间片轮转算法的基本思路
下面我们通过一个例子
来说明它的运行过程
那这地方呢假定时间片的长度是20
然后现在有四个进程
它们分别的执行时间在这里
下面我看一下 它的执行过程
我们用下面这个图来表示
首先每个进程执行20个时间单位
那在这里头呢 P2呢只有8个
那执行到这儿呢
20到28 它就结束了
好 第一圈执行下来之后呢
进程二就结束了
好 接着来第二圈
那么这时候呢只有三个1 3 4
第二圈结束的时候呢 我们看到
P4又已经全部执行完毕了
那它也退出 整个进程结束
现在还剩P1和P3
好 再接着往下来
到这个时候呢
P1也执行完了P3执行
最后还剩一个P3
好 这是它整个执行过程的
CPU的占用情况
那我们来看看它的等待时间特征
这是四个进程
在执行过程当中的等待时间
我们以其中的一个为例
比如说P1 它执行了几次呢
第一次 第二次 第三次
分三个时间片它就执行完了
那么中间等待的时间是什么呢
起头它是第一个所以没有等待时间
然后第二的话就是20到68
然后第三次是从88到112
那这地方就是68-20
112-88 好 那这个地方呢
这是它的等待时间
那我们算一下
它的平均等待时间 是66.25
那我们看到
这是一个时间片轮转算法
它的运行过程
那我们看到中间等待的时间呢
相对来说比较长的
好 那这时候说
我们时间片到底设置为多长合适呢
那我们说在这里头呢
时间片轮转算法由于它靠时钟中断
强行把正在执行的进程结束掉了
所以它在这儿呢
有额外的上下文切换的开销
不像我们前面的一些算法
它只在进程到等待状态的时候
它才会有进程切换
那我们说在这里头
我们把时间片设多大合适呢
那先看两个极端的情况
时间片很大
大到可以任何一个进程
都在一个时间片内能完成
那这时候它的算法变成什么样了
变成一个先来先服务了
也就是说来了之后
按照来的顺序去就绪队列里排
一次执行肯定结束
那这就变成了先来先服务
而这时候呢它的等待时间呢
就跟我们先来先服务是一样的。
好 那这是很长 不太合适
而对于时间片短
那你比如说我们在这里极端的情况
我大量一半以上的时间是在做切换
执行的时间只是按其中的一半
那么这时候呢
这个上下文切换
它是有很大的开销的
好 这些开销呢
会影响到系统的吞吐量
所以我们这儿呢
时间片大了对进程的响应时间不好
小了对系统的开销不好
那这时候我们要选择一个合适的尺度
目前呢对这个问题呢
只有一些经验值在这里来设
你比如说在这里头我们现在系统
通常情况下呢
它是10毫秒左右一个时间片
这个时间片呢
上下文切换的开销呢是在百分之一左右
好 这是关于时间片的问题
那我们说在这里头
我们想看一下它的这个等待时间
到底是什么样的情况
我们还是以刚才的那个例子来说
那我们把它对照
先来先服务和时间片轮转算法
这两个算法它的等待时间
那我们先假定呢
上下文切换的时间呢为零 忽略不计
好 那这时候我看
每一个做法它的平均等待时间
这地方最后的这两个呢
先来先服务算法到达情况影响很大
所以我们在这儿取两个极端的情况
一个是最差 一个是最好
实际上最好的呢
就相当于是短进程优先
好 最差的呢相当于长进程优先
那中间呢这几个是我取不同的时间片
我们看一下算出来的结果
那这是它的平均等待时间
我们看到最好和最差的情况
都是先来先服务的
所以你到达的序列
对它的实际情况抖动很大
好 而对于时间片轮转呢
那么这时候呢
它基本上是在它们的中间
这是这两种算法的比较
好 那接下来说
每一个进程占用CPU
执行多长时间这件事情定下来了
然后我们排队的事情也定下来了
但这时候 它仍然没有办法
用一个算法满足我们应用的所有需求
好 那这时候 我们就想到
是不是可以把这算法组合到一起
实际上我们刚才的时间片轮转算法
已经是把先来先服务
和时间片划分的这种做法
两个结合到一起
好 那在这儿呢
第一个做法呢就是多级队列调度算法
它把就绪队列分成若干个子队列
每个子队列是相互独立的
比如说我们在这里头
前台 那是交互的应用
那这时候我要求时间片短
那后台呢 是计算时间比较长的
那这时候呢我可能用先来先服务算法
好 这两个交替到一起
我用一个时间片算法
好 然后说我各个队列之间
可以有自己的调度算法
这我们前台 用时间片轮转
后台 用先来先服务
然后队列之间怎么办
那队列之间 既可以说我固定优先级
前台想想是该优先
好 后台呢有空的时候我再来处理
好 这时候就可能有什么
我们前面讨论到的
你按照这个来的话
它就会导致饥饿
就是后台的这些长进程它的优先级低
而且运算时间很长
前台的交互进程的短进程
数量很大的话
那么它就会出现饥饿
好 那说我换种办法
用时间片轮转 那在这里呢
每个队列分得一定的时间配额
保证它总的时间占一定比例
好 那你比如说这里头
前台占80% 后台占20%
前台有作业的时候呢
它可以很好的得到及时的响应
后台呢也不至于完全处于饥饿的状态
在刚才的多极队列里头呢
各个队列之间呢是没有交互的
那进一步往前改进呢
就是多级反馈队列
那么多级反馈队列呢
是队列之间可以相互移动
也就说我一个进程
在执行一段时间可以在队列A
执行一段时间之后
可以把它放到队列B里头
那这种做法呢 它会变得更灵活
比如说我们在这里头一种做法
时间片的大小
我可以在不同队列之间做调整
那优先级越高的
那它时间片越小
优先级越低的呢它时间片越大
好 然后在这里头
如果说你执行的时间越长
我把你的优先级调的更低
那这地方我们用这样一个图示来表示
我这个地方分了N个优先级
由高到低
然后时间片q呢
t0是基本的时间单位
优先级越低 那它就会倍增
好 那这时候每一个进程
上来之后在优先级最高的一级
好 如果说它一个时间片用完
它还没有执行完 那它就降级
好 这样一来的话
我们这个算法就得到这样一个特征
CPU密集型的进程
那它的优先级会逐步降低
并且时间片会分的很大
好 这样的话
它切换的这个开销呢相对来说变小
而对于I/O密集型的进程
那这时候呢它会停留在高优先级上
因为每一次它算的时间都很短
它的时间片没用完
好 这样一来的话
我们有可能在这里
形成一个很好的多级反馈队列的算法
好 在这个算法之上呢
我们又有一类公平共享调度算法
那它强调的是资源访问的公平
把用户和进程分组
一些用户呢比另一些用户重要
那这样的话 它分的时间会更大
然后不重要的这些用户呢
不能让它垄断资源
也就的说按用户的优先级来做这件事情
那实际上我们在这儿
用这个图示来描述
系统资源我在调度器控制下
分成若干组
每一组占用的时间
在执行的过程当中
我是进行相应统计的
好 这样一来的话我们就可以
没有使用完的资源那就按比例分
好 那在这里头呢
如果说我的资源没用到
我所约定的份额
那这时候我优先获得相应的使用权
这些时候呢的问题是说
这个算法到底怎么来实现
它的开销是什么样子
我在这儿就不做仔细介绍了
有兴趣同学可以下去进一步去看
好 到这儿呢我们就说清楚了
六种经典的 或者叫传统的调度算法
每一种算法呢它各有特点
对于先来先服务呢
这个算法是很简单 但它不公平
平均等待时间变动很大
然后改进的一种办法是进程优先
那这时候它不公平
但是有一个特征是平均周转时间最小
然后它有的毛病是
需要预测未来的执行时间
然后可能导致饥饿
好 而高响应比优先呢
实际上它考虑的是我的等待时间
然后在这里呢
它是基于短进程优先来改进的
只是换了一下它排队的指标
然后时间片轮转算法 它是公平的
然后平均等待时间呢性能会比较差
但它的交互性会很好
然后多级反馈队列呢提供一套机制
使得我多种算法可以集成到一起
实际上我们现在
在实际系统里用到的算法呢
基本上是这种综合的算法
只是综合的方式呢
各个系统不一样
而公平共享算法呢
它强调的是
公平是它第一个要衡量的指标
好 那么刚才我们讨论清楚了
这个传统的调度算法当中
各自的特点和基本的做法
那么我们对于实际系统里头
我们还是以ucore为例
介绍一下它的调度算法
是怎么在系统里工作的
首先呢我们看一下它的调度队列
那在调度队列这个数据结构里头
我们看到它有相应的指针结构
来描述我就绪队列的排法
然后每一个进程的相关的
时间片的信息 在这里有描述
好 这样一来的话
就可以通过它把所有的进程串到一起
放到各自的队列当中
从而形成调度算法所需要的调度信息
然后再一个就是说
我们这里调度和进程状态之间的关联
我们前面讲了三进程状态模型
和我们调度之间的关系
而我们的ucore呢更简单
只有两种基本的状态
创建和退出 这两个状态呢
相对来说执行的时间很少
那主要的是可执行和等待状态
那在这里头呢
我们相应的状态转变
分别在这几个相应的函数
你比如说创建结束之后
放在就绪队列里
我们前面已经说过
在proc_init里头
好 那在这里头呢
会有这样几个函数
会导致运行状态的进程变到等待状态
好 等待事件出现的时候
它会回到运行状态
然后exit 它会出来
那在这些状态里头呢
会和我们的进程切换联络到一起
我们看一下它的切换的过程
这是我们进程执行过程当中的
内核和用户态之间的交互
我们如果说只有一个进程的话
在用户态执行
那可能会出现中断或者系统调用
这时候切换到内核
这两个的切换呢对于我们来说
在我们这个层面上来讲是一致的
好 切换过去之后
它保护中断的现场
然后处理中断
正常情况下处理完之后
它回到用户态继续执行了 对吗
好 现在我们在这儿呢
在中间加了一个调度
也就说我处理完了之后
并不是直接恢复最后的现场
而是在这里呢加了一个调度
调度之后呢我就可以到另外的进程
好 另外的进程呢最后会回到这儿来
那这时候我们看一下整个的过程
首先 是在执行的过程当中
出现系统调用
或者说中断 或者说异常
这时候呢它切到内核
那切过来的时候呢
它会保存中断的现场
保存完之后 那我进行中断处理
因为这是要求时间的
那 处理完之后呢
正常情况下我就恢复用户态的现场
然后就回去了
但是现在调度之后
调度的结果 如果说你是
仍然是执行这个进程
那跟原来一样
好 如果说你是执行其它进程
那么就切到另一个进程了
而假定另一个进程
实际上刚才也是执行到这个地方
然后做的切换
那到这儿来的时候呢
它就会回到恢复中断现场
那到这儿呢 确实是恢复中断现场
恢复完之后它怎么办
它就回到用户态去了
就到这儿
好 到用户态继续执行
那在这里执行的过程当中呢
它还会再出现中断
比如说我时间片用完
这时候再出现中断
中断怎么办
跟刚才这地方是一样的
它进到内核态
好 这时候呢保存中断现场
进行中断处理 然后进行调度
调度完了之后
如果说切回上一回执行的那个进程
怎么办
切回去 好 这时候对于这个进程来说
你可以理解为它处理完中断现场
然后恢复用户态的现场
然后回到用户态继续执行
那整个这个切换的过程就完成了
好 然后调度实际在哪
就是由内核态返回到用户态
之前那个时刻
那我做这个调度,
调度完之后到别的了
回来的时候我再恢复
然后回到用户态
这样的话 既不影响到中断的及时处理
也可以让各个进程之间
能够交替运行
好 那这个过程呢
希望大家下去之后
通过实际的ucore代码阅读
来理解这个过程的执行情况
好 那如果说我们在这里
要加自己的调度算法 我怎么加呢
在ucore里呢定义了一个调度类
在这里头呢
约定了调度算法对外提供的接口
比如说我们在这里头
调度算法会什么
我有一个进程变成就绪状态
我如何把它加到就绪队列里头
我要选择下一个进程占用CPU来运行
我选择哪个进程
那这时候呢 对应着两个函数
一个是入队 一个是出队
有了这两个函数之后
我就知道不同的调度算法
就可以按照自己的调度方法
由等待状态变成就绪状态的进程
放到就绪队列里头
也可以从里头选择出
下一个要执行的进程
来从这个就绪队列里头取出来
好 那除此之外还有几个函数
一个是pick_next
就是我选择下一个进程
然后还有一个呢 就是proc_tick
tick实际上相当于
我们在这里呢会支持时钟中断
时钟中断的时候
在不同的调度算法呢
你的计数 或者说对优先级的修改
是不一致的 好 那在这儿有这个
再加上一个初始化 OK
我整个调度算法的内容呢
都可以从这儿和我的系统接起来了
好 那这样一来的话
我的系统其它部分
不需要了解你的调度算法的细则
我只要这个接口能接上
那你的调度算法
就可以在我这个系统里面工作了
好 每个人呢只需要实现这几个函数
你就可以把你自己的调度算法呢实现出来了
并且和系统对接起来
好 那实际上
我们系统里怎么用这些东西呢
那这就是我们ucore调度框架
那我们说在用户态
前面讲进程控制的时候
已经说过了这样一些函数
这些函数都和进程控制相关
然后这地方是调度
其中一部分是直接到这儿来
重要的都是从schedule过来
好 这个地方接的
就是我们刚才说的
调度类接口里的那些接口函数
好 你的实现的函数呢
通过填这个数据结构的函数指针
那把你的调度算法接到这里头来
那上面的系统调用和用户态
通过这一边连到这儿来
那这样的话系统应用
就依据你的调度算法再进行调度
这是ucore的调度框架
那在实验当中呢
要求大家去实现一种
简单的调度算法 叫stride
-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