浅析内存管理


连续分配

  在早期的计算机中,程序是直接运行在物理内存上的,程序直接访问的都是物理地址。如果一个计算机同时运行多个程序,那么就会出现一个问题,如何将计算机上的物理内存同时分配给多个程序使用。
  最早的方法是固定分区分配。将内存划分为几个固定大小的区域,在每个分区中只装入一个程序,这样便允许有几个程序并发运行。由于每个分区的大小固定,必然会出现内部碎片,造成存储空间的浪费。
  随后出现了动态分区分配,它根据程序的实际需要,动态的为之分配内存空间。但动态分区分配算法容易产生若干个不连续的小分区,由于程序需要连续的内存分区,而分区之间的空隙又无法满足程序内存需要,于是出现了不能利用的外部碎片。
  为了解决这一问题,出现了可重定位分区分配的方式。这种方式通过移动内存中程序的位置,把原来多个分散的小分区拼接成一个大分区。用相对地址加重定位寄存器中的地址的方法将程序重定位,使程序正常运行。
  这种“紧凑”方法将许多碎片拼接成可用的大块空间,但须为之付出很大开销。于是出现了一种离散分配的思想。如果将一个进程直接分散地装入到许多不相邻接的分区中,则无须再进行“紧凑”。假设程序和物理地址之间有一个中间层虚拟地址,将程序的地址看作是虚拟地址,然后通过某些映射的方法,将虚拟地址转换为实际的物理地址。这种方法不但减少了碎片和开销,还实现了程序之间的隔离,使每个程序拥有独立的地址空间。


分段

  最开始使用的是一种叫做分段的方法,可以将程序分为若干个段,把段的虚拟空间映射到某个物理空间。例如将10MB虚拟内存0x00000000到0x00A00000映射到物理内存0x00100000到0x00B00000。就是将虚拟空间中的每个字节相对应于物理空间中的每个字节一一映射。这个映射过程由软件来设置,比如操作系统,实际的地址转换由硬件完成。
  程序A和程序B在运行时,它们的虚拟空间和物理空间映射关系如下图所示。
在这里插入图片描述

  分段方法使程序之间相互隔离,拥有独立的地址,如果程序访问超出了范围,硬件会判断这是非法访问,拒绝请求并报告给操作系统或者监控程序,由它决定如何处理。对于程序来说,不需要关注物理地址的变化,只需要按照虚拟地址来编写程序即可。
  但是分段还是没有完全解决内存使用效率的问题。分段对内存区域的映射还是按照程序为单位,如果内存不足,被换入换出到磁盘的都是整个程序,这会严重影响速度。事实上,当一个程序在运行时,某个时间段内,它只是频繁的用到了一小部分数据,程序的很多数据都是不会被用到的。因此出现了更小粒度的内存分割和映射的方法—分页。


分页

  分页就是把地址空间等分成固定大小的页,每一页的大小由硬件决定,或硬件支持多种大小的页,由操作系统选择决定页的大小。分页方式将虚拟地址按页分割,需要使用的页装载到内存中,不需要的保存在磁盘里,使用到的时候再把它们从磁盘取出即可。
在这里插入图片描述
  假设有两个进程,它们的部分虚拟页被映射到了物理页(VP0,VP1,VP7),有部分页面却在磁盘中(VP2,VP3),还有一些可能尚未被用到或访问到(VP4,VP5,VP6),而如果两个进程虚拟空间的虚拟页被映射到了同一个物理页,就实现了内存共享。
虚拟存储的实现需要硬件的支持,几乎所有的硬件都采用一个叫MMU的部件来进行页映射。
在这里插入图片描述
  页映射模式下,CPU发出的是虚拟地址,经过MMU转换变成物理地址,一般MMU集成在CPU内部,不会以独立的部件存在。


段页式

  段页式系统,是分段和分页原理的结合,即先将程序分成若干个段,再把每个段分成若干个页。由段标识符和偏移量构成的逻辑地址经过段式内存管理映射转换为线性地址(虚拟地址),线性地址再经过页式内存管理映射转换为物理地址。



总结

  Linux 内存主要采用的是页式内存管理,但同时也不可避免地涉及了段机制。这主要是 Intel 处理器发展历史导致的,因为 Intel X86 CPU 一律对程序中使用的地址先进行段式映射,然后才能进行页式映射。既然 CPU 的硬件结构是这样,Linux 内核也只好服从 Intel 的选择。
  但是事实上,Linux所有的段(用户代码段、用户数据段、内核代码段、内核数据段)的段基址都是从 0x00000000 开始,长度4G(32 位环境下),这样线性地址=逻辑地址+ 0x00000000,也就是说逻辑地址等于线性地址了。Linux在x86的分段机制上运行,却通过一个巧妙的方式绕开了分段。Linux 系统中的代码,包括操作系统本身的代码和应用程序代码,所面对的地址空间都是线性地址空间(虚拟地址),这种做法相当于屏蔽了处理器中的逻辑地址概念。






参考文献:
《计算机操作系统》汤小丹 梁红兵 哲凤屏 汤子瀛 编著
《程序员的自我修养》 俞甲子 石凡 潘爱民 编著
https://blog.csdn.net/qq_34827674/article/details/107042163

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值