如何使用brk()系统调用来调整进程的内存空间?

更新于
2026-10-10 01:29:37
0阅读来源:SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1792个文字,预计阅读时间需要8分钟。

如何使用brk()系统调用来调整进程的内存空间?

我们知道malloc()不是系统调用,也不是运算符,而是C库中的函数,用于动态分配内存。malloc()请求内存时,会以两种方式向操作系统请求堆内存:方式一:通过brk()系统调用从“末尾分配内存;方式二:通过sbrk()系统调用从当前位置分配内存。”

我们知道malloc() 并不是系统调用,也不是运算符,而是 C 库里的函数,用于动态分配内存。

malloc 申请内存的时候,会有两种方式向操作系统申请堆内存:

  • 方式一:通过 brk() 系统调用从堆分配内存
  • 方式二:通过 mmap() 系统调用在文件映射区域分配内存;

一、brk()系统调用

1、brk()的申请方式

一般如果用户分配的内存小于 128 KB,则通过 brk() 申请内存。而brk()的实现的方式很简单,就是通过 brk() 函数将堆顶指针向高地址移动,获得新的内存空间。

malloc 通过brk()方式申请的内存,free 释放内存的时候,并不会把内存归还给操作系统,而是缓存在 malloc 的内存池中,待下次使用,这样就可以重复使用。

2、brk()系统调用的优缺点

所以使用brk()方式的点很明显:可以减少缺页异常的发生,提高内存访问效率。

但它的缺点也同样明显:由于申请的内存没有归还系统,在内存工作繁忙时,频繁的内存分配和释放会造成内存碎片。brk()方式之所以会产生内存碎片,是由于brk通过移动堆顶的位置来分配内存,并且使用完不会立即归还系统,重复使用,如果高地址的内存不释放,低地址的内存是得不到释放的。

阅读全文

本文共计1792个文字,预计阅读时间需要8分钟。

如何使用brk()系统调用来调整进程的内存空间?

我们知道malloc()不是系统调用,也不是运算符,而是C库中的函数,用于动态分配内存。malloc()请求内存时,会以两种方式向操作系统请求堆内存:方式一:通过brk()系统调用从“末尾分配内存;方式二:通过sbrk()系统调用从当前位置分配内存。”

我们知道malloc() 并不是系统调用,也不是运算符,而是 C 库里的函数,用于动态分配内存。

malloc 申请内存的时候,会有两种方式向操作系统申请堆内存:

  • 方式一:通过 brk() 系统调用从堆分配内存
  • 方式二:通过 mmap() 系统调用在文件映射区域分配内存;

一、brk()系统调用

1、brk()的申请方式

一般如果用户分配的内存小于 128 KB,则通过 brk() 申请内存。而brk()的实现的方式很简单,就是通过 brk() 函数将堆顶指针向高地址移动,获得新的内存空间。

malloc 通过brk()方式申请的内存,free 释放内存的时候,并不会把内存归还给操作系统,而是缓存在 malloc 的内存池中,待下次使用,这样就可以重复使用。

2、brk()系统调用的优缺点

所以使用brk()方式的点很明显:可以减少缺页异常的发生,提高内存访问效率。

但它的缺点也同样明显:由于申请的内存没有归还系统,在内存工作繁忙时,频繁的内存分配和释放会造成内存碎片。brk()方式之所以会产生内存碎片,是由于brk通过移动堆顶的位置来分配内存,并且使用完不会立即归还系统,重复使用,如果高地址的内存不释放,低地址的内存是得不到释放的。

阅读全文