申请内存的函数有哪些

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

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

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

 

842584-20151213211507528-975607395.jpg

 

 

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

842584-20151213211508434-1377763508.jpg

 

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

842584-20151213211510934-813599750.jpg

 

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

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

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

 

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

 

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

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

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





转载于:https://www.cnblogs.com/dchipnau/p/5043593.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值