brk和sbrk

在计算机程序中,“program break”通常指的是堆的当前内存边界。当我们改变堆的大小(即分配或释放内存),其实就是在命令内核改变进程的“program break”位置。

最初,“program break”正好位于未初始化数据段(bss)末尾之后。当“program break”的位置抬升后,程序可以访问新分配区域内的任何内存地址,而此时物理内存页尚未分配。这就是“program break”的基本含义和作用。

  1. 进程可以通过增加堆的大小来分配内存,堆是一段长度可变的连续虚拟内存,始于进程的未初始化数据段末尾,随着内存的分配和释放而增减(见下图)。通常将堆的当前内存边界称为“program break”。

  2. 改变堆的大小(即分配或释放内存),其实就是命令内核改变进程的program break位置。最初,program break正好位于未初始化数据段末尾之后(如下图所示,与&end位置相同)。

  3. 在program break的位置抬升后,程序可以访问新分配区域内的任何内存地址,而此时物理内存页尚未分配。内核会在进程首次试图访问这些虚拟内存地址时自动分配新的物理内存页。

  4. 并不降低program break的位置,而是将这块内存添加到空闲内存列表中,供后续的malloc循环使用。

在这里插入图片描述


在计算机程序中,“program break”是影响内存分配的关键因素。以下是一些详细的解释:

  • 堆的大小:进程可以通过增加堆的大小来分配内存,堆是一段长度可变的连续虚拟内存,始于进程的未初始化数据段末尾,随着内存的分配和释放而增减。通常将堆的当前内存边界称为“program break”。

  • 改变堆的大小:改变堆的大小(即分配或释放内存),其实就是命令内核改变进程的“program break”位置。最初,“program break”正好位于未初始化数据段末尾之后。

  • 访问新分配的内存:在“program break”的位置抬升后,程序可以访问新分配区域内的任何内存地址,而此时物理内存页尚未分配。内核在进程首次试图访问这些虚拟内存地址时自动分配新的物理内存页。

  • 系统调用:传统的 UNIX 系统提供了两个操作“program break”的系统调用:brk()sbrk(),在 Linux 中依然可用。虽然代码中很少直接使用这些系统调用,但了解它们有助于弄清内存分配的工作过程。


brk()sbrk()都是用来改变程序的“program break”的位置,也就是改变数据段的长度,实现虚拟内存到物理内存的映射。

brk()函数通过传递的地址addr来重新设置program break,成功则返回0,否则返回-1。你可以把它想象成一个标记,你告诉系统:“嘿,我想把我的数据段结束的地方设在这里。”如果系统认为这个地方合适,就会把数据段的结束位置设在那里,否则就会告诉你失败。

sbrk()函数则是用来增加heap的大小,增加的大小通过参数increment决定,返回增加大小前的heap的program break,如果increment为0则返回program break。你可以把它想象成一个推车,你告诉系统:“嘿,我想把我的数据段向后推这么多。”系统就会把数据段向后推,然后告诉你原来的结束位置在哪里。

总的来说,brk()sbrk()都是用来管理内存的,但是他们的使用方式和场景有所不同。在开发中,一般用sbrk()来分配内存,用brk()来回收内存。


program break 是虚拟内存中数据段的结束位置, malloc 通过调用 brk 或 sbrk 增加 program break 的值,从而创建可以通过 malloc 动态分配的内存空间。 所以堆是进程的数据段的延伸。


当内存分配不够时,你可以使用sbrk()来增加heap的大小。sbrk()函数通过参数increment来增加heap的大小,返回增加大小前的heap的program break。如果increment为0则返回program break。你可以把它想象成一个推车,你告诉系统:“嘿,我想把我的数据段向后推这么多。”系统就会把数据段向后推,然后告诉你原来的结束位置在哪里。

以下是一个使用sbrk()来分配内存的示例:

#include <stdio.h>
#include <unistd.h>int main() {int *p1 = sbrk(4); // 分配4个字节的内存空间printf("p1=%p\n", p1);int *p2 = sbrk(4);int *p3 = sbrk(4);int *p4 = sbrk(4);printf("p2=%p\n", p2);printf("p3=%p\n", p3);printf("p4=%p\n", p4);sbrk(-12); // 释放12个字节的内存空间int *cur = sbrk(0); // 获取sbrk后台的当前位置printf("cur=%p\n", cur);sleep(15);sbrk(4092 + 1);while (1);
}

这个示例可以帮助你理解如何使用sbrk()来分配内存。

参考链接:

  • brk和sbrk所指的program break到底是什么
  • 虚拟内存探究 – 第四篇:malloc, heap & the program break

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/229095.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自研基于Xilinx PCIe的高性能多路视频采集与显示控制器

1 概述 视频采集与显示子系统可以实时采集多路视频信号&#xff0c;并存储到视频采集队列中&#xff0c;借助高效的硬实时视频帧出入队列管理和PCIe C2H DMA引擎&#xff0c;将采集到的视频帧实时传递到上位机采集缓冲区。在超带宽视频采集情况下&#xff0c;支持采集丢帧操作…

2023-简单点-yolox-pytorch代码解析(一)-nets/darknet.py

yolox-pytorch: nets/darknet.py yolox网络结构yolox-pytorch目录今天解析注释net/darknet.pyFocusBaseConvDWConvSPPBottleneckDarknet未完待续。。。 yolox网络结构 yolox-pytorch目录 今天解析注释net/darknet.py #!/usr/bin/env python3 # 指定使用python3来执行此脚本 …

Java核心知识点整理大全21-笔记

目录 18.1.5.1. upstream_module 和健康检测 18.1.5.1. proxy_pass 请求转发 18.1.6. HAProxy 19. 数据库 19.1.1. 存储引擎 19.1.1.1. 概念 19.1.1.2. InnoDB&#xff08;B树&#xff09; 适用场景&#xff1a; 19.1.1.3. TokuDB&#xff08;Fractal Tree-节点带数据&…

Matlab进阶绘图第34期—双三角热图

在《Matlab进阶绘图第29期—三角热图》中&#xff0c;我分享过三角热图的绘制模板。 然而&#xff0c;有的时候&#xff0c;为了节省版面或者方便对比等&#xff0c;需要在一张图上绘制两个三角热图的组合形式&#xff0c;且每个三角热图使用不同的配色方案&#xff0c; 由于…

从0开始学习JavaScript--JavaScript 箭头函数

JavaScript的现代语法&#xff0c;箭头函数&#xff08;Arrow Functions&#xff09;是一个不可忽视的重要部分。它们不仅提供了更简洁的语法&#xff0c;还改变了函数的作用域规则。在这篇文章中&#xff0c;将深入研究JavaScript箭头函数的概念、语法、用法以及它们与传统函数…

【Leetcode合集】1457. 二叉树中的伪回文路径

1457. 二叉树中的伪回文路径 1457. 二叉树中的伪回文路径 代码仓库地址&#xff1a; https://github.com/slience-me/Leetcode 个人博客 &#xff1a;https://slienceme.xyz 给你一棵二叉树&#xff0c;每个节点的值为 1 到 9 。我们称二叉树中的一条路径是 「伪回文」的&am…

双音多频的通信(数字信号处理实验3)

&#xff08;1&#xff09;从数字信号处理的角度分析双音多频通信&#xff0c;查阅资料了解双音多频通信的原理及工作过程&#xff0c;总结在实验报告中。 &#xff08;2&#xff09;了解DTMF接收信号时&#xff0c;离散傅立叶变化的过程。 &#xff08;3&#xff09;在程序中改…

大数据平台/大数据技术与原理-实验报告--部署ZooKeeper集群和实战ZooKeeper

实验名称 部署ZooKeeper集群和实战ZooKeeper 实验性质 &#xff08;必修、选修&#xff09; 必修 实验类型&#xff08;验证、设计、创新、综合&#xff09; 综合 实验课时 2 实验日期 2023.11.04-2023.11.05 实验仪器设备以及实验软硬件要求 专业实验室&#xff08…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑不确定性的火电发电商现货-深度调峰市场优化决策》

标题涉及到电力行业的领域&#xff0c;尤其是火电发电商在电力市场中面对深度调峰需求时的决策问题。下面是对标题的解读&#xff1a; 考虑不确定性&#xff1a; 这指的是在制定优化决策时&#xff0c;考虑到环境的不确定性&#xff0c;可能包括但不限于电力市场的价格波动、发…

简洁、高效、灵活:探索 Spring 同级别的编程框架

文章目录 GrailsMicronautVert.xQuarkusPlay FrameworkDropwizard 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 作为一个Java开发者&#xff0c;Spring框架应该基本上都用过的&#x…

前端算法专栏-数组-75.颜色分类

介绍 Hi 大家好。我是程序员库里&#xff0c;今天新开一个前端算法专栏。 接下来会分类给大家分享常考算法题目。 很多朋友也是看着这套系列算法拿到很多offer&#xff01;所以也是想分享给更多朋友&#xff0c;帮助到有需要的朋友。 分类 数组-三路快排 题目 75. 颜色分…

Python中使用matplotlib库绘图中如何给图形的图例设置中文字体显示

问题&#xff1a;当使用matplotlib绘图时遇到绘图&#xff0c;图例显示不出来中文字体 解决方式&#xff1a; 1&#xff09;加载字体管理库 from matplotlib.font_manager import FontProperties 2&#xff09;设置系统上字体的路径 font FontProperties(fname"C:\\W…