知识梳理之内存(适用于面试)
来源:互联网 发布:apache php7 mysql 编辑:程序博客网 时间:2024/05/17 04:04
知识梳理之内存
1、 kmalloc和vmalloc是分配的是内核的内存,malloc分配的是用户的内存
2、 kmalloc保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续,malloc不保证任何东西(这点是自己猜测的,不一定正确)
3、 kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大
4、 内存只有在要被DMA访问的时候才需要物理上连续
5、 vmalloc比kmalloc要慢
6、 kmalloc是kmalloc的简化版本,kzalloc就等于kmalloc的内存空间用0来填充分配出来的内存空间。
7、 kfree函数用来释放kmalloc分配的内存。
1、页面分配部分
对物理内存的定义方面,引入:节点(node)、内存区域(zone)、内存页(page)。
内存区域(zone):linux将每个内存节点管理的物理内存划分为不同的内存区域,在代码中以struct zone数据结构表示每一个内存区域。
内存页(page):是物理内存管理中最小的单位。系统为每个页创建一个struct page对象。
内核将物理内存分为三个区:ZONE_DMA、ZONE_NORMALL和ZONE_HIGHMEM。
页面分配函数:alloc_pages和__get_free_pages,它们最终都会调用到alloc_pages_node,所以背后两者的原理是一样的。页面的分配次序为:ZONE_NORMALL、ZONE_DMA,而不会到ZONE_HIGHMEM中查找分配。
2、slab分配器(slab allocator)
Linux系统在物理页分配的基础上实现了对更小内存分配的管理:slab、slob和slub。slob和slub主要针对大型系统和嵌入式系统。
Slab分配器的基本思想是:先利用页面分配器分配出单个或者一组连续的物理页面,然后在此基础上将整块页面分割成多个相等的小内存单元,以满足小内存空间分配的需求。
相关数据结构:struct kmem_cache和struct slab。kmem_cache用于管理旗下所有的struct slab。
Slab结构用于管理一块连续的物理页面中内存对象的分配。其存放位置有两种:一是将struct slab实例放在物理页面首页的开始处;二是放在物理页面的外部。
Slab分配器最终调用__alloc_pages去分配2order个连续的物理页面,对于slab分配器而言,它只能在低端内存区分配物理页面。
3、虚拟内存的管理
Linux内核将4GB的虚拟地址空间分为两大块:顶部的1GB空间给内核使用,底部的3GB给用户空间使用。内核代码中使用PAGE_OFFSET宏来标示虚拟地址空间中内核部分的起始地址。
Vmalloc和Vfree
Vmalloc函数的实现原理主要有以下三个步骤:
1) 在Vmalloc区分配出一段连续的虚拟内存区域(使用红黑树解决动态虚拟内存的分配与释放)
2) 通过伙伴系统获得物理页
3) 通过对页表的操作将步骤1中分配的虚拟内存映射到步骤2中获得的物理页上。
- 知识梳理之内存(适用于面试)
- 知识梳理之互斥与同步(适用于面试)
- 知识积累之内存溢出
- 面试准备之内存对齐
- linux面试之内存管理
- PHP 面试知识梳理
- servlet面试知识梳理
- Android面试之内存溢出解决
- iOS面试知识点之内存管理
- 面试之内存泄露的原因
- 面试之内存溢出的解决方案
- 机器学习算法知识梳理--面试
- 黑马程序员——面试重点之内存泄露
- 知识梳理
- 知识梳理
- 知识梳理
- 知识梳理
- 知识梳理
- 驱动蓝屏后简单的分析dump文件
- linux串口 读写错误
- 文字隐藏代码,在HTML中隐藏某段文字
- 从零开始学习OpenGL ES之六 – 纹理及纹理映射
- Qt模块化笔记之Qt Widgets——认识小部件
- 知识梳理之内存(适用于面试)
- Core Java exercise
- wine无法运行exe解决方案(Path not find)
- OpenGL ES教程VI之纹理贴图(原文对照)
- 感性的人总有太多不舍得的原因似乎也
- 编译安装PHP出现configure: error: MySQL configure failed. Please check config.log的解决方法
- 笔记_并发编程实践_十四
- martyr的从零开始。
- HTML5画布WebGL Three.js球体