目录
系统设计中缓存的作用
典型问题:
- 请简述什么是局部性原理?
- 存储器可以分为寄存器、主存、辅存?
- 它们各解决了什么问题
存储器的层次结构
- 性能指标:
- 速度,容量,价格
- 容量+价格 =》位价:每比特位价格
- 存储器的层次结构大概可以分为:
- 缓存:
- 例如集成在CPU里高速的缓存和寄存器等等
- 速度快,位价高
- 主存:
- 例如平时的内存条
- 速度适中,位价适中
- 辅存:
- 例如平时的固态硬盘或者说磁盘
- 速度慢,位价低
- 局部性原理
- 局部性原理是指CPU访问存储器时,无论是存取命令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域
- 由于局部性原理存储器的层次结构可以简单地划分为2个层次:
- 缓存-主存层次
- 主存-辅存层次
- 缓存-主存层次
- 原理:局部性原理
- 实现:在CPU与主存之间增加一层速度快(容量小)的Cache(高速缓存)
- Cache是集成在CPU里的,与运算单元放一块
- 这样CPU在读写数据时,可以很快地从CPU内部存储的寄存器里读到这些数据
- 目的:解决主存速度不足的问题
- 主存慢于CPU,2者存在速度差异
- 高速缓存主要就是为了解决主存速度不足的问题
- 主存-辅存层次
- 原理:局部性原理
- 实现:主存之外增加辅助存储器(磁盘、SD卡、U盘等)
- 目的:解决主存容量不足的问题
缓存的设计
- 原理:局部性原理
- 分离冷热数据,降低热点数据服务的负载
- 提升吞吐量、并发量,提升服务质量
虚拟内存
典型问题:
- 请简述什么是虚拟内存
- 大型游戏有几十G,在8G内存的计算机是怎么运行起来的?
虚拟内存
- 由来:
- 有些进程实际需要的内存很大,超过物理内存的容量
- 多道程序设计,使得每个进程可用物理内存更加稀缺
- 不可能无限增加物理内存,物理内存总有不够的时候
- 解决:
- 虚拟内存是操作系统内存管理的关键技术
- 使得多道程序运行和大程序运行成为现实
- 把程序使用内存划分,将部分暂时不使用的内存放置在辅存
- 比喻:
- 虚拟内存(Virtual Memory) 是指计算机呈现出要比实际拥有的内存大得多的内存量
- 因此它允许程序员编制并运行比实际系统拥有的内存大得多的程序
- 这使得许多大型项目也能够在具有有限内存资源的系统上实现
- 一个很恰当的比喻是:你不需要很长的轨道就可以让一列火车从上海开到北京
- 你只需要足够长的铁轨(比如说3公里)就可以完成这个任务
- 采取的方法是把后面的铁轨立刻铺到火车的前面,只要你的操作足够快并能满足要求,列车就能象在一条完整的轨道上运行
- 这也就是虚拟内存管理需要完成的任务
- 附录:
- 逻辑地址:CPU所生成的地址
- 逻辑地址是内部和编程使用的、并不唯一
- 物理地址:加载到内存地址寄存器中的地址,内存单元的真正地址
- 逻辑地址空间:
- 逻辑地址空间是指进程可以使用的内存空间
- 逻辑地址空间的大小仅受CPU地址长度限制
- 32位地址最大逻辑空间为4G
- 逻辑地址空间是一个进程运行时程序指令与程序数据可以用的相对地址空间
- 物理地址空间:
- 物理地址指向物理内存的存储空间
- 物理地址空间是指程序运行过程在物理内存分配和使用的地址空间
- 为什么会有这两种地址?
- 原因在于逻辑地址分配更加灵活,可以允许不唯一,看起来也较为直观
- 例如,一段代码中分配数组,逻辑地址上是连续的,然而在物理地址上,这个数组所占用的页可能分散开来,物理地址上就是不连续的,这样对程序的可理解性上有影响
- 另外,有了逻辑地址这个概念,才能使用虚拟内存技术
- 程序通过逻辑地址空间映射到实际的物理内存再进行读写
- 结语:
- 程序运行时,无需全部装入内存,装载部分即可
- 如果访问页不在内存,则发出缺页中断,发起页面置换
- 从用户层面看,程序拥有很大的空间,即是虚拟内存
- 虚拟内存实际是对物理内存的补充
- 速度接近于内存,成本接近于辅存
- 这点是因为
- 程序使用的数据保存在辅存
- 当程序运行需要读写时才从辅存里加载到主存
- 读写完成后才回写到辅存
- 其实就是局部性原理的实践,发生了数据页面的置换
- 高速缓存替换的时机
- CPU的数据是直接在高速缓存去读写的
- 当高速缓存没有数据时,需要从主存载入所需数据
- 这时就会发生高速缓存的页面置换
- 主存页面的替换时机
- 和上面那个类似
- 当主存没有数据时,需要从辅存载入所需数据
- 替换策略发生在Cache-主存层次、主存-辅存层次
- Cache-主存层次的替换策略主要是为了解决速度问题
- 主存-辅存层次主要是为了解决容量问题
内存管理-缺页中断
典型问题:
- 请简述操作系统中的缺页中断
- 什么是内存页?Linux的内存页一般是多大?
页式存储管理
- 将进程逻辑空间等分成若干大小的页面
- 相应的把物理内存空间分成与页面大小的物理块
- 以页面为单位把进程空间装进物理内存中分散的物理块
- 页表是记录进程逻辑空间与物理空间映射关系的表
- 页面大小应该适中,过大难以分配,过小页表管理空间大
- 页面大小通常是512B~8K
- Linux页面大小一般是4K
- 有一段连续的逻辑分布在多个页面中,将大大降低执行效率
- 因为连续的逻辑肯定是需要连续的去执行的
- 但是由于实际的存储空间是分散的物理内存
- 所以将大大降低执行效率
- 所以有了下面这个
段式存储管理
- 将进程逻辑空间划分为若干段(非等分)
- 段的长度由连续逻辑的长度决定
- 如主函数MAIN,子程序段X,子函数Y等这些程序的逻辑空间长度可能都不相等
- 通过段表可以把每个段的基址和段长都找出来来完成寻址的过程
- 它也映射主存的物理空间
- 所以段地址可以分为段号和段内偏移
- 段式存储管理相比页式存储管理更加灵活
分页和分段对比
- 页是信息的物理单位,主要是为了消减外部碎片,从而提高内存利用率,对用户不可见;
- 段是信息的逻辑单位,主要是为了满足用户需求,对用户可见,用户需要显式给出段名
- 页的大小是固定的;
- 段的大小不是固定的,取决于用户编写的程序
- 分页的地址是一维的,因为相邻的页的地址在数值上是连续的;
- 分段的地址是二维的,因为相邻的段的地址在数值上是非连续的分段比分页更容易实现共享信息和保护信息,共享的前提是纯代码,不属于临界区
- 分页第一次查询页表,第二次访问目标单元;
- 分段第一次查询段表,第二次访问目标单元
分页和分段优缺点
- 分页管理:优点是内存利用率高,不产生外部碎片,只有少许的页内碎片;
- 缺点是不按照逻辑模块编程,没有实现共享信息和保护信息
- 分段管理:优点是按照逻辑模块编程,实现共享信息和保护信息;
- 缺点是段过大时分配连续内存空间不方便,同时产生外部碎片
段页式存储管理
- 分页管理有效提高内存利用率
- 分段管理更加灵活
- 两者结合,形成段页式存储管理
- 过程:
- 先将逻辑空间按段式管理分成若干段
- 再把段内空间按页式管理分成若干页
- 每个页面有对应页地址以及段地址
- 再通过段号,段内页号,页内地址明确找到进程它是属于哪一段哪一页的
缺页中断
- 程序最开始是存储在磁盘的
- 当它需要运行时就加载到内存
- 然后放到缓存给CPU所使用
- 当程序所需要的数据没有保存在主存
- 而是在磁盘里时
- 这时就会有缺页中断的发生:
- 在请求分页系统中,可以通过查询页表中的状态位来确定所要访问的页面是否存在于内存中
- 每当所要访问的页面不在内存时,会产生一次缺页中断
- 此时操作系统会根据页表中的外存地址在外存中找到所缺的一页,将其调入内存
- 有几点要注意:
- 磁盘属于外设,读写磁盘需要系统调用
- 处理中断典型过程:
- 保护CPU现场->分析中断原因->中断处理->恢复CPU环境
- 保护CPU现场和恢复CPU环境其实就属于进程的切换
- 也就是当前进程进入了阻塞状态,并且被切换出去了
- 当数据准备就绪后,进程又重新进入到就绪状态,等待再次调度
- 在指令执行期间产生和处理中断信号
- 一条指令执行期间,可能产生多次缺页中断