■非连续内存分配的需求背景
连续内存分配中要给一个进程分配内存,必须分配一个物理地址连续的一块内存区域,给分配带来了很多的麻烦,你比如说用户想要一块区域,而在内存当中又没有满足大小的连续区域,那分配就会失败。
基于这种现状提出了一种需求,说我们是否可以不连续,即分配的内存空间不连续。
不连续,当然是说这样我可以找到它的几率会更高,但这时候也会面临一些新的麻烦?
说不连续之后,我把哪些内容,我是任意一个最小的单位,一个字节就可以算成一个区域,还是说我会受到一个限制。说这时候你分配到一个字节为一个单位太短了。
基于这种情况,我们会选择不同的尺度来说,我这个非连续内存分配,我能每一块/基本的块会有多大,基于这种基本块的大小的不同,在我们这里有两种,一种是段式,一种是页式。
那段式分的块比较大,页式分的块比较小。分的块小了之后呢,我这两者之间的对应关系,即从逻辑地址到物理地址的对应关系就会变得比较复杂。因为这个缘故,所以我们这种对应关系就形成我们这里说到的页表。
还有一种方式是说我是不是可以把这两种方式结合起来,这就是我们这里的段页式。
首先我们来讲非连续内存分配的需求。
■连续分配的缺点
- 分配给程序的物理内存必须连续
在连续分配的缺点当中,要求必须连续,这一条很难达到。 - 存在外碎片和内碎片
即使能达到,在分配回收的过程当中,里头也会有内碎片外碎片。 - 内存分配己的动态修改困难
如果说一个程序在执行的过程当中,他需求的内存空间大小又有变化,这种变化就导致你很难进行动态的增加或者说减少。 - 内存利用率较低
这样最后的结果就是我们内存的利用效率比较低,原因在于用户应用进程的需求你没有办法满足。
■非连续分配的设计目标:提高内存利用效率和管理灵活性
针对连续分配的缺点,我们非连续内存分配这时候要达到的目标,就希望能够提高利用效率,提高它的管理的灵活性。
具体说起来有这样几条,
- 允许一个程序的使用非连续的物理地址空间
第一个我希望分配的空间不再是有连续性的要求,这样的话,找着所要的大小的区域的几率呢就会提高。 - 允许共享代码与数据
第二个是说在用的过程中,每个进程它都要执行代码,这些进程之间有很多代码是共同的,各个进程也会用到一些数据是公用的,我们希望通过共享数据和代码实现减少内存的使用量,也就是说我们在这里头两个应用进程都要用到同一个函数库,我把函数库的代码放到内存之后,如果他们两个都能访问的话,能够实现共享,这样的话我在内存区域不就变少了吗? - 支持动态加载和动态链接
第三个是说我们希望能够变得灵活,这里头是不是分小了之后,我想再要的时候我再给它加一块,或者说其中某一块的大小的动态变化,有了这些之后,我们就可以很方便的能够支持动态加载和动态链接。
这个目标已经说完了,好像说起来目标嗯很好,但是这在实现的时候是会面临很多麻烦的。
■非连续内存分配的实现
■非连续分配需要解决的问题
■如何实现虚拟地址和物理地址的转换
首先第一个麻烦就是我们这里说到的虚拟地址到物理地址的转换,程序里头在实现的时候,他希望是说我给你一个地址,然后告诉你,你要告诉我它存在物理内存的什么地方。
这种转换如果它是连续的,我只需要知道它的起头在哪。好,