内存分段是如何产生内存碎片的

描述

内存分段

程序包含若干个逻辑分段,如可由代码段、数据段、栈段、堆段组成,每个分段都有不同的属性,所以内存以分段的形式把这些段分离出来进行管理

在内存分段方式下,虚拟地址和物理地址是如何映射的?

分段管理下的虚拟地址由两部分组成,段号和段内偏移量

操作系统

通过段号映射段表的项

从项中获取到段基地址

段基地址+段内偏移量=使用的物理内存

通过上述知道了,使用段号去映射段表的项,使用项中的段基地址与偏移量计算出物理内存地址,但实际上,分段方式会把程序的虚拟地址分为4段,每个段在段表中有一个项,在这一项找到段的基地址,再加上偏移量计算出物理内存地址

分段的方式,很好的解决了,程序本身不需要关心具体物理内存地址的问题,但是它仍有不足之处:

内存碎片的问题

内存交换的效率低的问题

接下来对这两个问题进行分析

分段方式是如何产生内存碎片的?

在说内存碎片之前,还是先弄明白,什么是内存碎片?,8个人去外面吃饭,因为饭点原因,人比较多,剩下的都是4人小餐桌,这些4人小餐桌就是我们所说的内存碎片,此时会有小伙伴说,把2个4人小餐桌拼凑在一起就解决了这个问题,非常简单,我们把这种方式称为内存碎片整理(涉及到内存交换)。

回到正题,我们来看一例子,假设物理内存只有1GB (1024MB),用户电脑上运行了多个程序:

浏览器占用128MB

音乐软件占用256MB

游戏占用了512MB

这个时候我们关闭浏览器,剩余物理内存1024MB -(256MB+512MB)=256MB。但是这剩余的256MB物理内存不是连续的,被分为了两段128MB,导致没有空间再打开一个200MB的程序,如下图所示

操作系统

这里的内存碎片问题共有两点:

外部内存碎片,就是多个不连续的小物理内存空间,导致新的程序无法被装载

内部内存碎片,程序所有的内存都被装载进了物理内存,但是程序有部分的内存,可能不经常使用,造成内存的浪费

解决外部内存碎片的方法就是使用内存碎片整理

内存碎片整理通过内存交换的方式来实现,我们可以把音乐软件占用的256MB加载到硬盘上面去,再从硬盘读取回来,但是读取回来的位置不再是原来的位置,而是紧跟已经占用的游戏512MB后面,这样两个128MB的空闲物理内存就合并成了一个256MB的连续物理内存,于是新的200MB新程序就能被装载进来

内存交换空间,在 Linux 系统里,是我们常看到的 Swap 空间,这块空间是从硬盘划分出来的,用于内存与硬盘的空间交换。

分段方式为什么内存交换效率低?首先分段管理容易造成内存碎片,导致内存交换的频率较高,因为硬盘的访问速度比内存慢太多了,然后每次交换的时候,把一大段连续的内存写入到硬盘,再又从硬盘读取出来,如果交换的是一个占内存空间很大的程序,这样整个机器都会显得卡顿,过程也很慢的,所以说分段方式内存交换效率低。

为了解决内存分段管理造成的内存碎片与内存交换效率低的问题,就出现了内存分页。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分