计算机体系结构及内存分层体系 \color{orange}{\huge{计算机体系结构及内存分层体系}} 计算机体系结构及内存分层体系
计算机体系结构
越靠近 C P U CPU CPU速度越快,存储量越小。
操作系统功能目标
抽象: \red{抽象:} 抽象:软件调用底层的硬件的时候不需要知道明确的存储空间在哪里,只需要知道 逻辑存储空间 \color{olive}{逻辑存储空间} 逻辑存储空间就可以了,但是将逻辑存储空间转换成相应的真正意义上的物理存储空间就是操作系统的工作。
保护: \red{保护:} 保护:软件应用运行之间可能互相破坏其他的地址空间的内容,需要操作系统来进行保护。
共享: \red{共享:} 共享:不同进程之间的数据共享。
虚拟化: \red{虚拟化:} 虚拟化:针对于数据的操作情况,来讲数据放置在合适的位置,将 有限的空间虚拟出很大的空间 ( 可以放置很多数据 ) \color{olive}{有限的空间虚拟出很大的空间(可以放置很多数据)} 有限的空间虚拟出很大的空间(可以放置很多数据)
图中
P
1
\orange{P1}
P1和
P
3
\green{P3}
P3,存于内存中正在等待运行,
P
4
\blue{P4}
P4还排在磁盘中甚至还没有到达内存,但是
虚拟出的效果就好像所有的软件都在内存里面。
\red{虚拟出的效果就好像所有的软件都在内存里面。}
虚拟出的效果就好像所有的软件都在内存里面。
地址空间与地址生成
地址空间
①. 物理地址空间
内存条、磁盘等实打实的存储地址空间。
物理地址空间的管理直接由硬件进行管理。
\red{物理地址空间的管理直接由硬件进行管理。}
物理地址空间的管理直接由硬件进行管理。
物理地址生成整体流程:
\blue{物理地址生成整体流程:}
物理地址生成整体流程:
当
C
P
U
CPU
CPU需要运行软件的时候,①,首先
C
P
U
CPU
CPU中的
A
L
U
(
计算逻辑单元
)
ALU(计算逻辑单元)
ALU(计算逻辑单元)发出请求,请求相关的数据并且给出这些
数据的逻辑地址
\purple{数据的逻辑地址}
数据的逻辑地址,②.之后
C
P
U
CPU
CPU内部的另一个部件
M
M
U
MMU
MMU接受传过来的逻辑地址之后,根据里面存储的内存映射,查询是否存在对应的物理地址。如果找到了就先存储好对应的物理地址,如果没有找到就向内存中的
M
a
p
Map
Map继续寻找。③.最后根据寻找到的物理地址,让主存通过数据总线传输对应位置的数据,然后软件运行。
g a n t a n h a o 操作系统负责建立逻辑地址与物理地址的映射 gantanhao\red{操作系统负责建立逻辑地址与物理地址的映射} gantanhao操作系统负责建立逻辑地址与物理地址的映射
②. 逻辑地址空间
一个运行程序的眼中的地址空间(
一维线性的地址空间
\red{一维线性的地址空间}
一维线性的地址空间)
程序看似好像调用的是逻辑空间中的数据,但是这个逻辑空间地址最终还是对应到实际额的物理地址空间(
对应过程由操作系统完成
\red{对应过程由操作系统完成}
对应过程由操作系统完成)。
逻辑地址生成整体流程: \blue{逻辑地址生成整体流程:} 逻辑地址生成整体流程:
- 源程序:一个 C C C程序。
- 编译: \color{olive}{编译:} 编译:将初始的 C C C程序进行初次编译。
- 汇编: \color{olive}{汇编:} 汇编:将编译后的 C C C程序转化为更为底层的汇编程序。
- 连接 ( L i n k e r ) : \color{olive}{连接(Linker):} 连接(Linker):有些很大的程序是由多个小程序组成的,每个小程序转换为汇编程序后,需要由一个 L i n k e r Linker Linker程序进行重新组织,将所有的小程序都重新整合成一个连续的大程序(对应虚拟地址改变)。、
- 载入 ( L o a d e r ) : \color{olive}{载入(Loader):} 载入(Loader):将整合完毕后的程序加载到内存( 程序重定位 \red{程序重定位} 程序重定位)中。
变量符号对应的逻辑地址 ( 源 C 文件 ) → 实际的逻辑地址 ( 最终转化 ) 变量符号对应的逻辑地址(源C文件)→实际的逻辑地址(最终转化) 变量符号对应的逻辑地址(源C文件)→实际的逻辑地址(最终转化)
访问地址安全问题
软件访问逻辑地址的时候,有可能访问到非法的地址,有关于地址的检查也是操作系统所需要担心的事情。 操作系统会检查程序内存的访问情况,并给出解决方案,及时制止不合法的访问操作。 \red{操作系统会检查程序内存的访问情况,并给出解决方案,及时制止不合法的访问操作。} 操作系统会检查程序内存的访问情况,并给出解决方案,及时制止不合法的访问操作。
连续内存分配
①. 内存碎片问题
- 外碎片 \blue{外碎片} 外碎片:已经分配的单元之间存在的内存碎片。
- 内碎片 \blue{内碎片} 内碎片:已经分配的单元内部也有可能存在无法使用的内存空间。
②. 分区的动态分配
-
第一匹配分配: \red{第一匹配分配:} 第一匹配分配:
整体流程: \blue{整体流程:} 整体流程:从地址的最开始,直接进行搜索,遇到了符合条件的第一个内存地址就直接放入( 第一匹配体现之处 \purple{第一匹配体现之处} 第一匹配体现之处)
需求: \color{olive}{需求:} 需求:
空闲块应该是按照地址顺序进行分布的,分配的时候需要一个合适的分区。
特征: \color{olive}{特征:} 特征:
√: \red{√:} √:简单,非常容易实现,很容易产生更大的空闲块,也就对应着可以存放更大的数据。
× : \red{×:} ×:非常容易产生外部碎片,而且存储非常不稳定。 -
最佳匹配分配: \red{最佳匹配分配:} 最佳匹配分配:
整体流程: \blue{整体流程:} 整体流程:寻找到地址中所有能够放入的地址空间,然后进行排序,将 存储差值最小 \purple{存储差值最小} 存储差值最小的地址空间作为最优解进行放入。
需求: \color{olive}{需求:} 需求:
首先需要有能够放入的存储空间,并且能够对所有满足条件的存储空间进行排序。
特征: \color{olive}{特征:} 特征:
√: \red{√:} √:对于放入的数据都是比较小的时候真的有奇效,实现相对比较简单
× : \red{×:} ×:会产生外部碎片,并且产生的外部碎片有很大的可能不会再被利用。重分配比较慢。