brk()系统调用能动态调整进程数据段大小吗?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1773个文字,预计阅读时间需要8分钟。

malloc() 不是系统调用也不是运算符,而是 C 库中的函数,用于动态分配内存。在请求内存时,会以两种方式向操作系统申请堆内存:
方式一:通过 brk() 系统调用从 堆 中分配内存。
我们知道malloc() 并不是系统调用,也不是运算符,而是 C 库里的函数,用于动态分配内存。
malloc 申请内存的时候,会有两种方式向操作系统申请堆内存:
- 方式一:通过 brk() 系统调用从堆分配内存
- 方式二:通过 mmap() 系统调用在文件映射区域分配内存;
一、brk()系统调用
1、brk()的申请方式
一般如果用户分配的内存小于 128 KB,则通过 brk() 申请内存。而brk()的实现的方式很简单,就是通过 brk() 函数将堆顶指针向高地址移动,获得新的内存空间。
malloc 通过brk()方式申请的内存,free 释放内存的时候,并不会把内存归还给操作系统,而是缓存在 malloc 的内存池中,待下次使用,这样就可以重复使用。
2、brk()系统调用的优缺点
所以使用brk()方式的点很明显:可以减少缺页异常的发生,提高内存访问效率。
但它的缺点也同样明显:由于申请的内存没有归还系统,在内存工作繁忙时,频繁的内存分配和释放会造成内存碎片。brk()方式之所以会产生内存碎片,是由于brk通过移动堆顶的位置来分配内存,并且使用完不会立即归还系统,重复使用,如果高地址的内存不释放,低地址的内存是得不到释放的。
本文共计1773个文字,预计阅读时间需要8分钟。

malloc() 不是系统调用也不是运算符,而是 C 库中的函数,用于动态分配内存。在请求内存时,会以两种方式向操作系统申请堆内存:
方式一:通过 brk() 系统调用从 堆 中分配内存。
我们知道malloc() 并不是系统调用,也不是运算符,而是 C 库里的函数,用于动态分配内存。
malloc 申请内存的时候,会有两种方式向操作系统申请堆内存:
- 方式一:通过 brk() 系统调用从堆分配内存
- 方式二:通过 mmap() 系统调用在文件映射区域分配内存;
一、brk()系统调用
1、brk()的申请方式
一般如果用户分配的内存小于 128 KB,则通过 brk() 申请内存。而brk()的实现的方式很简单,就是通过 brk() 函数将堆顶指针向高地址移动,获得新的内存空间。
malloc 通过brk()方式申请的内存,free 释放内存的时候,并不会把内存归还给操作系统,而是缓存在 malloc 的内存池中,待下次使用,这样就可以重复使用。
2、brk()系统调用的优缺点
所以使用brk()方式的点很明显:可以减少缺页异常的发生,提高内存访问效率。
但它的缺点也同样明显:由于申请的内存没有归还系统,在内存工作繁忙时,频繁的内存分配和释放会造成内存碎片。brk()方式之所以会产生内存碎片,是由于brk通过移动堆顶的位置来分配内存,并且使用完不会立即归还系统,重复使用,如果高地址的内存不释放,低地址的内存是得不到释放的。

