Linux内存管理
文章平均质量分 88
最近学习Linux内存管理时的一些理解和代码分析
橙色逆流
这个作者很懒,什么都没留下…
展开
-
Linux Slob分配器(二)--分配对象
水平有限,描述不当之处还请指出,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7705559 上节介绍了Slob分配器的相关概念和思想,这节来看Slob分配器是如何分配对象的。kmem_cache_alloc_node()函数用来分配一个专用缓存的对象: void *kmem_cache_all原创 2012-06-30 21:23:02 · 3867 阅读 · 2 评论 -
Linux Slob分配器(一)--概述
水平有限,描述不当之处还请指出,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7705202 Slob分配器相较Slab和Slub分配器而言,最大的特点就是简洁,其总共的实现代码大概就600多行,因此其适用于嵌入式系统。不同于Slab和Slub,Slob分配器没有引入本地CPU高速缓存和本地节点的概念。Slob分配器同样使原创 2012-06-30 16:46:15 · 5848 阅读 · 1 评论 -
Linux Slub分配器(七)--销毁缓存
水平有限,描述不当之处还请之处,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7703147 Slub分配器在销毁缓存时,必须得考虑缓存的引用计数是否为0,因为在Slub分配器中,缓存可以被多种对象复用,因此必须当所有种类的对象都同意销毁缓存才能执行销毁工作。void kmem_cache_destroy(s原创 2012-06-29 17:06:41 · 2938 阅读 · 1 评论 -
Linux Slub分配器(六)--slab的分配与释放
水平有限,描述不当之处还请之处,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7702677 创建新的slab主要有两个工作,一个是从伙伴系统分配2^order个连续页框给该slab,然后就是划分slab中的对象。函数new_slab()用来创建一个新的slab. static struct原创 2012-06-29 16:47:53 · 5356 阅读 · 1 评论 -
Linux Slub分配器(五)--释放对象
水平有限,描述不当之处还请之处,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7701910 释放对象和分配对象是一组对称的操作,同样分为两个路径:1.如果待释放的对象所属的slab位于本地CPU缓存中,也就是slab处于冻结状态,则可直接释放2.反之,待释放的对象所属的slab位于slab链表中,原创 2012-06-29 11:24:00 · 4059 阅读 · 1 评论 -
Linux Slub分配器(四)--分配对象
水平有限,描述不当之处还请之处,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7700482 对象的分配过程体现了内存管理器对内存对象的组织方式,相较Slab分配器,Slub在组织对象的方式上给人的感觉就是简洁精悍。Slub没有用任何的管理区数组来组织这些对象,而是巧妙的将对象之间联系的桥梁嵌入在对象自身之中,因原创 2012-06-28 21:19:47 · 4854 阅读 · 2 评论 -
Linux Slub分配器(三)--创建缓存
水平有限,描述不当之处还请之处,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7700338 Slub分配器创建缓存的过程和Slab差不多,主要的区别在于Slub分配器并不是直接创建一个新的缓存,而是先试图在已有的缓存中找到一个各方面属性和待创建缓存差不多的缓存,如果能找到的话则不会去创建新缓存,而是复用原创 2012-06-28 18:40:24 · 5774 阅读 · 14 评论 -
Linux Slub分配器(二)--初始化
水平有限,描述不当之处还请之处,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7695264 和slab分配器一样,分配器的初始化工作主要是初始化用于kmalloc的gerneral cache,Slub分配器的gerneral cache定义如下:struct kmem_cache kmalloc_cache原创 2012-06-27 11:28:52 · 4449 阅读 · 1 评论 -
Linux Slub分配器(一)--概述
水平有限,描述不当之处还请之处,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7694648 Slab分配器一直处于内核内存管理的核心地位,尽管如此,它还是拥有自身的缺点,最明显的两点就是复杂性和过多的管理数据造成的内存上的开销。针对这些问题,linux引入了slub分配器,slub分配器保留了slab分配器的所原创 2012-06-27 10:24:10 · 7903 阅读 · 5 评论 -
Linux Slab分配器(七)--销毁缓存
水平有限,描述不当之处还请之处,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7674601销毁缓存首先要保证的一点就是缓存当中所有的对象都是空闲的,也就是之前分配出去的对象都已经释放回来了,其主要的步骤如下1.将缓存从cache_chain链表中删除2.将本地高速缓存、alien高速缓存和共享本地高速缓存中的对象都释放回原创 2012-06-18 20:50:31 · 3922 阅读 · 4 评论 -
Linux Slab分配器(六)--创建slab和销毁slab
水平有限,描述不当之处还请之处,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7673372在满足以下两个条件时,slab分配器将为高速缓存创建新的slab1.请求分配对象,但本地高速缓存没有空闲对象可以分配,需要填充2.kmem_list3维护的链表中没有slab或者所有的slab都处于FULL链表中这时,调用cac原创 2012-06-18 15:41:22 · 5558 阅读 · 6 评论 -
Linux Slab分配器(五)--释放对象
水平有限,描述不当之处还请之处,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7671618缓存回收对象基于以下原则1.本地高速缓存的空间还可以容纳空闲对象,则直接将对象放回本地高速缓存2.本地高速缓存的空间已满,则按batchcount的值将对象从本地高速缓存转移到slab中,转移是基于先进先出的原则的,也就是转移ent原创 2012-06-17 21:16:49 · 4930 阅读 · 1 评论 -
Linux Slab分配器(四)--分配对象
水平有限,描述不当之处还请之处,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7671211 从一个缓存中分配对象总是遵循下面的原则:1.本地高速缓存中是否有空闲对象,如果有的话则从其中获取对象,这时分配的对象是最“热”的;2.如果本地高速缓存中没有对象,则从kmem_list3中的slab链表中寻找空闲对象原创 2012-06-17 17:19:39 · 4619 阅读 · 1 评论 -
Linux Slab分配器(三)--创建缓存
水平有限,描述不当之处还请之处,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7670272 创建新的缓存必须通过kmem_cache_create()函数来完成,原型如下struct kmem_cache *kmem_cache_create (const char *name, size_t s原创 2012-06-17 10:09:02 · 5481 阅读 · 1 评论 -
Linux Slab分配器(二)--初始化
水平有限,描述不当之处还请之处,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7666959 在前文中介绍了slab所涉及到的数据结构, slab分配器的初始化工作都是围绕这些数据结构来展开的,主要是针对以下两个问题: 1.创建kmem_cache高速缓存用来存储所有的cache描述符 2.创建arr原创 2012-06-15 16:39:58 · 6889 阅读 · 5 评论 -
Linux Slab分配器(一)--概述
水平有限,描述不当之处还请指出,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7664296 slab分配器是Linux内存管理中非常重要和复杂的一部分,其工作是针对一些经常分配并释放的对象,如进程描述符等,这些对象的大小一般比较小,如果直接采用伙伴系统来进行分配和释放,不仅会造成大量的内碎片,而且处理速度原创 2012-06-14 23:28:21 · 28906 阅读 · 4 评论 -
Linux伙伴系统(五)--通过迁移类型分组来实现反碎片
水平有限,描述不当之处还请之处,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7626670 从2.6.32.25开始,linux在伙伴管理系统中引入迁移类型(migrate type)这么一个概念,用于避免系统在长期运行过程中产生碎片。关于迁移类型的一些概念在介绍伙伴系统的数据结构的时候有提到过(见>),不过考虑到它原创 2012-06-02 21:21:10 · 8013 阅读 · 3 评论 -
Linux伙伴系统(四)--释放页
水平有限,描述不当之处还请之处,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7624628 Linux内存释放函数之间的调用关系如下图所示 可以看到,落脚点是__free_pages()这个函数,它执行的工作的流程图如下图所示原创 2012-06-01 21:10:46 · 5677 阅读 · 3 评论 -
Linux伙伴系统(三)--分配页
水平有限,描述不当之处还请指出,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7621289 前面已经介绍了伙伴系统的原理和Linux伙伴系统的数据结构,现在来看伙伴系统是如何来分配页面的。实际上,伙伴系统分配页面的算法并不复杂,但是由于考虑到分配内存时要尽量减少碎片的产生(涉及迁移机制)以及当内存不足时需要采取各种更原创 2012-05-31 20:22:34 · 10922 阅读 · 1 评论 -
Linux伙伴系统(二)--伙伴系统的初始化
水平有限,描述不当之处还请指出,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7611585 伙伴系统的初始化主要是初始化之前介绍的伙伴系统涉及到的数据结构,并且把系统初始化时由bootmem allocator管理的低端内存以及系统的高端内存释放到伙伴系统中去。其中有些和zone相关的域在前面>中已经有所介绍。原创 2012-05-29 13:06:39 · 8590 阅读 · 1 评论 -
Linux伙伴系统(一)--伙伴系统的概述
水平有限,描述不当之处还请指出,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7605367 伙伴系统的概述 Linux内核内存管理的一项重要工作就是如何在频繁申请释放内存的情况下,避免碎片的产生。Linux采用伙伴系统解决外部碎片的问题,采用slab解决内部碎片的问题,在这里我们先讨论外部碎片问题。避免外部原创 2012-05-28 16:18:02 · 41696 阅读 · 9 评论 -
Linux高端内存映射(中)
临时内核映射 临时内核映射和永久内核映射相比,其最大的特点就是不会阻塞请求映射页框的进程,因此临时内核映射请求可以发生在中断和可延迟函数中。系统中的每个CPU都有自己的临时内核映射窗口,根据不同的需求,选择不同的窗口来创建映射,这些窗口都以枚举类型定义在km_type中enum km_type {KMAP_D(0) KM_BOUNCE_READ,KMAP_D(1) KM原创 2012-05-18 17:22:52 · 5090 阅读 · 1 评论 -
Linux高端内存映射(上)
高端内存概述 在32位的系统上,内核占有从第3GB~第4GB的线性地址空间,共1GB大小,内核将其中的前896MB与物理内存的0~896MB进行直接映射,即线性映射,将剩余的128M线性地址空间作为访问高于896M的内存的一个窗口。引入高端内存映射这样一个概念的主要原因就是我们所安装的内存大于1G时,内核的1G线性地址空间无法建立一个完全的直接映射来触及整个物理内存空间,而对于8原创 2012-05-18 13:49:02 · 9500 阅读 · 1 评论 -
Linux节点和内存管理区的初始化
节点和管理区是内存管理中所涉及的重要概念,其数据结构在前文《linux物理内存概述》中已经介绍,现在让我们来看看linux是如何完成节点和管理区的。 在内核首先通过setup_arch()-->paging_init()-->zone_sizes_init()来初始化节点和管理区的一些数据项static void __init zone_sizes_init(void){原创 2012-05-10 20:36:33 · 8537 阅读 · 6 评论 -
Linux页表机制初始化
Linux启动并建立一套完整的页表机制要经过以下几个步骤:1.临时内核页表的初始化(setup_32.s)2.启动分页机制(head_32.s)3.建立低端内存和高端内存固定映射区的页表( init_memory_mapping())4.建立高端内存永久映射区的页表并获取固定映射区的临时映射区页表(paging_init())下面主要介绍3和4 一、低端内存页表的原创 2012-05-09 17:18:26 · 12352 阅读 · 3 评论 -
bootmem allocator
在系统启动阶段,buddy系统和slab分配器建立之前,系统的每个节点都拥有自己的bootmem allocator来实现内存的分配,当启动阶段结束后,bootmem allocator将被销毁,而相应的空闲内存会提交给buddy系统来管理,因此bootmem allocator所存在的时间是短暂的,它的宗旨是简单,而非高效!bootmem allocator的基本思想是在一个节点中建立一片位图区原创 2012-05-03 15:54:52 · 5154 阅读 · 2 评论 -
物理内存探测
在内核建立相应的内存管理区之前,先要进行物理内存的探测,获取相关的内存信息。对于X86架构,内核在void main()中调用detect_memory()来进行物理内存的探测。void main(void){ ... ... /* Detect memory layout */ detect_memory(); ... ...}原创 2012-04-26 14:09:04 · 6075 阅读 · 3 评论 -
Linux物理内存概述
Linux可以支持大量的架构,所以需要用一种与架构无关的方式去描述内存。在linux的内存管理中,我们首先要明确的一个概念就是NUMA(Non-Uniform Memory Access,关于NUMA的介绍可以参考我前面的文章)。很多大型机器都采用NUMA架构,将内存和CPU分为很多组,每一组称为一个节点(node)。节点与节点之间的互相访问,会因为“距离”的不同导致不同的开销。Linux通过st原创 2012-04-26 09:43:06 · 8468 阅读 · 4 评论