连续内存分配:
就是跟嵌入式差不多,一整段内存然后不断申请,之后就会出现内存碎片。
其中内存碎片的整理有两个策略:
- 压缩式碎片整理
就是将各个内存copy到一起,使得整体紧凑一点; - 交换式碎片整理
将后面要用到的放到硬盘,节省出大块的空间
非连续内存分配:
为了解决内存碎片的问题,我们引进虚拟内存来和连续内存进行对应,其中可以是大小不等的段加上段表映射到真实的内存,但是段的大小不一这处理起来就不规则了;于是我们引进大小相等的页,页的大小是一样的,注意这里每次读取数据都需要两次访存,第一次是根据访存页表对应找到对应的帧表(帧是物理内存的概念,帧跟页大小是一样的,只不过前者在对应实际内存,后者对应虚拟内存)。
但这又会出现页表很大的问题,因为虚拟地址是可以很大的,这样页表就会很大,可能内存都装不下,可以进行以下的改进:
- TLB(加快查找速度):块表,将页表中常用的页帧的映射放到cache中,这样找起来就快了。
- 二级页表(减小页表大小):有点像间接寻址,首先找到页地址的高位部分看是否存在对应的数据,如果存在,继续查看二级页表,注意这里二级页表就不用满映射了,因为它是任p1的页表对应到随便哪个二级页表中去,这就减少了页表的大小。但这里的缺点是增加了访存的次数,这是典型的用时间换取空间。
- 反向页表(减小页表大小):前面我们说到虚拟内存大导致的页表大,每个页都需要一个映射,这里采用帧和页反向对应,查找的时候采用相连存储器,可以同时查找所有的页表项,但是价格和功耗就上去了。于是我们用哈希来计算帧和页之间的映射,这里需要处理哈希时候的碰撞(多个映射到一个)。