深入Linux内核架构笔记(进程空间堆管理)

堆是进程中用于动态分配变量和数据的内存区域,堆的管理对应用程序员不是直接可见的。因为 它依赖标准库提供的各个辅助函数(其中最重要的是malloc)来分配任意长度的内存区。malloc和 内核之间的经典接口是brk系统调用,负责扩展/收缩堆。新近的malloc实现(诸如GNU标准库提供的) 使用了一种组合方法,使用brk和匿名映射。该方法提供了更好的性能,而且在分配较大的内存区时 具有某些优点

brk系统调用只需要一个参数,用于指定堆在虚拟地址空间中新的结束地址(如果堆将要收缩, 当然可以小于当前值)。 照例,brk系统调用实现的入口是sys_brk函数,深入Linux内核架构笔记(进程空间堆管理)_第1张图片

该代码确保brk的新值(原值也同样)是系统页长度的倍数。换句话说,一页是用brk能分配的 最小内存区域 (因此在用户空间需要另一个分配器函数,将页拆分为更小的区域。这是C标准库的任务

在需要收缩堆时将调用do_munmap

如果堆将要扩大,内核首先必须检查新的长度是否超出进程的最大堆长度限制。find_vma_ intersection接下来检查扩大的堆是否与进程中现存的映射重叠。 

你可能感兴趣的:(Java从开发到设计,linux,linux,架构,gnu)