申请内存的函数有哪些

申请内存的函数有哪些,以及其特点

其实总结起来,申请内存的函数主要有kmalloc,vmalloc,__get_free_page,malloc函数族,alloca。下面分别介绍:

1. vmalloc:内核态的内存申请函数,也是基于slab机制。申请的物理内存并不连续,速度相比于kmalloc要慢。用于申请大块内存。其分配的内存在内核空间中的动态映射区。Vmalloc能分配的内存较大,可以通过命令“cat /proc/meminfo | grep Vmalloc”来看。通过下图可以看出,在我的计算机上能够通过Vmalloc使用的最大内存总共有122880KB。下图是一个展示。

2. __get_free_page:是页面分配器提供给调用者的最底层的内存分配函数,返回一个页的内存。Get_free_page是对__get_free_pages的一个封装。其中的gfp_mask是一个选项。

Get_free_pages的作用是返回几个页长的内存,其中的order便是页数,他们在物理上是连续的,下面是__get_free_pages的源码,可以看出,他其实是对_alloc_pages进行的一层简单封装,实际上还是使用alloc_pages进行内存分配:

__get_free_pages是基于伙伴系统进行分配内存的,下面进行简单的说下伙伴系统。

伙伴系统是linux中用来解决外部内存碎片的问题的一种机制,所谓外部碎片,是指还没有分配出去,但是由于大小太小而无法分配给申请空间的新进程的内存碎片。

伙伴系统的宗旨就是用最小的内存块来满足内核的对于内存的请求。在最初,只有一个块,也就是整个内存,假如为1M大小,而允许的最小块为64K,那么当我们申请一块200K大小的内存时,就要先将1M的块分裂成两等分,各为512K,这两分之间的关系就称为伙伴,然后再将第一个512K的内存块分裂成两等分,各位256K,将第一个256K的内存块分配给内存,这样就是一个分配的过程。

3. kmalloc:内核态的内存申请函数,使用slab机制,申请的内存物理连续,并且当kmalloc返回的时候内存就已经对应完毕了。Kmalloc主要用于分配小内存。Kmalloc能分配的内存处于内核空间中的前896M,也就是直接映射区。

4. Malloc函数族(以malloc为例):用户态的动态内存申请函数。Malloc是一个库函数,不同的平台上malloc的实现不同。Linux下glibc中使用的是ptmalloc的实现。Malloc是从堆上分配内存,但是内核中并没有堆的概念,堆是应用程序的概念,在进程创建的时候,在进程的虚拟地址空间中划分出一块区域作为对,使用malloc实际上就是从这块虚拟内存中分出更小的区域给应用程序,不过只有当应用程序真正的访问这块内存才会产生缺页中断,从而获得真正的物理内存。Free之后也并不会释放物理内存,只是把这些内存归还给堆。

除了malloc,malloc函数族还包括calloc,realloc。Calloc相比于malloc增加了初始化功能。Realloc则用于重新分配内存。

5. Alloca:动态分配栈上内存,函数结束后自动释放。个人认为主要作用是可以用来做变长数组。

来自为知笔记(Wiz)

时间: 2024-10-27 14:05:33

申请内存的函数有哪些的相关文章

二级指针作为函数参数申请内存

0:声明:这篇文章转自林锐的<高质量的C/C++编程指南>,如果想看电子版文档,请去下载[去下载] 1:如果函数的参数是一个指针,不要指望用该指针去申请动态内存.示例7-4-1 中,Test 函数的语句 GetMemory(str, 200)并没有使 str 获得期望的内存,str 依旧是 NULL,为什么? [html] view plaincopy void GetMemory(char *p, int num) { p = (char *)malloc(sizeof(char) * nu

C-数组, 字符串的输入输出, 内存分配, 三种内存分配函数

数组初始化 1.数组初始化的时候, 可以这样 1 int len = 3; 2 int arr[len]; 2.但是这样不可以: 1 int len = 3; 2 int arr[len] = {1, 2, 3}; 3.但是可以这样: 1 int arr[3] = {1, 2, 3}; 2不可以的原因: 编译器编译的时候 int arr[3] = {1, 2, 3}这种方式会转换成: 1 int arr[3]; 2 arr[0] = 1; 3 arr[1] = 2; 4 arr[2] = 3;

Win内存分配函数(GlobalAlloc/HeapAlloc/LocalAlloc/VirtualAlloc)

内存分配函数/内存管理API 参考: Windows MSDN http://msdn.microsoft.com/en-us/library/aa908768.aspx 附助资料: http://blog.csdn.net/susubuhui/article/details/7315094 http://wenku.baidu.com/link?url=yxgCWePPV1kFaIUciEspYgm34wNAnMLDoduBlfsEEo-mW0JFRVEOkixomUjPatqw_jOXZcq

使用内存管理函数实现动态数组

C语言提供了一些内存管理函数,这些内存管理函数可以按需要动态地分配内存空间,也可把不再使用的空间释放,为有效地使用内存资源提供了手段. 动态数组,指的就是利用内存的申请和释放函数,在程序的运行过程中,根据实际需要指定数组的大小.其本质就是一个指向数组的指针变量. 主要用到的内存管理函数是:malloc和free. 1.分配内存函数malloc: 调用形式:(类型说明符*)malloc(size): 功     能:在内存的动态存储区中分配一块长度为size字节的连续区域. 返     回:该区域

动态内存分配函数与释放函数

(1)分配函数 void *malloc(sizeof(unsigned size) 功能:在内存的动态存储区中分配一块长度位size的连续空间. 返回值:指针,存放被分配内存的起始地址.若未申请到空间,则返回NULL(0). void *:指向任何类型的数据,在使用时,要进行强制类型转换. 例如:int *malloc(sizeof(int)) struct student *malloc(sizeof(struct student)) (2)释放函数 void free(void *ptr)

有关于malloc申请内存和free内存释放

p { margin-bottom: 0.25cm; line-height: 120% } a:link { } malloc工作机制: malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表(堆内存).调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块.然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节).接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上.调用free

[Linux内存]linux内存分配函数总结

linux内核相关 1,linux内核内存分配函数总结 单位 接口 算法 动态大小 kmalloc/kfree/krealloc/kcalloc 按大小组织的缓存数组 固定大小 kmem_cache_create/kmem_cache_destroykmem_cache_alloc/kmem_cache_free Slab[2] 2^n页 alloc_pages/free_pages__get_free_pages/__free_pages 伙伴算法,分配若干(物理连续)页面,返回指向该区域第一

Delphi 的内存操作函数(1): 给字符指针分配内存

马上能想到的函数有: GetMem AllocMem ReallocMem FreeMem GetMemory ReallocMemory FreeMemory New Dispose NewStr DisposeStr StrNew StrAlloc StrDispose GlobalAllocPtr GlobalFreePtr WideStrAlloc AnsiStrAlloc StrDispose Move MoveMemory CopyMemory ZeroMemory FillMemo

C语言动态申请内存

动态内存:new出来的都是动态的,需要程序员手动创建和回收,但在java中有垃圾回收机制. 静态内存:定义出来都是静态的,int i;int j,系统自动创建和回收. #include <stdio.h> #include <malloc.h>//内存分配的头文件 main(){ int* p ;//在栈内存中申请p的空间 //这个函数的返回值为void* 所以要把他强转 p = (int*)malloc(4); //在堆内存申请4个字节的空间 *p = 123; printf(&