一只菜鸟横空出世,码农世界闯一闯,每天进展多一丢丢。
brk()与sbrk()函数的学习与使用
brk()与sbrk()函数定义如下:
#include
int brk(boid *addr);
addr:把内存末尾指针设置为addr.返回值:0表示成功,非0表示失败
void *sbrk(intptr_t increment);
increment:把内存的末尾指针移动increment个字节。返回值:上次调用sbrk/brk的内存末尾指针。
内容摘选转自:https://blog.csdn.net/tiankaiying/article/details/8499496
虚拟内存的分配.
栈:编译器自动生成代码维护
堆:地址是否映射,映射的空间是否被管理.
棧和堆这两个数据结构是系统管理的。
这个时候就要使用brk/sbrk函数了。这两个函数都是我们自己申请一块内存,这块内存不再由系统托管。完完全全是我们自己管理。也就是说我们自己要负责这一块内存的使用和释放,系统不再负责了。
1.brk/sbrk 内存映射函数 unix的函数
问题1 怎么知道空闲空间?
问题2 内核的内存分配方式?
每个进程可访问的虚拟内存空间为3G,但在程序编译时,不可能也没必要为程序分配这么大的空间,只分配并不大的数据段空间,程序中动态分配的空间就是从这 一块分配的。如果这块空间不够,malloc函数族(realloc,calloc等)就调用sbrk函数将数据段的下界移动,sbrk函数在内核的管理 下将虚拟地址空间映射到内存,供malloc函数使