内存分配函数介绍

您所在的位置:网站首页 c内存分配函数 内存分配函数介绍

内存分配函数介绍

2023-01-05 07:52| 来源: 网络整理| 查看: 265

内存分配函数介绍

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