知识梳理之内存(适用于面试)

来源:互联网 发布:apache php7 mysql 编辑:程序博客网 时间:2024/05/17 04:04

知识梳理之内存

1、  kmallocvmalloc是分配的是内核的内存,malloc分配的是用户的内存

2、  kmalloc保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续,malloc不保证任何东西(这点是自己猜测的,不一定正确)

3、  kmalloc能分配的大小有限,vmallocmalloc能分配的大小相对较大

4、  内存只有在要被DMA访问的时候才需要物理上连续

5、  vmallockmalloc要慢

6、  kmallockmalloc的简化版本,kzalloc就等于kmalloc的内存空间用0来填充分配出来的内存空间。

7、  kfree函数用来释放kmalloc分配的内存。

1、页面分配部分

对物理内存的定义方面,引入:节点(node)、内存区域(zone)、内存页(page)。

内存区域(zone):linux将每个内存节点管理的物理内存划分为不同的内存区域,在代码中以struct zone数据结构表示每一个内存区域。

内存页(page):是物理内存管理中最小的单位。系统为每个页创建一个struct page对象。

内核将物理内存分为三个区:ZONE_DMAZONE_NORMALLZONE_HIGHMEM

页面分配函数:alloc_pages__get_free_pages,它们最终都会调用到alloc_pages_node,所以背后两者的原理是一样的。页面的分配次序为:ZONE_NORMALLZONE_DMA,而不会到ZONE_HIGHMEM中查找分配。

2slab分配器(slab allocator

       Linux系统在物理页分配的基础上实现了对更小内存分配的管理:slabslobslubslobslub主要针对大型系统和嵌入式系统。

       Slab分配器的基本思想是:先利用页面分配器分配出单个或者一组连续的物理页面,然后在此基础上将整块页面分割成多个相等的小内存单元,以满足小内存空间分配的需求。

       相关数据结构:struct kmem_cachestruct slabkmem_cache用于管理旗下所有的struct slab

       Slab结构用于管理一块连续的物理页面中内存对象的分配。其存放位置有两种:一是将struct slab实例放在物理页面首页的开始处;二是放在物理页面的外部。

       Slab分配器最终调用__alloc_pages去分配2order个连续的物理页面,对于slab分配器而言,它只能在低端内存区分配物理页面。

3、虚拟内存的管理

Linux内核将4GB的虚拟地址空间分为两大块:顶部的1GB空间给内核使用,底部的3GB给用户空间使用。内核代码中使用PAGE_OFFSET宏来标示虚拟地址空间中内核部分的起始地址。

VmallocVfree

Vmalloc函数的实现原理主要有以下三个步骤:

1)  Vmalloc区分配出一段连续的虚拟内存区域(使用红黑树解决动态虚拟内存的分配与释放)

2)  通过伙伴系统获得物理页

3)  通过对页表的操作将步骤1中分配的虚拟内存映射到步骤2中获得的物理页上。

0 0
原创粉丝点击