CSDN|真棒!20 张图揭开内存管理的迷雾( 二 )
在上面了 , 知道了虚拟地址是通过段表与物理地址进行映射的 , 分段机制会把程序的虚拟地址分成 4 个段 , 每个段在段表中有一个项 , 在这一项找到段的基地址 , 再加上偏移量 , 于是就能找到物理内存中的地址 , 如下图:
本文插图
内存分段-虚拟地址与物理地址 如果要访问段 3 中偏移量 500 的虚拟地址 , 我们可以计算出物理地址为 , 段 3 基地址 7000 + 偏移量 500 = 7500 。分段的办法很好 , 解决了程序本身不需要关心具体的物理内存地址的问题 , 但它也有一些不足之处:
- 第一个就是内存碎片的问题 。
- 第二个就是内存交换的效率低的问题 。
- 游戏占用了 512MB 内存
- 浏览器占用了 128MB 内存
- 音乐占用了 256 MB 内存 。
本文插图
内存碎片的问题 这里的内存碎片的问题共有两处地方:
- 外部内存碎片 , 也就是产生了多个不连续的小物理内存 , 导致新的程序无法被装载;
- 内部内存碎片 , 程序所有的内存都被装载到了物理内存 , 但是这个程序有部分的内存可能并不是很常使用 , 这也会导致内存的浪费;
本文插图
内存映射 页表实际上存储在 CPU 的内存管理单元 (MMU) 中 , 于是 CPU 就可以直接通过 MMU , 找出要实际要访问的物理内存地址 。而当进程访问的虚拟地址在页表中查不到时 , 系统会产生一个缺页异常 , 进入系统内核空间分配物理内存、更新进程页表 , 最后再返回用户空间 , 恢复进程的运行 。分页是怎么解决分段的内存碎片、内存交换效率低的问题?由于内存空间都是预先划分好的 , 也就不会像分段会产生间隙非常小的内存 , 这正是分段会产生内存碎片的原因 。 而采用了分页 , 那么释放的内存都是以页为单位释放的 , 也就不会产生无法给进程使用的小内存 。如果内存空间不够 , 操作系统会把其他正在运行的进程中的「最近没被使用」的内存页面给释放掉 , 也就是暂时写在硬盘上 , 称为换出(Swap Out) 。 一旦需要的时候 , 再加载进来 , 称为换入(Swap In) 。 所以 , 一次性写入磁盘的也只有少数的一个页或者几个页 , 不会花太多时间 , 内存交换的效率就相对比较高 。
推荐阅读
- CSDN|由 Apache 说开,中国开源项目已经走向世界!
- 科学探索|为对抗美国,俄想和中国建月球基地,却被一张图扎心了,还能拿出什么?
- AI人工智能|OpenAI新模型曝光:给它半张图片,能够猜测补全
- DeepTech深科技|OpenAI新模型曝光:给它半张图片,能够猜测补全
- CSDN|软件对于英特尔意味着什么?
- CSDN|中国首家苹果零售店重开业,苹果CEO库克发文揭幕;“携号转网”服务用户破千万;GitHub 完成北极源代码存档|极客头条
- 智能机器人|快商通智能客服云平台荣获CSDN“AI优秀案例实践奖”
- 百度|一张图看中美互联网科技公司对比,中国真能和美国势均力敌了吗?
- CSDN|万亿美元软件浪潮来临,开发者是核心!
- 行业互联网|快商通智能客服云平台荣获CSDN“AI优秀案例实践奖”