brk和sbrk工作原理.docx
《brk和sbrk工作原理.docx》由会员分享,可在线阅读,更多相关《brk和sbrk工作原理.docx(8页珍藏版)》请在第壹文秘上搜索。
1、brk和Sbrk及内存分配函数相关brk和Sbrk主要的工作是实现虚拟内存到内存的映射.在GNUC中,内存分配是这样的:每一个进程可访问的虚拟内存空间为3G,但在程序编译时,不可能也没必要为程序分配这么大的空间,只分配并不大的数据段空间,程序中动态分配的空间就是从这一块分配的。如果这块空间不够,malloc函数族(realloc,CalIoC等)就调用Sbrk函数将数据段的下界移动,Sbrk函数在内核的管理下将虚拟地址空间映射到内存,供malloc函数使用。(参见Iinux内核情景分析)#includeintbrk(void*end_data_segment);void*sbrk(ptrdif
2、fjincrement);DESCRIPTIONbrksetstheendofthedatasegmenttothevaluespecifiedbyend_data_segment,whenthatvalueisreasonable,thesystemdoeshaveenoughmemoryandtheprocessdoesnotexceeditsmaxdatasize(seesetrlimit(2).sbrkincrementstheprogramsdataspacebyincrementbytes.sbrkisntasystemcall,itisjustaClibrarywrapper.C
3、allingsbrkwithanincrementof0canbeusedtofindthecurrentlocationoftheprogrambreak.RETURNVALUEOnsuccess,brkreturnszero,andsbrkreturnsapointertothestartofthenewarea.Onerror,-1isreturned,anderrnoissettoENOMEM.Sbrk不是系统调用,是C库函数。系统调用通常提供一种最小功能,而库函数通常提供比较复杂的功能。在LirlUX系统上,程序被载入内存时,内核为用户进程地址空间建立了代码段、数据段和堆栈段,在数据
4、段与堆栈段之间的空暇区域用于动态内存分配。内核数据结构mm_struct中的成员变量StarLCOde和end_code是进程代码段的起始和终止地址,Start_data和end_data是进程数据段的起始和终止地址,Start_stack是进程堆栈段起始地址,StarLbrk是进程动态内存分配起始地址(堆的起始地址),还有一个brk(堆的当前最后地址),就是动态内存分配当前的终止地址。C语言的动态内存分配基本函数是malloc(),在LinUX上的基本实现是通过内核的brk系统调用。brk()是一个非常简单的系统调用,只是简单地改变mm_struct结构的成员变量brk的值。mmap系统调用
5、实现了更实用的动态内存分配功能,可以将一个磁盘文件的全部或者部份内容映射到用户空间中,进程读写文件的操作变成为了读写内存的操作。在IinUXmmmmap.c文件的doTImaP_Pgoffo函数,是mm叩系统调用实现的核心。do_mmap_Pgoff()的代码,只是新建了一个vm_area_struct结构,并把file结构的参数赋值给其成员变量mjile,并没有把文件内容实际装入内存。1.inux内存管理的基本思想之一,是惟独在真正访问一个地址的时候才建立这个地址的物理映射。C语言跟内存分配方式(1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例
6、如全局变量,StatiC变量。(2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。(3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或者new申请任意多少的内存,程序员自己负责在何时用free或者delete释放内存。动态内存的生存期由我们决定,使用非常灵便,但问题也最多C语言跟内存申请相关的函数主要有alloc,calloc,malloc,free,realloc,Sbrk等.其中alloc是向栈申请内存,因此无需释放.malloc分配的内存是位
7、于堆中的,并且没有初始化内存的内容,因此基本上malloc之后,调用函数memset来初始化这部份的内存空间.calloc则将初始化这部份的内存,设置为0.而realloc则对malloc申请的内存进行大小的调整.申请的内存最终需要通过函数free来释放.而sbrk则是增加数据段的大小;malloc/calloc/free基本上都是C函数库实现的,跟OS无关.C函数库内部通过一定的结构来保存当前有多少可用内存.如果程序malloc的大小超出了库里所留存的空间,那末将首先调用brk系统调用来增加可用空间,然后再分配空间.free时,释放的内存并不即将返回给os,而是保留在内部结构中.可以打个比方
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- brk sbrk 工作 原理
