linuxcnull头⽂件,linuxcmalloc函数定义及⽤法详解
linux c malloc函数所在的头⽂件:#include
molloc函数linux c malloc函数原型及定义void * malloc (size_t size)
函数说明:
malloc的参数size表⽰要分配的字节数,如果分配失败(可能是由于系统内存耗尽)则返回NULL。由于malloc函数不知道⽤户拿到这块内存要存放什么类型的数据,所以返回通⽤指针void *,⽤户程序可以转换成其它类型的指针再访问这块内存。动态分配的内存⽤完之后可以⽤free释放掉,传给free的参数正是先前malloc返回的内存块⾸地址。
linux操作系统系统内存分配来源
1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运⾏期间都存在。例如全局变量,static 变量。
2) 在栈上创建。在执⾏函数时,函数内局部变量的存储单元都可以在栈上创建,函数执⾏结束时这些存储单元⾃动被释放。栈内存分配运算内置于处理器的指令集。
3) 从堆上分配,亦称动态内存分配。程序在运⾏的时候⽤malloc 或new 申请任意多少的内存,程序员⾃⼰负责在何时⽤free 或delete 释放内存。动态内存的⽣存期由程序员决定,使⽤⾮常灵活。
linux系统内存分配的原理
从操作系统⾓度来看,进程分配内存有两种⽅式,分别由两个系统调⽤完成:brk和mmap(不考虑共享内存)。
1、brk是将数据段(.data)的最⾼地址指针_edata往⾼地址推;
2、mmap是在进程的虚拟地址空间中(堆和栈中间,称为⽂件映射区域的地⽅)⼀块空闲的虚拟内存。
这两种⽅式分配的都是虚拟内存,没有分配物理内存。在第⼀次访问已分配的虚拟地址空间的时候,发⽣缺页中断,操作系统负责分配物理内存,然后建⽴虚拟内存和物理内存之间的映射关系。在标准C库中,提供了malloc/free函数分配释放内存,这两个函数底层是由
brk,mmap,munmap这些系统调⽤实现的。
Linux虚拟内存的实现结构如下图所⽰
malloc()函数分配的内存空间来源
malloc()到底从哪⾥得到了内存空间?
答案是从堆⾥⾯获得空间。也就是说函数返回的指针是指向堆⾥⾯的⼀块内存。操作系统中有⼀个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻第⼀个空间⼤
于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。
那么什么是堆?
堆是⼤家共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是⽤户分配的空间。堆在操作系统对进程 初始化的时候分配,运⾏过程中也可以向系统要额外的堆,但是记得⽤完了要还给操作系统,要不然就是内存泄漏。
什么是栈?
栈是线程独有的,保存其运⾏状态和局部⾃动变量的。栈在线程开始的时候初始化,每个线程的栈互相独⽴。每个函数都有⾃⼰的栈,栈被⽤来在函数之间传递参数。操作系统在切换线程的时候会⾃动的切换栈,就是切换SS/ESP寄存器。栈空间不需要在⾼级语⾔⾥⾯显式的分配和释放。
栈是由编译器⾃动分配释放,存放函数的参数值、局部变量的值等。操作⽅式类似于数据结构中的栈。堆⼀般由程序员分配释放,若不释放,程序结束时可能由OS回收。注意这⾥说是可能,并⾮⼀定。所以我想再强调⼀次,记得要释放!
malloc内存分配⽰意图
在linux Centos 5.4上查看malloc函数的头⽂件、定义及返回值命令如下:man malloc
显⽰结果截图:
使⽤malloc函数分配空间并初始化:struct foo *ptr;
...
ptr = (struct foo *) malloc (sizeof (struct foo));
if (ptr == 0) abort ();
memset (ptr, 0, sizeof (struct foo));
使⽤malloc要尽可能按照如下约束操作
1、malloc的size 是4Kbytes的倍数。如果你各处的malloc加起来也没有4Kbytes。那么你⾃⼰申请⼀个4KBYTES,然后⾃⼰规划每处的使⽤。⽽free则⼀次就OK。因为这样有可能⽐你多次malloc申请空间更省系统的内存。所以记得,出于⾼效利⽤资源的⾓度,不浪费系统内存的⽬的,你要4Kbytes的申请空间。
2、如果除了主函数外,⼀个函数⾥,malloc了个空间,同时⼜free了这个空间,则你应当认为这是个设计失误。你完全可以将这些⼯作放到外部函数⾥操作。依次向外推,直到属于主函数调⽤的两个不同函数实现,⼀个是alloc_all,⼀个是free_all。更别提for循环内出现malloc free。
3、除⾮你在做个⾜够⼤的系统。同时⾄少有⾃⼰的⼀套内部存储空间逻辑,否则尽可能的让你的所有计算都落于不⼤于CPU最⼤CACHE 2倍的空间。也就是说⽆论你申请多⼤的空间。真正给与计算操作的窗⼝不要⼤于CACHE2倍。
4、malloc的申请次数越少越好。即便你没有⾃⼰的内存管理模块,也要有组织数据空间的代码。
5、由于page的存在。计算的数据之间的距离尽量⼩。最好始终保持⼩于page的尺⼨。也即任意两个⼆元操作的数据源的地址偏差尽量⼩于4KBytes。
linux下malloc函数代码举例1
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论