首页 > 系统相关 >申请内存有哪些函数

申请内存有哪些函数

时间:2023-01-08 10:47:14浏览次数:50  
标签:malloc 函数 哪些 void free 内存 size

linux系统中有哪些申请释放内存的函数接口了?

 

1、malloc函数族

首先肯定是c库函数, linux 环境下的glibc库实现名为ptmalloc的内存分配器,ptmalloc提供了malloc(),free()以及一组其它的函数供用户层内存管理。

glibc就是通过别名机制string_alias,映射了一堆c库函数(malloc/malloc.c文件中)

申请释放内存的接口有如下,其中1~3默认8字节对齐(64位系统16字节),4~8为对齐字节申请内存:

(1) void *malloc(size_t size)

区分配一个长度为size的连续未初始化空间

 

(2) void* calloc(size_t num,size_t size)

分配num个长度为size的连续初始化为0的空间

 

(3) void *realloc(void *mem_address, size_t newsize)

扩大mem_address地址空间至newsize大小并返回原mem_address地址,如果空间不够,则重新分配newsize大小空间,将原有数据拷贝至新区域,然后释放原来mem_address所指内存区域

 

(4) void * valloc (size_t size)

分配一个由size指定大小,地址是pagesize的倍数的内存块

 

(5) void *pvalloc(size_t size)

是一个废弃的函数,用法与valloc相似.如果分配失败返回NULL

 

(6) int posix_memalign(void **memptr, size_t alignment, size_t size)

分配size大小的字节,并将分配的内存地址存放在memptr中分配的内存的地址将是alignment的倍数,参数alignment必须是2的幂次方

 

(7) void * memalign (size_t boundary, size_t size) 

是一个废弃的函数,用法与posix_memalign相似分配地址是boundary的倍数的内存块参数boundary必须是2的幂

 

(8) void *aligned_alloc( size_t alignment, size_t size )

c11接口,用法与memalign函数相同,但是size大小应该alignment的倍数

 

(9) void free(void *ptr)

释放ptr指向的存储空间,以上所有函数申请的内存都可以用free函数释放

 

2、linux内核模块中动态开辟内存,不是用malloc,而是kmalloc ,vmalloc,或者用get_free_pages直接申请页

 

(1) void *kmalloc(size_t size, int flags)

分配的内存是物理上连续的kmalloc最多只能开辟大小为32XPAGE_SIZE的内存,一般的PAGE_SIZE=4kB,也就是128kB的大小的内存

(2) void kfree(const void *objp)

释放kmalloc申请的内存

(3) void *vmalloc(unsigned long size)

分配的内存只是线性地址连续,物理地址不一定连续

(4) void vfree(const void *addr)

释放vmalloc申请的内存

(5) unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order)

以gfp_mask的方式分配2^order个物理页面,返回指向该内存区域第一个字节的指针,不清零页面

(6) void free_pages(unsigned long addr, unsigned int order)

释放逻辑地址addr开始的页面2^order次方个

 

标签:malloc,函数,哪些,void,free,内存,size
From: https://www.cnblogs.com/ho966/p/17034206.html

相关文章

  • Fission:基于 Kubernetes 的 Serverless 函数框架
    原文为Platform9的软件工程师SoamVasani所写,讲解了一个基于Kubernetes的Serverless函数(FaaS)框架——Fission。简单的来讲,Fission是一个构建在 ​​Kubernetes​......
  • vue组件的对象式写法,vue中的h函数
    render:将虚拟dom转为真实domh函数:创建的是vnode,也可以成为createVnode函数语法:h(元素名称,这个元素的数据,子集)第一个参数:可以为一个html标签,一个组件,一个异步组......
  • 重载的奥义之函数重载
    一、基本定义             重载,顾名思义从字面上理解就是重复装载,打一个不恰当的比方,你可以用一个篮子装蔬菜,也可以装水果或者其它,使用的是同一个篮子,但......
  • Vue组件之间的通信方式都有哪些?
    一、组件间通信的概念我们通常把组件间通信这个词进行拆分组件通信都知道组件是vue最强大的功能之一,vue中每一个.vue我们都可以视之为一个组件通信指的是发......
  • MIPS32函数调用实例汇编分析
    我们首先来看函数的调用过程,下面的代码属于调用者。la$t9,cgibin_parse_requestlui$a0,0x41#'A'lui$a2,2li$a0,sub_409A6Cjalr$t9......
  • 使用Es6提供的构造函数Proxy实现数据绑定
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</......
  • 函数调用约定
    函数调用约定一、什么是函数调用约定?我们都知道C或者C++中,在调用函数的时候,函数的参数通过栈来传递。如果是一个参数的话非常好控制,但是如果是多个参数,就会遇到很多问题......
  • 增强函数
    抄自这里,加了一些自己的理解吧,但本人数学水平属实不行。不知道极值点偏移这个东西是从哪里发源起来的,可能是全国甲卷吧,感觉常规方法(指对称点作差)的重复性劳动没太大意义,变......
  • 函数传参 Java JavaScript python 都是按值传递的
    实验代码如下:JavapythonJavaScript:......
  • Dotnet程序的内存与垃圾回收
    都知道程序运行时的变量是放在内存里的,从我们学c++就知道有析构函数 malloc,还有学c#的时候天天什么垃圾回收GC像背八股文样的,但是这个内存究竟能分配多少没有人想......