Linux--brk系统调用
发布网友
发布时间:2024-10-06 12:45
我来回答
共1个回答
热心网友
时间:2024-11-01 21:21
Linux内核中的`brk()`系统调用
在Linux内核中,`brk()`系统调用是用于改变数据段大小的,它包括了数据段的增加和减少。通常在实际应用中,不会单独调用此系统调用,但它被malloc库函数使用来提供应用程序的内存管理。当malloc库发现内存不足时,它会向内核请求分配一段内存,这段内存需要满足页面对齐条件,即其大小应该是页面大小的整数倍。
查看进程内存使用情况时,可以通过`top`命令查看`VSZ`值。`VmPeak`值表示程序使用的所有内存大小,在内核中,这个值通过`mm->total_vm`反映出来。`total_vm`主要在进程任务的`proc`下生成状态统计信息。了解`VmPeak`的来源,离不开`malloc()`库函数,因为`malloc()`会调用`brk()`系统调用。
在`brk()`的调用过程中,主要由`do_brk()`函数完成其主要功能。`do_brk()`函数完成了内存释放、申请和建立内存空间映射关系等功能。关注`mm`中的`total_vm`成员,可以发现,`total_vm`在最后会增加调整的内存长度,且单位为页面大小(通常在2.6.36版本内核中为4KB)。然而,`total_vm`的值在free内存后可能不一定会减少,因为`lib`库在应用程序内存不足时请求内核分配内存,返回给应用期望大小的内存,不释放内存回系统剩余空间,导致`total_vm`持续增长。此时,`total_vm`的真正作用、何时降低以及在哪些系统中会出现不同情况值得深入探讨。