今天在分析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. Java 反射的理解

    反射反射,程序员的快乐,今天你快乐了吗?如果你不快乐,没关系,接下来让你快乐起来! 一.什么是反射? 通过百度百科我们可以知道,Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性 ...

  2. ubuntu桌面不显示菜单

    为什么?我也不知道,只记得之前在搜狐看了行尸走肉,然后第二次开机就看不到菜单了. 参照百度结果然后去尝试了一下,记过ok了,我的ubuntu是13.10. 图说: 看到这里就应该大概怎么做了. 1   ...

  3. 【微信公众平台SDK(链式调用)】经过半个月的迭代,今天抽空写了个Demo

    这个项目是在实际开发中逐渐完善的,开发过程基于ASP.Net Core 1.1,实际生成会兼容Net4.5. 写有完善的代码提示,怎么用就不多做解释了,引用好实例中的命名空间基本上就可以通过智能提示了 ...

  4. 用Visual Studio Code Debug世界上最好的语言

    前言 这阵子因缘巧合接手了一个辣鸡项目,是用世界上最好的拍黄片写的,项目基本是另一个小伙伴在撸码,我就兼职打杂和发布做点运维的工作. 然后昨天项目上了测试版之后,一用起来Error满天飞了.让小伙伴查 ...

  5. boost.asio源码阅读(1) - 从chat_server开始

    1. 关于示例代码 chat 先从简单的入手, 在如下路径:boost_1_63_0/libs/asio/example/cpp11/chat中找到chat_server.cpp 查看其成员, pri ...

  6. [译]Selenium Python文档:六、页面对象

    本章是介绍页面对象设计模式的教程.一个页面对象代表了web应用用户接口的一片区域,你的测试代码将与之交互的. 使用页面对象模式的好处: 可以创建在多个测试样例中都可使用的可重用代码 减少重复性代码 如 ...

  7. 判断是否支持WebP

    PC端,触屏版: 前端JS方案——利用img标签加载一张base64的WebP图片,在img标签的onload事件中判断该图片是否具有宽高的属性,若有表示支持webP,若没有表示不支持webP.后台判 ...

  8. Windows 10 Creaters Update 新功能——画中画模式和窗口高斯模糊

    在Windows 10 Creaters Update中,可以给窗口设置高斯模糊了,只要几行代码! <Grid Loaded="Grid_Loaded"> <Gr ...

  9. python3的urllib2报错问题解决方法

    python urlib2 兼容问题 在python3中,将urllib和urllib2合并了,所以在使用urllib2的地方改成urllib.request即可.示例如下 import urllib ...

  10. 走入PHP-变量、运算符

    通过define()定义常量: PHP 5.3.0之后,可以使用const关键字在类定义之外定义常量: 下面是PHP的几个魔术变量: PHP支持一个执行运算符:反引号(``),PHP将尝试将反引号中的 ...