今天在分析Ext4文件系统的时候,看到两个函数ext4_kvzalloc()/ext4_kvfree(),想到以前在使用kzalloc()/kmalloc()带来的内存分配失败问题,不得不感叹社区牛人的思路是多么的......(海量褒义词)

1. kvzalloc分配分析

       请看代码:

void *ext4_kvzalloc(size_t size, gfp_t flags)

{

    void *ret;



    ret = kzalloc(size, flags | __GFP_NOWARN);

    if (!ret)

        ret = __vmalloc(size, flags | __GFP_ZERO, PAGE_KERNEL);

    return ret;

}
       在ext4_kvzalloc中,首先执行kzalloc执行物理地址连续的内存空间分配,并且增加内存分配行为描述符__GFP_NOWARN(内存分配失败不会产生警告信息);如果分配成功,则返回;否则调用vmalloc执行物理地址不一定连续的内存空间分配(vmalloc是分配大小为page的整数倍,大于一个page的内存空间申请,vmalloc将一个page一个page的进行申请分配)。
       既然有了如此混合的分配方式,那么必然有可以解决这种混合方式的内存释放机制。因此就有了ext4_kvfree();

2. kvfree释放分析

       在ext4_kvfree()中必然可以判断该内存是由哪种机制分配的,是kzalloc还是vmalloc,那么内核又提供的什么机制哪?
       答案是is_vmalloc_addr(),通过is_vmalloc_addr()判断是否为vmalloc分配的:

static inline int is_vmalloc_addr(const void *x)

{

#ifdef CONFIG_MMU

    unsigned long addr = (unsigned long)x;



    return addr >= VMALLOC_START && addr < VMALLOC_END;

#else

    ;

#endif

}
(具体为什么可以这么判断,需要分析内存空间的布局,也许您可以查到我写过的资料,也许查不多,无论怎么样,请参阅以下地址:
      那么kvfree()的实现就非常明确了

void ext4_kvfree(void *ptr)

{

    if (is_vmalloc_addr(ptr))

        vfree(ptr);

    else

        kfree(ptr);



}
      不管您怎么认为,至少我认为这种方案非常非常好......
      但是,个人还是建议在其中首先判断ptr指针是否为NULL。

    if (unlikely(ZERO_OR_NULL_PTR(ptr)))

        return;

3. kvzalloc/kvfree应用分析

     这种机制,ext4把它使用到哪个或哪些场景中哪?主要有以下连个场景
     1. 分配s_group_info array;它所需内存大小是受磁盘存储大小影响的,存储越大,所需内存越大;
     2. 分配flex_groups array;它所需内存大小也是受磁盘存储大小影响的,存储越大,所需内存越大;
     两者的共同特点时,所需内存大小很不确定,也许很多歌页,也许一个页,如果很多个页,那么分配失败率会大大增高。

Ext4中内存使用技巧的一点思考的更多相关文章

  1. 对于C++中const & T operator= 的一点思考

    一个正常的assignment操作符的声明是这样的. const elmentType & elmentType::operator=(const elmentType &rhs) 这 ...

  2. 关于linux kernel slab内存管理的一点思考

    linux kernel 内存管理是个很大的话题,这里记录一点个人关于slab模块的一点思考总结. 有些书把slab介绍成高速缓存,这会让人和cache,特别是cpu cache混淆,造成误解.sla ...

  3. c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程

    c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...

  4. [转载]对iOS开发中内存管理的一点总结与理解

    对iOS开发中内存管理的一点总结与理解   做iOS开发也已经有两年的时间,觉得有必要沉下心去整理一些东西了,特别是一些基础的东西,虽然现在有ARC这种东西,但是我一直也没有去用过,个人觉得对内存操作 ...

  5. 有 va_arg宏 中数组下标-1 引发的思考 - C 语言中内存模型

    va_arg宏,是头文件 stdarg.h 中定义的,获取可变参数的当前参数. #define va_arg(list, mode) ((mode*)(list+=sizeof(mode)))[-1] ...

  6. ios开发中的小技巧

    在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIViewal ...

  7. IOS中图片拉伸技巧与方法总结(转载)

    以下内容转载自:http://my.oschina.net/u/2340880/blog/403996 IOS中图片拉伸技巧与方法总结 一.了解几个图像拉伸的函数和方法 1.直接拉伸法 简单暴力,却是 ...

  8. 对dump脱壳的一点思考

    对dump脱壳的一点思考 偶然翻了一下手机日历,原来今天是夏至啊,时间过的真快.ISCC的比赛已经持续了2个多月了,我也跟着比赛的那些题目学了2个月.......虽然过程很辛苦,但感觉还是很幸运的,能 ...

  9. Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南)

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9941208.html 主讲人:大石头 时间:2018-11-10 晚上20:00 地点:钉钉群(组织代码 ...

随机推荐

  1. MySQL数据库设计总结

    规则1:一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎. 注意:MyISAM存储引擎 B-tree索引有一个很大的限制:参与一个索引的所有字段的长度之和不能超过10 ...

  2. windows phone 8.1开发:磁铁|Tile更新

    原文出自:http://www.bcmeng.com/tile/ 上一篇给大家分享了toast通知操作的方法,这一篇文章我们就来看windows phone 8.1开发中的磁铁更新.磁铁是window ...

  3. spring-AOP-基于Schema切面的小例子

    前言: 如果一个项目没有 jdk 5.0 , 那就无法使用基于@AspectJ 注解 的切面. 但是使用AspectJ的表达式的大门还是可以使用的. 我们可以用java提供的Schema配置方法,来替 ...

  4. iOS开发之instancetype

    instancetype和id使用方法类似,但他们还有不同点: (1)instancetype在类型表示上,跟id一样,可以表示任何对象类型 (2)instancetype只能用在返回值类型上,不能像 ...

  5. 使用MyBatis对数据库中表实现CRUD操作(二)

    一.使用MyBatis对表实现CRUD操作 1.定义sql映射 userMapper.xml <?xml version="1.0" encoding="UTF-8 ...

  6. 应不应该使用inline-block代替float

    CSS布局创建网站,浮动绝对占据了很大的比例.大块区域如主内容及侧边栏,以及在其中的小块区域,都可以看到浮动的影子.这里浮动是唯一的解决方案吗? 浮动通常表现正常,但有时候搞起来会很纠结.特别是处理内 ...

  7. python安装paramiko需要的依赖

    yum install gcc libffi-devel python-devel openssl-devel -y

  8. Spring Boot 注解的使用

    Spring Boot 优于Spring mvc ,SSM,SSH 的一个亮点就是他使用了好多的注解. 1. @Autowired 这个注解的作用是将其他的类,接口引入,类似于之前的类的初始化等,用这 ...

  9. Apache Mina入门实例

    一.mina是啥 ApacheMINA是一个网络应用程序框架,用来帮助用户简单地开发高性能和高可扩展性的网络应用程序.它提供了一个通过Java NIO在不同的传输例如TCP/IP和UDP/IP上抽象的 ...

  10. Weblogic+apache多虚拟主机

    p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; f ...