一、 内核空间

1. 页page(是内核空间管理基本单位)源代码分析如下:/include/linux/mm_types.h
内存管理单元(MMU,把虚拟地址转换为物理地址的硬件设备)通常是以页为单位处理。

内核用struct page结构体表示每个物理页,struct page占用40个字节。
2. 区(zone,内核把页划分在不同的区)
共记3个区:
ZONE_DMA(DMA使用的页,物理内存<16MB)
ZONE_NORMAL(可以正常寻址的页,物理内存16—896MB)
ZONE_HIGHMEM(动态映射的页,物理内存>896MB)
执行DMA操作必须从ZOME_DMA区分配,一般内存,既可以从ZOME_DMA,也可以从ZONE_NORMAL分配,但不能从两个区分配。
3. 页的分配与释放
所有页为单位进行连续的物理内存分配,也称为低级页分配,alloc_page、alloc_pages、
__get_free_pages、__get_free_pages、__get_zeroed_page.
释放函数:__free_pages、free_pages、free_page.
4. 字节分配与释放(kmalloc/vmalloc,分配都是以字节为单位)
Void *kmalloc(size_t size,gpf_t flags);
Kmalloc 函数返回指向内存块的指针,内存块大小至少size,所分配内存在物理内存中连续且保持原有的数据(不清零)。
Flags取值说明(常用部分如下):

GFP_USER-用于用户空间分配内存,可能休眠
GFP_KERNEL-用于内核空间分配内存,可能休眠
GFP_ATOMATIC-用于原子性的分配内存,不会休眠,典型原子性场景,中断处理程序、软中断。

Kamlloc函数用于内存分配最终会调用_get_free_pages进行实际分配,前缀都是GFP_开头。 Kamalloc分配最多只能分配32个page大小的内存,每一个page=4k,也就是分配128k大小,其中16个字节用来记录页的描述结构。所分配的是常驻内存,不会被交换到文件中,最小分配单位是32或64个字节。

Vmalloc函数:返回是一个指向内存块的指针,内存块大小至少是size,它所分配的内存是逻辑上了连续的,该函数也有flags,默认它是可以休眠的。 Kmalloc:所在区域内核空间,物理地址连续,最大值为128k-16k,释放函数free,性能最佳 Vmalloc: 所在区域内核空间,虚拟地址连续,更大,释放函数vfree,更容易分配大内存。 Malloc: 所在区域用户空间,虚拟地址连续,更大,释放函数free。

二、 slab分配器的功能

对于频繁地分配和释放的数据结构,会缓存它;
频繁分配和回收,比如导致内存碎片、为了避免,空间链表的缓存会连续的存放,已释放的数据结构又会放回空闲链表,不会导致碎片。
记部分缓存专属单个处理器,分配和释放操作可以不加SMP锁。

三、 slab分配器层的设计

slab层把不同的对象划分所谓的高速缓存组,其中每个缓存组都存放不类型的对象。每一种对象类型对应一个高速缓存。比如:一个高速缓存用于进程描述符(task_struct结构的一个空闲链表),另外一个高速缓存存放索引节点对象(struct inode).
Kmalloc()接口建立在slab层上的,使用一组通用高速缓存。
这些高速缓存又被划分为slab,slab由一个或多个物理上连续的页page组成,一般情况下,slab也就仅仅由页组成。每个高速缓存可以由多个slab组成。

Struct slab{Struct list_head list;//满,部分满,或者空链表
Unsigned long colouroff; /*slab着色的偏移量*/
Void * s_mem; /* 在slab中的第一个对象*/
Unsigned int inuse;//slab中已分配的对象数
Kmem bufctl free;//第一个空闲对象
Unsigned short nodeid;
};

四、 slab的接口分配器(参考源代码fork.c)

每当进程调用fork时,一定会创建一个新的进程描符,这是在dup_task_struct()进程中完成,而该函数会被do_fork()调用.执行完毕后,如果没有子进程在等待的话,它的进程描述符就会被释放。返回给task_struct_cachep slab高速缓存。
Slab层负责在内存紧缺情况下所有底层的对齐、着色、分配、释放、回收等。如果我们要频繁创建很多相同类型的对象,就因该考虑使用slab高速缓存。

[Linux源码分析]内存管理相关推荐

  1. Python3.5源码分析-内存管理

    Python3源码分析 本文环境python3.5.2. 参考书籍<<Python源码剖析>> python官网 Python3的内存管理概述 python提供了对内存的垃圾收 ...

  2. v15.03 鸿蒙内核源码分析(内存映射) | 映射真是个好东西 | 百篇博客分析HarmonyOS源码

    子曰:"德不孤,必有邻." <论语>:里仁篇 百篇博客系列篇.本篇为: v15.xx 鸿蒙内核源码分析(内存映射篇) | 映射真是个好东西 内存管理相关篇为: v11. ...

  3. v11.03 鸿蒙内核源码分析(内存分配) | 内存有哪些分配方式 | 百篇博客分析HarmonyOS源码

    子曰:"君子周而不比,小人比而不周."<论语>:为政篇 百篇博客系列篇.本篇为: v11.xx 鸿蒙内核源码分析(内存分配篇) | 内存有哪些分配方式 内存管理相关篇为 ...

  4. nginx源码分析—内存池结构ngx_pool_t及内存管理

    本博客( http://blog.csdn.net/livelylittlefish)贴出作者(阿波)相关研究.学习内容所做的笔记,欢迎广大朋友指正! Content 0.序 1.内存池结构 1.1 ...

  5. linux内存源码分析 - 内存压缩(同步关系)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 最近在看内存回收,内存回收在进行同步的一些情况非常复杂,然后就想,不会内存压缩的页面迁移过程中的同步关系也 ...

  6. Tomcat7.0源码分析——Session管理分析(上)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/beliefer/article/details/52450268 前言 对于广大java开发者而言, ...

  7. Memcached源码分析 - 内存存储机制Slabs(5)

    Memcached源码分析 - 网络模型(1) Memcached源码分析 - 命令解析(2) Memcached源码分析 - 数据存储(3) Memcached源码分析 - 增删改查操作(4) Me ...

  8. linux源码分析之cpu初始化 kernel/head.s,linux源码分析之cpu初始化

    linux源码分析之cpu初始化 kernel/head.s 收藏 来自:http://blog.csdn.net/BoySKung/archive/2008/12/09/3486026.aspx l ...

  9. Tomcat7.0源码分析——Session管理分析(下)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/beliefer/article/details/52451061 前言 在<Tomcat7.0 ...

  10. Nginx源码分析-内存池

    本文转自淘宝平台http://www.tbdata.org/archives/1390,不是为了夺他人之美,只是觉得写得很好,怕淘宝万一删掉就找不到了,放在这里保存一下.大家可以直接链接过去,他们那个 ...

最新文章

  1. QWidget子窗口中setStyleSheet无效,解决方法
  2. datename mysql_sql DATENAME 用法
  3. dicom多帧转换_Python解析多帧dicom数据详解
  4. Maven的maven-install-plugin插件详解
  5. 为什么 0.1 + 0.2 = 0.300000004
  6. 雨尘SEO静态页面生成系统版本源码3秒钟可生成上千条单页面SEO必备神器
  7. 仅用10个月!中国高中生拿下Kaggle Master,怎么做到的?
  8. SQL Server 2005 14420 14421错误
  9. 关于iOS实现前台,后台,锁屏或关闭app语音播报
  10. 九度教程第28题-堆栈的的使用(栈的使用)
  11. Unbuntu卸载anaconda(最新最全亲测)
  12. excel批量添加超级链接
  13. python3 and
  14. 计算机科学计算器CE符号,计算器的ce和c是什么意思???
  15. thinkphp的I方法
  16. 写学习心得,赢华为P30、漫步者音响!
  17. U盘盘符显示不出来了,纠结(已解决)
  18. 斗鱼连续6个季度亏损:活跃用户降幅明显,虎牙市值是前者的两倍
  19. 数值分析-龙格库塔法
  20. 基于MATLAB Simulink的中性点钳位三电平逆变器仿真模型

热门文章

  1. Linux BT下载(2)-B编码和种子文件
  2. arXiv引用格式转换为已发表会议标准引用格式小工具分享
  3. 汉字与GBK内码互转工具(支持批量转换)
  4. GBK编码转换及Md5算法工具
  5. spss因子分析结果解读_SPSS统计结果P=0.000,我该如何解读呢?
  6. 史上最全常用正则表达式大全
  7. matlab肌电信号hz低通滤波器,燕山大学 数字信号处理 课程设计 肌电信号 Matlab 程序汇总...
  8. 【php导出excel,大量导出,文本格式】
  9. edius裁剪快捷键_Edius剪辑视频的两种方法
  10. SM951 NVMe 版本安装Win7 的正确方法