当前课程知识点:操作系统 >  第五讲 物理内存管理: 连续内存分配 >  5.2 地址空间和地址生成 >  5.2 地址空间和地址生成

返回《操作系统》慕课在线视频课程列表

5.2 地址空间和地址生成在线视频

5.2 地址空间和地址生成

下一节:5.3 连续内存分配

返回《操作系统》慕课在线视频列表

5.2 地址空间和地址生成课程教案、知识点、字幕

我们刚才对内存管理的功能

进行了一个基本的讨论

接下来在讨论具体的内存管理算法之前

我们有必要来讨论一下

内存管理当中地址的生成

我们说 从你写的程序里用到的符号

到最后在总线上出现的物理地址

这中间有一个转换的过程

在具体说转换算法之前

我们需要知道地址的生成过程

和在生成过程当中并不是任何一个

你想要访问的地址都是会允许你访问的

这里还有一些安全的检查

或者说合法性的检查在里头

接下来我们看地址空间的定义

我们在机器里总线上看到的地址

是这里我们所说的 物理地址

所有的物理地址空间所构成的空间

叫做物理地址空间

它是由硬件支持的

通常情况下 比如说

我们机器里说有多少位地址总线

指的就是这里的物理地址总线的条数

比如说32位的

通常情况下就是32条地址线

在我们这里它的编号是从0

比如说32位 是0到4G减一

那么这是从0开始一直到它最大编号

这个编号在存储单元角度来讲是唯一的

但是这种唯一

实际上对于我们写程序来讲

是不太容易来使用的

因为我到底用哪个地址

在程序写成之前 或者运行之前

我可能是不知道的

那么这样一来

我们在这里用到第二个地址

是逻辑地址

逻辑地址是CPU运行的时候

里边的进程看到的地址空间

那通常情况下

对应我们可执行文件里的那一段区域

加载程序的时候

你的程序加载到内存当中 它变成进程

这个时候在你的可执行文件里的

0到它最大值

这个地方在相应地址空间里有一段区域

这段区域就是我们进程的逻辑地址空间

逻辑地址转换成物理地址

就是我们后面会说到的方法

那么这时我们这里访问到一条指令

这条指令在执行的过程中

它会访问相应的内存单元

这些内存单元的地址从哪来

就是从这 逻辑地址

根据我们后面会说到方法

转换成物理地址

最后在总线上访问相应的存储单元

我们在后边 一直说需要大家理解

我到底用到逻辑地址

物理地址分别是什么

它们之间的转换过程是什么样子

接下来我们看逻辑地址的生成

大家在写程序的时候 通常情况下

现在我们写程序都是用高级语言

高级语言里头 这就是一个小例子

一个程序 它有一个保留字

prog到end

这是它的开始和结束标志

然后中间我调用了一个函数

这个函数就是一个地址

我们通常在写函数的时候

里头你不会写 比如说0X多少多少

作为你的函数的名字

这个很不容易记

我们会用一个符号来表示

用符号之后 不同的函数之间

这些符号之间

它们就没有一个先后顺序的关系

那你放到内存里头

我可以把它放到任何一个位置

这是我们在写程序源代码的时候

你所希望见到状态

然后这个源代码我们就会进行一次编译

源代码里的这些语句

我们的CPU是没办法直接认识

我们为了让CPU能认识

必须转化成CPU能认识的指令

指令我们转换出来的第一步

是把它转变成机器能认识的指令的汇编码

这是汇编指令

这样转换过来之后

我们看到它会转变成函数调用

jmp或者是call

都是会有的

然后后面仍然用的是符号名字

这还只是汇编的源代码

那我们通过编译之后得到汇编码

然后我们会再对它进行一次汇编

汇编之后实际上我们就变成了二进制代码了

这个时候就是实实在在是机器能认识的指令

这个时候里头的符号就不能再是

我们前面讲的这些字符串了

而必须是地址空间里的某一个位置

比如这个地方就是75

那75 这是从0

假定这个长度是蹦到这个位置

那么就是你在当前的位置蹦到75

这个地方用到的就是编号

这是一个编号实际上是

在这里头我可能会用到别的符号

别的地址

比如我有一个函数调用

从模块A调用模块B里的一个函数

在这个调用过程中

在你做汇编的时候

另一个模块的位置你并不知道

这时我需要再有一个链接的过程

把多个模块和你用到的函数库

搁在一起 把它排成一个线性的序列

排了之后这个时候我就知道

你跳转的另一个符号的位置在哪

比如说我们在这里头你自己会移动

模块之间也会有

那这个时候我会告诉你

这个地方蹦完之后

我放的位置往后挪了

前面是放的函数库

所以我起头的位置往后挪了100

那我这变成了175

这个175实际上就是从0开始

我只是在这一个文件内的

如果说我的程序这个时候去运行

那么它运行的时候放到什么地方

不一定能正好放到0的位置

那这个时候我在加载的时候

还会再有一个重定位

这个重定位是说我原先的0

这是175

现在我加载进来之后

我把它放到1000的位置

那这1000呢 从1000到1175

这个时候我的跳转

我原来蹦到175

你蹦的位置就错了

我要统一把这个要平移一遍

这我就变成1175

这是你在加载时候的

由操作系统提供的

重定位的功能要干的事情

有了这个之后

我们的程序在跑的时候

它就变成是实实在在的地址了

这是逻辑地址

然后 我们在获取这个地址的时候

可以在什么时候来做到

刚才做的是直接加载的时候

但实际上地址生成机会有这样几个情况

第一个是编译

假定我知道我最后要放的位置

我在编译的时候就可以把这个地址写死

如果是这种情况 你的起始地址发生变化

你就必须重新编译了

这种情况现在在什么地方出现

像我们用到手机

如果说你的手机是功能手机的话

不是智能手机

这个时候里面的程序通常情况是写死的

不允许你买了手机之后

自己再往里装地址本了

或者说装软件之类的

那么这个时候通常情况下

在前面这些都是写死的

还有一种情况是允许你加载到不同地方

比如说像我们现在的智能手机

那你就可以在买到这个手机之后

我再往里加我的程序

这个时候写程序的人就没办法知道

你这个程序最后会加载到

你的系统里的什么地方去

如果是这种情况 我在加载的时候

就必须做重定位

也就是说我根据我装到内存位置里的不同

我要把里头那些符号的名字或者跳转的地址

把它重新捋一遍

通常情况下在我们的可执行文件里头

它前面有一个重定位表

那这个重定项目表

里头包含内容就是

你在这个程序里头

到底哪些地方需要去改的

加载的时候把这个都改成绝对地址

那你的程序就可以跑了

这是我们刚才见的情况

还有一种情况 是执行时生成

这个相当于我们在前面用的

一直就是相对地址

那么到执行的时候

执行到这条指令的时候

我才可以去知道它确切访问的是什么地方

这种情况出现在

我们使用虚拟存储的系统里头

也就是说我执行一条指令

这条指令访问的位置 访问到那之后

有可能你当时把这一块区域

放到内存的某一个位置

这个时候它有一个映射

映射过去之后你找到相应的位置

那这个时候只是在执行这条指令的时候

才会做这种映射

这样做就有一个什么样的好处

我这个程序在执行的过程当中

我就可以把它所在的位置

在物理存储的位置 我可以挪

而如果说是前面两种情况的话

你不但要求你在地址空间是连续的

同时在这里头 它运行起来之后

你是不能再动它的

比如说在这里头我加载的时候做了重定位

我已经写了绝对地址了

由于你存储空间不够

或者说别的程序的存储空间不够

你把它位置往后挪了一段

你这么一挪完之后 你那些位置就不对了

所以从灵活性的角度来讲

我们在执行时候生成这个地址是最好的

而前面几种它有一个好处是简单

所以在这里 不同系统里这几种做法

我们现在都是有采用的

下面我们通过一个例子 图示

来看一下地址的生成过程

这是我们在前面已说到过的系统结构

CPU 内存 I/O设备

我们一条指令的执行

比如说在这里头

CPU当前正在执行一条指令

这条指令是movl指令

这条指令在执行的时候里头有地址

这个地址在CPU里先看到了

然后这个时候我的MMU

它依据这边的页表

来把你这边见到地址翻译成物理地址

翻译成物理地址之后

然后CPU里头有一个控制器

这个控制器负责把你得到的物理地址

和相关总线控制信号送到总线上去

这个时候存储单元 存储芯片

这个时候会识别总线上地址和控制信号

依据你控制信号的 到底是读还是写

总线上有一组相应的持续逻辑的交互

如果是写 就会把这边CPU送过来的数据

写到内存当中 指定的存储单元上

如果读那就从指定的内存单元当中

读出数据 放到数据总线上

然后CPU拿回去

这是它的一个交互过程

在这个交互过程当中 CPU能干什么呢

CPU能干的是

地址转换过程它的影响

实际上在每一次访问的时候

它是不依赖于软件的

是由硬件来完成这个转换的

但这个转换的表

我们是可以通过操作系统

来建立这两者之间的关系

这是我们后边会说到的页表的功劳

接下来我们讨论

在地址生成过程当中的地址检查

这里是一个图示

说明我们CPU在执行指令的时候

它的地址处理过程 生成过程

这是一条movl指令

movl指令在CPU执行过程当中

它会产生逻辑地址

这个逻辑地址

比如我访问的是数据段的数据

那好 这时候数据段

它有一个段基址和段的长度

如果说你从数据段去访问的

偏移量超过这个长度

这个时候的这个访问应该是非法的

对于这种情况 在每次访问的时候

每一条指令在访问的时候

它都会去检查你的段的长度和偏移量

是不是有效的范围

如果不是

那么这个时候就走上面这一条

告诉你内存访问异常

这条指令执行失败

进行相应的错误处理

这个由操作系统来做

另一种情况是说

这里检查完的结果

你访问的偏移量

是在0和你的最大长度之间

我认为这是合理的 是合法的

这个时候它会和段基址加在一起

得到你的物理地址

比如说在这500 1000

那就是1500

从这访问到你对应进程的

物理地址空间里去

那在这个过程中我们说

操作系统可以通过用指令来

设置相应的长度和段基址

这是会我们可以通过软件方法来

影响到我这里做相应检查

有了这个检查之后我们就有了

从符号一直到你的逻辑地址

逻辑地址在执行过程当中转变成物理地址

并且在这个过程中有相应的检查机制

这是我们在这里说到地址的生成和检查

操作系统课程列表:

第零讲 在线教学环境准备

-0.1 Piazza讨论区

--piazza访问和使用

--html

-0.2 在线实验平台

--实验平台使用帮助

--平台使用帮助

--Gitlab使用帮助

--IBM内部账号初始化

-0.2在线实验平台

--Raw HTML

第一讲 操作系统概述

-1.1 课程概述

--视频

-第一讲 操作系统概述--练习

-1.2 教学安排

--视频

-1.3 什么是操作系统

--Video

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

--Video

-1.5 操作系统实例

--视频

-1.6 操作系统的演变

--视频

-1.7 操作系统结构

--视频

第二讲 实验零 操作系统实验环境准备

-2.1 前言和国内外现状

--2.1 前言和国内外现状

-2.2 OS实验目标

--2.2 OS实验目标

-2.3 8个OS实验概述

--2.3 8个OS实验概述

-2.4 实验环境搭建

--2.4 实验环境搭建

-2.5 x86-32硬件介绍

--2.5 x86-32硬件介绍

-2.6 ucore部分编程技巧

--2.6 ucore部分编程技巧

-2.7 演示实验操作过程

--2.7 演示实验操作过程

--Q6

--Q7

--Q10

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

-3.1 BIOS

--3.1 BIOS

-3.2 系统启动流程

--3.2 系统启动流程

-3.3 中断、异常和系统调用比较

--3.3 中断、异常和系统调用比较

-第三讲 启动、中断、异常和系统调用--3.3 中断、异常和系统调用比较

-3.4 系统调用

--3.4 系统调用

-第三讲 启动、中断、异常和系统调用--3.4 系统调用

-3.5 系统调用示例

--3.5 系统调用示例

-3.6 ucore+系统调用代码

--3.6 ucore+系统调用代码

第四讲 实验一 bootloader启动ucore os

-4.1 启动顺序

--4.1 启动顺序

-4.2 C函数调用的实现

--4.2 C函数调用的实现

-4.3 GCC内联汇编

--4.3 GCC内联汇编

-4.4 x86中断处理过程

--4.4 x86中断处理过程

-4.5 练习一

--4.5 练习一

-4.6 练习二

--4.6 练习二

-4.7 练习三

--4.7 练习三

-4.8 练习四 练习五

--4.8 练习四练习五

-4.9 练习六

--4.9 练习六

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

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

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

-5.2 地址空间和地址生成

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

-5.3 连续内存分配

--5.3 连续内存分配

-5.4 碎片整理

--5.4 碎片整理

-5.5 伙伴系统

--5.5 伙伴系统

-第五讲 物理内存管理: 连续内存分配--5.6 练习

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

-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 段页式存储管理

--6.7 段页式存储管理

-第六讲 物理内存管理: 非连续内存分配--6.8 练习

第七讲 实验二 物理内存管理

-7.1 了解x86保护模式中的特权级

--7.1 了解x86保护模式中的特权级

-第七讲 实验二 物理内存管理--7.1 了解x86保护模式中的特权级

-7.2 了解特权级切换过程

--7.2 了解特权级切换过程

-第七讲 实验二 物理内存管理--7.2 了解特权级切换过程

-7.3 了解段/页表

--7.3 了解段/页表

-第七讲 实验二 物理内存管理--7.3 了解段/页表

-7.4 了解UCORE建立段/页表

--7.4 了解ucore建立段/页表

-第七讲 实验二 物理内存管理--7.4 了解UCORE建立段/页表

-7.5 演示lab2实验环节

--7.5 演示lab2实验环节

第八讲 虚拟存储概念

-8.1 虚拟存储的需求背景

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

-8.2 覆盖和交换

--8.2 覆盖和交换

-8.3 局部性原理

--8.3 局部性原理

-8.4 虚拟存储概念

--8.4 虚拟存储概念

-8.5 虚拟页式存储

--8.5 虚拟页式存储

-8.6 缺页异常

--8.6 缺页异常

第九讲 页面置换算法

-9.1 页面置换算法的概念

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

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

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

-第九讲 页面置换算法--9.2 最优算法、先进先出算法和最近最久未使用算法

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

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

-第九讲 页面置换算法--9.3 时钟置换算法和最不常用算法

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

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

-第九讲 页面置换算法--9.4 Belady现象和局部置换算法比较

-9.5 工作集置换算法

--9.5 工作集置换算法

-第九讲 页面置换算法--9.5 工作集置换算法

-9.6 缺页率置换算法

--9.6 缺页率置换算法

-第九讲 页面置换算法--9.6 缺页率置换算法

-9.7 抖动和负载控制

--9.7 抖动和负载控制

第十讲 实验三 虚拟内存管理

-10.1 实验目标:虚存管理

--10.1 实验目标:虚存管理

-第十讲 实验三 虚拟内存管理--10.1 实验目标:虚存管理

-10.2 回顾历史和了解当下

-- 10.2 回顾历史和了解当下

-第十讲 实验三 虚拟内存管理--10.2 回顾历史和了解当下

-10.3 处理流程、关键数据结构和功能

--10.3 处理流程、关键数据结构和功能

-第十讲 实验三 虚拟内存管理--10.3 处理流程、关键数据结构和功能

-10.4 页访问异常

--10.4 页访问异常

-第十讲 实验三 虚拟内存管理--10.4 页访问异常

-10.5 页换入换出机制

--10.5 页换入换出机制

-第十讲 实验三 虚拟内存管理--10.5 页换入换出机制

第十一讲 进程和线程

-11.1 进程的概念

--11.1 进程的概念

-第十一讲 进程和线程--11.1 进程的概念

-11.2 进程控制块

--11.2 进程控制块

-第十一讲 进程和线程--11.2 进程控制块

-11.3 进程状态

--11.3 进程状态

-第十一讲 进程和线程--11.3 进程状态

-11.4 三状态进程模型

--11.4 三状态进程模型

-11.5 挂起进程模型

--11.5 挂起进程模型

-第十一讲 进程和线程--11.5 挂起进程模型

-11.6 线程的概念

--11.6 线程的概念

-第十一讲 进程和线程--11.6 线程的概念

-11.7 用户线程

--11.7 用户线程

-第十一讲 进程和线程--11.7 用户线程

-11.8 内核线程

--11.8 内核线程

-第十一讲 进程和线程--11.8 内核线程

第十二讲 进程控制

-12.1 进程切换

--12.1 进程切换

-第十二讲 进程控制--12.1 进程切换

-12.2 进程创建

--12.2 进程创建

-第十二讲 进程控制--12.2 进程创建

-12.3 进程加载

--12.3 进程加载

-第十二讲 进程控制--12.3 进程加载

-12.4 进程等待与退出

--12.4 进程等待与退出

-第十二讲 进程控制--12.4 进程等待与退出

第十三讲 实验四 内核线程管理

-13.1 总体介绍

--13.1 总体介绍

-13.2 关键数据结构

--13.2 关键数据结构

-13.3 执行流程

--13.3 执行流程

-13.4 实际操作

--13.4 实际操作

第十四讲 实验五 用户进程管理

-14.1 总体介绍

--14.1 总体介绍

-14.2 进程的内存布局

--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.5 进程复制

-14.6 内存管理的copy-on-write机制

--14.6 内存管理的copy-on-write机制

第十五讲 处理机调度

-15.1 处理机调度概念

--15.1 处理机调度概念

-第十五讲 处理机调度--15.1 处理机调度概念

-15.2 调度准则

--15.2 调度准则

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

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

-第十五讲 处理机调度--15.3 先来先服务、短进程优先和最高响应比优先调度算法

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

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

-第十五讲 处理机调度--15.4 时间片轮转、多级反馈队列、公平共享调度算法和uc

-15.5 实时调度和多处理器调度

--15.5 实时调度和多处理器调度

-第十五讲 处理机调度--15.5 实时调度和多处理器调度

-15.6 优先级反置

--15.6 优先级反置

-第十五讲 处理机调度--15.6 优先级反置

第十六讲 实验六 调度器

-16.1 总体介绍和调度过程

--16.1 总体介绍和调度过程

-16.2 调度算法支撑框架

--16.2 调度算法支撑框架

-16.3 时间片轮转调度算法

--16.3 时间片轮转调度算法

-16.4 Stride调度算法

--16.4 Stride调度算法

第十七讲 同步互斥

-17.1 背景

--17.1 背景

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

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

-第十七讲 同步互斥--17.2 现实生活中的同步问题

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

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

-第十七讲 同步互斥--17.3 临界区和禁用硬件中断同步方法

-17.4 基于软件的同步方法

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

-第十七讲 同步互斥--17.4 基于软件的同步方法

-17.5 高级抽象的同步方法

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

-第十七讲 同步互斥--17.5 高级抽象的同步方法

第十八讲 信号量与管程

-18.1 信号量

--18.1 信号量

-第十八讲 信号量与管程--18.1 信号量

-18.2 信号量使用

--18.2 信号量使用

-第十八讲 信号量与管程--18.2 信号量使用

-18.3 管程

--18.3 管程

-第十八讲 信号量与管程--18.3 管程

-18.4 哲学家就餐问题

--18.4 哲学家就餐问题

-18.5 读者-写者问题

--18.5 读者-写者问题

第十九讲 实验七 同步互斥

-19.1 总体介绍

--19.1 总体介绍

-19.2 底层支撑

--19.2 底层支撑

-第十九讲 实验七 同步互斥--19.2 底层支撑

-19.3 信号量设计实现

--19.3 信号量设计实现

-第十九讲 实验七 同步互斥--19.3 信号量设计实现

-19.4 管程和条件变量设计实现

--19.4 管程和条件变量设计实现

-第十九讲 实验七 同步互斥--19.4 管程和条件变量设计实现

-19.5 哲学家就餐问题

--19.5 哲学家就餐问题

第二十讲 死锁和进程通信

-20.1 死锁概念

--20.1 死锁概念

-第二十讲 死锁和进程通信--20.1 死锁概念

-20.2 死锁处理方法

--20.2 死锁处理方法

-第二十讲 死锁和进程通信--20.2 死锁处理方法

-20.3 银行家算法

--20.3 银行家算法

-第二十讲 死锁和进程通信--20.3 银行家算法

-20.4 死锁检测

--20.4 死锁检测

-第二十讲 死锁和进程通信--20.4 死锁检测

-20.5 进程通信概念

--20.5 进程通信概念

-第二十讲 死锁和进程通信--20.5 进程通信概念

-20.6 信号和管道

--20.6 信号和管道

-第二十讲 死锁和进程通信--20.6 信号和管道

-20.7 消息队列和共享内存

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

-第二十讲 死锁和进程通信--20.7 消息队列和共享内存

第二十一讲 文件系统

-21.1 文件系统和文件

--21.1 文件系统和文件

-第二十一讲 文件系统--21.1 文件系统和文件

-21.2 文件描述符

--21.2 文件描述符

-第二十一讲 文件系统--21.2 文件描述符

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

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

-第二十一讲 文件系统--21.3 目录、文件别名和文件系统种类

-21.4 虚拟文件系统

--21.4 虚拟文件系统

-第二十一讲 文件系统--21.4 虚拟文件系统

-21.5 文件缓存和打开文件

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

-第二十一讲 文件系统--21.5 文件缓存和打开文件

-21.6 文件分配

--21.6 文件分配

-第二十一讲 文件系统--21.6 文件分配

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

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

-第二十一讲 文件系统--21.7 空闲空间管理和冗余磁盘阵列RAID

第二十二讲 实验八 文件系统

-22.1 总体介绍

--22.1 总体介绍

-第二十二讲 实验八 文件系统--22.1 总体介绍

-22.2 ucore 文件系统架构

--22.2 ucore 文件系统架构

-第二十二讲 实验八 文件系统--22.2 ucore 文件系统架构

-22.3 Simple File System分析

--22.3 Simple File System分析

-第二十二讲 实验八 文件系统--22.3 Simple File System分析

-22.4 Virtual File System分析

--22.4 Virtual File System分析

-第二十二讲 实验八 文件系统--22.4 Virtual File System分

-22.5 I/O设备接口分析

--22.5 I/O设备接口分析

-第二十二讲 实验八 文件系统--22.5 I/O设备接口分析

-22.6 执行流程分析

--22.6 执行流程分析

第二十三讲 I/O子系统

-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

--html

5.2 地址空间和地址生成笔记与讨论

也许你还感兴趣的课程:

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