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  
  • 相关阅读:
    .ssh/config 常用配置
    openresty(nginx) 配置 http与https使用同一个端口,禁止 IP 直接访问
    uni-app 入门小白纯徒手编写组件 hello-popup
    CSS 是啥?前端小白入门级理解
    爱思助手备份 iPhone 时没有设置密码,恢复备份时需要密码的问题
    introduction-to-64-bit-assembly
    flv to mp4
    Hopper Disassembler系列之Sublime Text 3 爆破
    Hopper 学习
    微信小游戏 Three.js UI 2D text 简单方案
  • 原文地址:https://www.cnblogs.com/zongfanstudy/p/13389159.html
Copyright © 2011-2022 走看看