声明: 1. 本文为我的个人复习总结, 并非那种从零基础开始普及知识 内容详细全面, 言辞官方的文章
2. 由于是个人总结, 所以用最精简的话语来写文章
3. 若有错误不当之处, 请指出
为什么要有虚拟地址?
-
使各个进程使用的内存 相互独立
单片机没有操作系统, 其CPU直接操作物理地址, 当两个应用程序同时使用了一个物理地址, 程序会崩溃
所以不能让应用程序操控物理地址, 而是让 操作系统为每个进程分配独立的一套「虚拟地址」进行相互隔离; 各个程序只能用它们各自的虚拟地址,无权访问物理地址, 操作系统负责虚拟地址映射到物理地址;
-
内存紧张时, 磁盘也可以充当内存使用
内部碎片 与 外部碎片 的区别?
内部碎片是
已经分配
出去了, 如分配给A进程500M资源, 其内部有一块1M的连续内存太小 无法使用外部碎片是还
未分配
出去, 如有一块1M的连续内存太小 无法分配给其他任意一个进程
管理 虚拟地址 与 物理地址之间的关系:
-
段式内存管理(先出现)
根据程序的逻辑角度,分成了
堆段
、栈段
、数据段
、代码段
等;每个段的大小不固定的, 由用户程序决定优点:
这样可以分离出不同属性的段
缺点:
粒度大, 内存交换时交换的数据太多
内存碎片多
-
页式内存管理(后出现, 解决了内存分段的缺点)
把虚拟空间和物理空间分成大小固定的页,如在 Linux 系统中,每一页的大小为
4KB
。优点:
-
粒度小, 内存交换时交换的数据少
-
分页允许将一个进程分散地装入到许多不相邻的分区中
-
内存碎片少
为了解决
页表过大
的问题,就有了多级页表, (原理: 二级页表按需加载)引发新的问题: CPU 在寻址时要查找多层,加大了时间上的开销。
解决: 根据程序的局部性原理,TLB缓存最近常被访问的页表项
-
-
段页式内存管理
既具有分段的优势:
-
共享:
段是信息的逻辑单位, 页是信息的物理单位并无完整的意义,不便于实现共享; 多个进程共享某个段的内存区域只需要指定段号即可,而不需要指定多个页
-
保护:
不同段可以自由伸缩内存空间大小,而且不影响其他的段
又具有分页的优势:
由于页的内存大小都是提前规划好的, 所以可以减少
内存碎片
由于页的粒度很细, 所以可以有选择性地
高效Swap
-
内存交换(虚拟内存):
内存紧张时, 把不常使用的内存暂时存放到硬盘(换出), 在需要的时候再装载回物理内存(换入)
虚拟地址转换为物理地址
工作硬件: 内存管理单元 MMU
-
段式内存管理:
-
页式内存管理:
-
段页式内存管理: