申请内存的函数有哪些
申请内存的函数有哪些,以及其特点
其实总结起来,申请内存的函数主要有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:动态分配栈上内存,函数结束后自动释放。个人认为主要作用是可以用来做变长数组。