内存分配函数介绍 |
您所在的位置:网站首页 › c内存分配函数 › 内存分配函数介绍 |
内存分配函数介绍 1 、内核内存( 3-4G 空间)分配:使⽤ kmalloc 和 Vmalloc Kmalloc: 分配⼩内存( 32~131072 字节),内部调⽤ Kmem_cache_alloc ( slab 分配对象函数)实现。 vmalloc :给内核分配⾮连续内存(⽐较⼤的内存),主要调⽤ kmalloc,memset 和 alloc_page kmalloc 保证分配的内存在物理上是连续的 ,vmalloc 保证的是在虚拟地址空间上的连续(物理上不连续,页框是最⼩单位) , malloc 不保证任何东西 2 、进程地址空间分配(⽤户内存 0~3G ) : brk,mmap,sbrk,alloc (分配栈,⽆需⼿动释放) ,malloc,calloc,realloc. 其中 brk,mmap 是系统调 ⽤。 brk 和 sbrk 主要的⼯作是实现虚拟内存到内存的映射 . 在 GNUC 中 , 内存分配是这样的 :
每个进程可访问的虚拟内存空间为 3G ,但在程序编译时,不可能也没必要为程序分配这么⼤的空间,只分配并不⼤的数 据段空间,程序中动态分配的空间就是从这⼀块分配的。如果这块空间不够, malloc 函数族( realloc , calloc 等)就调⽤ sbrk 函数将数据段的下界移动, sbrk 函数在内核的管理下将虚拟地址空间映射到内存,供 malloc 函数使⽤。(参见 linux 内核情景 分析) #include int brk(void *end_data_segment); void *sbrk(ptrdiff_t increment); DESCRIPTION brk sets the end of the data segment to the value specified by end_data_segment, when that value is reasonable, the system does have enough memory and the process does not exceed its max data size (see setrlimit(2)). sbrk increments the program's data space by increment bytes. sbrk isn't a system call, it is just a C library wrapper. Calling sbrk with an increment of 0 can be used to find the current location of the pro- gram break. RETURN VALUE On success, brk returns zero, and sbrk returns a pointer to the start of the new area. On error, -1 is returned, and errno is set to ENOMEM. sbrk 不是系统调⽤,是 C 库函数。系统调⽤通常提供⼀种最⼩界⾯,⽽库函数通常提供⽐较复杂的功能。 在 Linux 系统上,程序被载⼊内存时,内核为⽤户进程地址空间建⽴了代码段、数据段和堆栈段,在数据段与堆栈段之间的空 闲区域⽤于动态内存分配。 内核数据结构 mm_struct 中的成员变量 start_code 和 end_code 是进程代码段的起始和终⽌地址, start_data 和 end_data 是进 程数据段的起始和终⽌地址, start_stack 是进程堆栈段起始地址, start_brk 是进程动态内存分配起始地址(堆的起始地 址),还有⼀个 brk (堆的当前最后地址),就是动态内存分配当前的终⽌地址。 C 语⾔的动态内存分配基本函数是 malloc() ,在 Linux 上的基本实现是通过内核的 brk 系统调⽤。 brk() 是⼀个⾮常简单的系统调⽤,只是简单地改变 mm_struct 结构的成员变量 brk 的值。 mmap 系统调⽤实现了更有⽤的动态内存分配功能,可以将⼀个磁盘⽂件的全部或部分内容映射到⽤户空间中,进程读写⽂ 件的操作变成了读写内存的操作。 在 linux/mm/mmap.c ⽂件的 do_mmap_pgoff() 函数,是 mmap 系统调⽤实现的核⼼。 do_mmap_pgoff() 的代码,只是新建了⼀个 vm_area_struct 结构,并把 file 结构的参数赋值给其成员变量 vm_file ,并没有把⽂ 件内容实际装⼊内存。 Linux 内存管理的基本思想之⼀,是只有在真正访问⼀个地址的时候才建⽴这个地址的物理映射。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |