CSDN|真棒!20 张图揭开内存管理的迷雾( 二 )

在上面了 , 知道了虚拟地址是通过段表与物理地址进行映射的 , 分段机制会把程序的虚拟地址分成 4 个段 , 每个段在段表中有一个项 , 在这一项找到段的基地址 , 再加上偏移量 , 于是就能找到物理内存中的地址 , 如下图:CSDN|真棒!20 张图揭开内存管理的迷雾
本文插图
内存分段-虚拟地址与物理地址 如果要访问段 3 中偏移量 500 的虚拟地址 , 我们可以计算出物理地址为 , 段 3 基地址 7000 + 偏移量 500 = 7500 。分段的办法很好 , 解决了程序本身不需要关心具体的物理内存地址的问题 , 但它也有一些不足之处:

  • 第一个就是内存碎片的问题 。
  • 第二个就是内存交换的效率低的问题 。
接下来 , 说说为什么会有这两个问题 。我们先来看看 , 分段为什么会产生内存碎片的问题?我们来看看这样一个例子 。 假设有 1G 的物理内存 , 用户执行了多个程序 , 其中:
  • 游戏占用了 512MB 内存
  • 浏览器占用了 128MB 内存
  • 音乐占用了 256 MB 内存 。
这个时候 , 如果我们关闭了浏览器 , 则空闲内存还有 1024 - 512 - 256 = 256MB 。如果这个 256MB 不是连续的 , 被分成了两段 128 MB 内存 , 这就会导致没有空间再打开一个 200MB 的程序 。CSDN|真棒!20 张图揭开内存管理的迷雾
本文插图
内存碎片的问题 这里的内存碎片的问题共有两处地方:
  • 外部内存碎片 , 也就是产生了多个不连续的小物理内存 , 导致新的程序无法被装载;
  • 内部内存碎片 , 程序所有的内存都被装载到了物理内存 , 但是这个程序有部分的内存可能并不是很常使用 , 这也会导致内存的浪费;
针对上面两种内存碎片的问题 , 解决的方式会有所不同 。解决外部内存碎片的问题就是内存交换 。可以把音乐程序占用的那 256MB 内存写到硬盘上 , 然后再从硬盘上读回来到内存里 。 不过再读回的时候 , 我们不能装载回原来的位置 , 而是紧紧跟着那已经被占用了的 512MB 内存后面 。 这样就能空缺出连续的 256MB 空间 , 于是新的 200MB 程序就可以装载进来 。这个内存交换空间 , 在 Linux 系统里 , 也就是我们常看到的 Swap 空间 , 这块空间是从硬盘划分出来的 , 用于内存与硬盘的空间交换 。再来看看 , 分段为什么会导致内存交换效率低的问题?对于多进程的系统来说 , 用分段的方式 , 内存碎片是很容易产生的 , 产生了内存碎片 , 那不得不重新 Swap 内存区域 , 这个过程会产生性能瓶颈 。因为硬盘的访问速度要比内存慢太多了 , 每一次内存交换 , 我们都需要把一大段连续的内存数据写到硬盘上 。所以 , 如果内存交换的时候 , 交换的是一个占内存空间很大的程序 , 这样整个机器都会显得卡顿 。为了解决内存分段的内存碎片和内存交换效率低的问题 , 就出现了内存分页 。内存分页分段的好处就是能产生连续的内存空间 , 但是会出现内存碎片和内存交换的空间太大的问题 。要解决这些问题 , 那么就要想出能少出现一些内存碎片的办法 。 另外 , 当需要进行内存交换的时候 , 让需要交换写入或者从磁盘装载的数据更少一点 , 这样就可以解决问题了 。 这个办法 , 也就是内存分页(Paging) 。分页是把整个虚拟和物理内存空间切成一段段固定尺寸的大小 。 这样一个连续并且尺寸固定的内存空间 , 我们叫页(Page) 。 在 Linux 下 , 每一页的大小为 4KB 。虚拟地址与物理地址之间通过页表来映射 , 如下图:CSDN|真棒!20 张图揭开内存管理的迷雾
本文插图
内存映射 页表实际上存储在 CPU 的内存管理单元 (MMU) 中 , 于是 CPU 就可以直接通过 MMU , 找出要实际要访问的物理内存地址 。而当进程访问的虚拟地址在页表中查不到时 , 系统会产生一个缺页异常 , 进入系统内核空间分配物理内存、更新进程页表 , 最后再返回用户空间 , 恢复进程的运行 。分页是怎么解决分段的内存碎片、内存交换效率低的问题?由于内存空间都是预先划分好的 , 也就不会像分段会产生间隙非常小的内存 , 这正是分段会产生内存碎片的原因 。 而采用了分页 , 那么释放的内存都是以页为单位释放的 , 也就不会产生无法给进程使用的小内存 。如果内存空间不够 , 操作系统会把其他正在运行的进程中的「最近没被使用」的内存页面给释放掉 , 也就是暂时写在硬盘上 , 称为换出(Swap Out) 。 一旦需要的时候 , 再加载进来 , 称为换入(Swap In) 。 所以 , 一次性写入磁盘的也只有少数的一个页或者几个页 , 不会花太多时间 , 内存交换的效率就相对比较高 。


推荐阅读