zoukankan      html  css  js  c++  java
  • kmalloc,vmalloc , malloc

    kmalloc,vmalloc分配都是以字节为单位

    (1) kmalloc

    1 void * kmalloc(size_t size, gfp_t flags)

    该函数返回的是一个指向内存块的指针,其内存块大小至少为size,所分配的内存在物理内存中连续且保持原有的数据(不清零)

    其中部分flags取值说明:

    • GFP_USER: 用于用户空间的分配内存,可能休眠;
    • GFP_KERNEL:用于内核空间的内存分配,可能休眠;
    • GFP_ATOMIC:用于原子性的内存分配,不会休眠;典型原子性场景有中断处理程序,软中断,tasklet等

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

    kzalloc

    kzalloc()等价于先用 kmalloc() 申请空间, 再用memset()来初始化,所有申请的元素都被初始化为0。

    1 static inline void *kzalloc(size_t size, gfp_t flags)
    2 {
    3     return kmalloc(size, flags | __GFP_ZERO); //通过或标志位__GFP_ZERO,初始化元素为0
    4 }

    (2) vmalloc

    1 void * vmalloc(unsigned long size)

    该函数返回的是一个指向内存块的指针,其内存块大小至少为size,所分配的内存是逻辑上连续的。

    kmalloc不同,该函数乜有flags,默认是可以休眠的。

    小结:

    分配函数区域连续性大小释放函数优势
    kmalloc 内核空间 物理地址连续 最大值128K-16 kfree 性能更佳
    vmalloc 内核空间 虚拟地址连续 更大 vfree 更易分配大内存
    malloc 用户空间 虚拟地址连续 更大 free  
  • 相关阅读:
    mpeg2 ts流PAT,PMT,SDT的定义
    机顶盒和TV的连接 ---色差分量线(YPbPr)、AV线(三色线)
    how DVB SI EIT section mapping into transport stream packet?
    cocos2d 创建工程bat文件
    cocos2d 碰撞检测
    cocos2d 播放音乐
    cocos2d 显示中文(使用bmpfont generator这个工具)
    cocos init
    cocos2d 特效, effect
    cococ2d 进度条
  • 原文地址:https://www.cnblogs.com/zongfanstudy/p/13389159.html
Copyright © 2011-2022 走看看