brk()系统调用能动态调整进程数据段大小吗?

2026-04-16 10:362阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

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

brk()系统调用能动态调整进程数据段大小吗?

malloc() 不是系统调用也不是运算符,而是 C 库中的函数,用于动态分配内存。在请求内存时,会以两种方式向操作系统申请堆内存:

方式一:通过 brk() 系统调用从 堆 中分配内存。

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分钟。

brk()系统调用能动态调整进程数据段大小吗?

malloc() 不是系统调用也不是运算符,而是 C 库中的函数,用于动态分配内存。在请求内存时,会以两种方式向操作系统申请堆内存:

方式一:通过 brk() 系统调用从 堆 中分配内存。

brk()系统调用能动态调整进程数据段大小吗?

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

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

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

一、brk()系统调用

1、brk()的申请方式

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

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

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

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

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

阅读全文