在LINUX中内存得管理是非常复杂的,内存除了固定分配给内核和其静态数据结构的部分成为动态内存,如何高效的管理这部分内存是提高系统性能的关键。
LINUX中页框的大小有4KB和4MB两种,如果激活PAE的话则为2MB,一般采用4KB的页框大小,采用较小的页框大小可以获得更好的性能,在发生缺页时可以更快的获取,在主存和磁盘之间的传输效率也更高些,通过用页描述符来记录页框的当前状态。
LINUX中物理内存被分为几个节点,在每一个节点内访问的时间是相同的所为的一致性内存访问,用节点描述符来记录节点的状态,有些平台上只有一个节点,有没有几点分配貌似是没必要的,没有取消这个节点区分的原因是希望获得更好的可移植性,一个节点又可以被分为3个内存管理区,ZONE_DMA,ZONE_NORMAL,ZONE_HIGHMEM,在ISA总线上有个限制就是只能对内存的前16M进行直接访问,ZONE_NORMAL是从16M到896M的区域,高于896M的为高端内存,对于前896M内核可以直接寻址,并且前896M直接映射到内核的线性地址,对于高于896的物理地址内核没有足够的线性地址映射,因为在32位地址的系统(没激活PAE的)上4G的线性地址空间前3G分给了用户空间,后1G分给了内核,而这1G是没法直接映射所有的物理地址的,因此内核采用了三种方法来映射高端内存,分别为 永久内核映射,临时内核映射,和非连续内存映射。
大的内存分配按页的,内核采用伙伴系统算法来组织页框,一组2的次方一定范围的连续页框数目,分别用链表连接起来,当需要分配时,从连续页框大小最小的链表搜寻,以此往大的页框链表搜寻,直到满足要求,若产生了多余的加入上一链表。每个内存区的页框分配都建立在伙伴系统分配上,DMA,普通和高端内存,在伙伴系统上再建立了slab高速缓存,用来分配小的内存。内核还建立了页框池用来给予在特定的用途,当中断和异常中需要分配内存的情况。还有内存池机制来为特定的对象分配内存,只能为内存池的拥有者来分配内存。
阅读(1543) | 评论(0) | 转发(0) |