内存分段
程序包含若干个逻辑分段,如可由代码段、数据段、栈段、堆段组成,每个分段都有不同的属性,所以内存以分段的形式把这些段分离出来进行管理
在内存分段方式下,虚拟地址和物理地址是如何映射的?
分段管理下的虚拟地址由两部分组成,段号和段内偏移量
通过段号映射段表的项
从项中获取到段基地址
段基地址+段内偏移量=使用的物理内存
通过上述知道了,使用段号去映射段表的项,使用项中的段基地址与偏移量计算出物理内存地址,但实际上,分段方式会把程序的虚拟地址分为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 空间,这块空间是从硬盘划分出来的,用于内存与硬盘的空间交换。
分段方式为什么内存交换效率低?首先分段管理容易造成内存碎片,导致内存交换的频率较高,因为硬盘的访问速度比内存慢太多了,然后每次交换的时候,把一大段连续的内存写入到硬盘,再又从硬盘读取出来,如果交换的是一个占内存空间很大的程序,这样整个机器都会显得卡顿,过程也很慢的,所以说分段方式内存交换效率低。
为了解决内存分段管理造成的内存碎片与内存交换效率低的问题,就出现了内存分页。
全部0条评论
快来发表一下你的评论吧 !