【C++ 面试 - 内存管理】每日 3 题(五)

news2024/12/24 9:00:49

 ✍个人博客:Pandaconda-CSDN博客

📣专栏地址:http://t.csdnimg.cn/fYaBd

📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

 13. b rk 和 sbrk 的区别

brksbrk 是用于管理进程内存空间的系统调用函数。

brk 函数用于将进程的数据段(data segment)的结束地址设置到指定的地址。可以通过调用 brk 函数来扩大或缩小进程的堆空间。它的原型如下:

int brk(void *addr);

brk 函数将数据段的结束地址设置为 addr,并返回 0 表示成功,-1 表示失败。addr 必须是数据段结束地址向上舍入到系统内存页大小的倍数。

sbrk 函数用于修改进程堆的大小。它的原型如下:

void *sbrk(intptr_t increment);

sbrk 函数会将进程堆的结束地址增加 increment 字节,并返回指向扩展后的堆的起始地址。注意,sbrk 的返回值是指向之前堆的结束地址的指针。如果 increment 是负数,则会减少堆的大小。increment 的值可以是任意整数值。

因此,brk 函数设置数据段的结束地址,而 sbrk 函数则用于将堆的大小扩大或缩小。在实际使用中,较常见的是使用 sbrk 函数来进行内存的分配和释放。而 brk 函数则很少直接被使用,一般是由更高级的内存管理函数或库进行调用和管理。

再总结一下:

brksbrk 是用于控制进程堆区大小的系统调用,通常用于实现动态内存分配。

  1. brk 调用可以将进程的堆区底部指针移动到指定位置,从而扩展或收缩堆区的大小。

  2. sbrk 调用可以增加或减少进程堆区的大小,它接受一个整数参数,表示要增加或减少的字节数。

需要注意的是,具体的内存分配实现可能因操作系统和编译器的不同而有所差异。因此,在特定的环境下, malloc 的行为可能会有所不同。

14. mmap 和 munmap 的区别

mmapmunmap 用于内存映射,通常用于实现动态内存分配和释放。

  1. mmap 调用可以将一个文件或匿名内存映射到进程的地址空间,也可以用于分配一块匿名内存(例如堆区)。

  2. munmap 调用用于取消内存映射,释放已映射的内存区域。

15. malloc 实现方案

由于 brk/sbrk/mmap 属于系统调用,如果每次申请内存,都调用这三个函数中的一个,那么每次都要产生系统调用开销 (即 cpu 从用户态切换到内核态的上下文切换,这里要保存用户态数据,等会还要切换回用户态) ,这是非常影响性能的;

其次,这样申请的内存容易产生碎片,因为堆是从低地址到高地址,如果低地址的内存没有被释放,高地址的内存就不能被回收。

鉴于此,malloc 采用的是内存池的实现方式,malloc 内存池实现方式更类似于 STL 分配器和 memcached 的内存池,先申请一大块内存,然后将内存分成不同大小的内存块,然后用户申请内存时,直接从内存池中选择一块相近的内存块即可。

  

  

malloc 将内存分成了大小不同的 chunk,然后通过 bins 来组织起来。malloc 将相似大小的 chunk (图中可以看出同一链表上的 chunk 大小差不多) 用双向链表链接起来,这样一个链表被称为一个 bin。malloc 一共维护了 128 个 bin,并使用一个数组来存储这些 bin。数组中第一个为 unsorted bin,数组编号前 2 到前 64 的 bin 为 small bins,同一个 small bin 中的 chunk 具有相同的大小,两个相邻的 small bin 中的 chunk 大小相差 8 bytes。small bins 后面的 bin 被称作 large bins。large bins 中的每一个 bin 分别包含了一个给定范围内的 chunk,其中的 chunk 按大小序排列。large bin 的每个 bin 相差 64 字节。

malloc 除了有 unsorted bin,small bin,large bin 三个 bin 之外,还有一个 fast bin。一般的情况是,程序在运行时会经常需要申请和释放一些较小的内存空间。当分配器合并了相邻的几个小的 chunk 之后,也许马上就会有另一个小块内存的请求,这样分配器又需要从大的空闲内存中切分出一块,这样无疑是比较低效的,故而,malloc 中在分配过程中弓入了 fast bins,不大于 max fast (默认值为 64B) 的 chunk 被释放后,首先会被放到 fastbins 中,fast bins 中的 chunk 并不改变它的使用标志 P。这样也就无法将它们合并,当需要给用户分配的 chunk 小于或等于 max fast 时,malloc 首先会在 fast bins 中查找相应的空闲块,然后才会去查找 bins 中的空闲 chunk。在某个特定的时候,malloc 会遍历 fast bins 中的 chunk,将相邻的空闲 chunk 进行合并,并将合并后的 chunk 加入unsorted bin 中,然后再将 unsorted bin 里的 chunk 加入 bins 中。

unsorted bin 的队列使用 bins 数组的第一个,如果被用户释放的 chunk 大于 max fast,或者 fast bins 中的空闲 chunk 合并后,这些 chunk 首先会被放到 unsorted bin 队列中,在进行 malloc 操作的时候,如果在 fast bins 中没有找到合适的 chunk,则 malloc 会先在 unsorted bin 中查找合适的空闲 chunk,然后才查找 bins。如果unsorted bin 不能满足分配要求。malloc 便会将 unsorted bin 中的 chunk 加入 bins 中。然后再从 bins 中继续进行查找和分配过程。从这个过程可以看出来,unsorted bin 可以看做是 bins 的一个缓冲区,增加它只是为了加快分配的速度。 (其实感觉在这里还利用了局部性原理,常用的内存块大小差不多,从 unsorted bin 这里取就行了,这个和 TLB 之类的都是异曲同工之妙啊!)

除了上述四种 bins 之外,malloc 还有三种内存区:

  • 当 fast bin 和 bins 都不能满足内存需求时,malloc 会设法在 top chunk 中分配一块内存给用户;top chunk 为在 mmap 区域分配一块较大的空闲内存模拟 sub-heap。(比较大的时候) > top chunk 是堆顶的 chunk,堆顶指 brk 位于 top chunk 的顶部。移动 brk 指针,即可扩充 top chunk 的大小。当 top chunk 大小超过 128k (可配置) 时,会触发 malloc trim 操作,调用 sbrk (-size) 将内存归还操作系统。

  • 当 chunk 足够大,fast bin 和 bins 都不能满足要求,甚至 top chunk 都不能满足时 malloc 会从 mmap 来直接使用内存映射来将页映射到进程空间,这样的 chunk 释放时,直接解除映射,归还给操作系统。 (极限大的时候)

  • Last remainder 是另外一种特殊的 chunk,就像 top chunk 和 mmaped chunk 一样不会在任何 bins 中找到这种 chunk。当需要分配一个 small chunk,但在 small bins 中找不到合适的 chunk,如果 last remainder chunk 的大小大于所需要的 small chunk 大小,last remainder chunk 被分裂成两个 chunk,其中一个 chunk 返回给用户,另一个 chunk 变成新的 last remainder chunk。 (这个应该是 fast bins 中也找不到合适的时候,用于极限小的)

  

  

当 chunk 空闲时,其 M 状态是不存在的,只有 AP 状态,原本是用户数据区的地方存储了四个指针,指针 fd 指向后一个空闲的 chunk,而 bk 指向前一个空闲的 chunk,malloc 通过这两个指针将大小相近的 chunk 连成一个双向链表。在 large bin 中的空闲 chunk,还有两个指针,fd nextsize 和 bk nextsize,用于加快在 large bin 中查找最近匹配的空闲 chunk。不同的 chunk 链表又是通过 bins 或者 fast bins 来组织的。(这里就很符合网上大多数人说的链表理论了)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目策划书六度自由双足机器人

一、项目的简要介绍 双足机器人的机构是所有部件的载体,也是设计双足机器人最基本的和首要的工作。本文根据项目规划和控制任务要求,按照从总体到部分、由主到次的原则,设计了一种适合仿人双足机器人控制的机构.文章首先从机构的设计目标出发&#xff0c…

条件拼接 - 根据入参生成where条件

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 条件拼接 - 根据入参生成where条件 前言一、GraphConditionEnum 支持的条件二、ConditionServiceImpl 实现类三、DbDataTypeEnum 入参的数据类型四、GraphTypeEnum 图数据的类…

【C/C++】int类型32位有符号整数的含义

在C语言中,int类型的取值范围是有符号的32位整数,即-2,147,483,648到2,147,483,647。‌ 这个范围是由int类型在32位系统上的存储大小决定的。具体来说,int类型在C语言中占4个字节,即32个二进制位。当表示正数时,最高位…

从永远到永远-日语学习-动词三分类及ます变形

动词三分类 0.前置知识1.动词三分类3.判断方法4.变形 0.前置知识 讨论的都是基于动词原形动词变ます形,是因为小日子骨子里的假客套,ます形比较礼貌。日语所有动词原型都是う段结尾五段动词联想う段动2、动3原型都是る结尾上一段动词(い段る…

PS制作曲线背景

新建图层->设置颜色 钢笔->画个路径 画笔->柔边缘5像素 描边路径->工具->模拟压力 图层->Ctrl->缩略图 编辑->定义画笔预设 F5->画笔设置->间距5%->形状动态->角度抖动300

【突出百分比的图表创意】保姆级教程(Excel 图表呈现)

包学包会 效果一览:思路:圆形百分比图表 保姆级详细过程先试着做一个吧接下来完成剩下的其他图标探索 效果一览: 思路: 先准备好两个形状一致的图形,中间填充不同颜色,一深一浅。 一个用来表示百分百&…

Git项目的文件泄露分析和漏洞修复

说明:本文仅是用于学习分析自己搭建的Git漏洞内容和原理,请勿用在非法途径上,违者后果自负,与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》‌及其相关法规内容【学法时习之丨网络安全在身边一图了解网络安全法_中央网络安全和信息化委员会办公室】 …

C语言典型例题53

《C程序设计教程(第四版)——谭浩强》 例题4.5 用π/41-1/31/5-1/7……公式来计算π的近似值,知道某一项的绝对值小于10的六次方为止 代码: //《C程序设计教程(第四版)——谭浩强》 //例题4.5 用π/41-1/3…

移动支付背后的信息安全与防控策略

你是否有过以下担心? 每次支付后,担心金额扣除多了; 账号不幸被盗后,银行卡(绑卡)是否会被恶意刷爆; 存移动钱包的钱,哪天不翼而飞; 本文讨论了移动支付背后的安全防控策略,强调了支付安全的…

安达发|企业实施APS计划排单系统会有哪些效益?

在竞争日益激烈的商业环境中,企业如何保持竞争力并实现可持续发展?答案可能就隐藏在先进的生产管理工具中。今天,我们将深入探讨企业实施APS(高级计划排程)计划排单系统所带来的五大惊人效益,这些效益不仅能…

【Python学习手册(第四版)】学习笔记22-模块代码编写基础

个人总结难免疏漏,请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。 本文主要介绍模块编码工具的基础知识:import和from语句,以及reload调用,介绍了模块命名空间(这个概念可能因为翻译…

数据结构;顺序表;链式表

1.衡量一个程序是否优秀: 1.时间复杂度: 数据量增长与程序运行时间的比例关系以函数描述称为时间渐进复杂度函数,简称时间复杂度 O(c) > O(logn) > O(n) > O(nlogn) > O(n^2) > O(n^3) > O(2^n) 2.空间复杂度…

echarts倾斜横向堆叠柱状图

代码如下 option: {backgroundColor: "transparent",tooltip: {trigger: "axis",axisPointer: {lineStyle: {color: {type: "linear",x: 0,y: 0,x2: 0,y2: 1,colorStops: [{offset: 0,color: "rgba(126,199,255,0)", // 0% 处的颜色}…

Sentinel-1 Level 1数据处理的详细算法定义(七)

《Sentinel-1 Level 1数据处理的详细算法定义》文档定义和描述了Sentinel-1实现的Level 1处理算法和方程,以便生成Level 1产品。这些算法适用于Sentinel-1的Stripmap、Interferometric Wide-swath (IW)、Extra-wide-swath (EW)和Wave模式。 今天介绍的内容如下&…

模型 SPIN销售法

系列文章 分享 模型,了解更多👉 模型_思维模型目录。探需挖痛,引导成交。 1 SPIN销售法的应用 1.1 提升工作效率的软件销售应用SPIN模型 一家制造企业正在寻求提升工作效率的解决方案。他们注意到员工在处理文件和任务时存在效率问题&#…

SX_Git Graph图形化案例详解_20

这里写目录标题 1、前言:2、需求:3、需求满足:1.克隆到本地操作:2.创建自己的本地分支并连接远程分支:3.修改代码推送代码:4.分支的rebase和merge操作:5.拉取操作: 1、前言: git gra…

排队辅助功能二手车,全速自适应巡航

沃尔沃 xc90 2015款 acc 3秒后会停止 pilot 15公里以内 停止场景少 ‌沃尔沃全新XC90确实新增了排队辅助功能‌,这一功能旨在缓解驾驶者在低速排队行驶中的疲劳,通过自动控制加速、刹车和转向来跟随前方车辆,从而让驾乘体验更加安全舒适。这…

python办公自动化:PPT工具之`Python-PPTX`简介

第1章 简介 1.1 什么是Python-PPTX库? Python-PPTX库是一个用于创建和修改Microsoft PowerPoint (.pptx) 文件的Python库。它提供了一个易于使用的API,使得开发者能够以编程方式操纵PowerPoint文件,包括创建新文件、修改现有文件、添加文本…

【人工智能 | 机器学习 | 理论篇】决策树(decision tree)

文章目录 1. 基本流程2. 划分选择2.1 信息增益2.2 增益率2.3 基尼系数 3. 剪枝处理3.1 预剪枝3.2 后剪枝 4. 连续与缺失值4.1 连续值处理4.2 缺失值处理 5. 多变量决策树 1. 基本流程 二分类任务决策树流程: 决策树:包含 1个根结点、若干个内部结点、若…

云计算实训37——Dockerfile的应用+私有仓库的创建与管理

一、文件联合系统 文件联合系统(Overlay Filesystem): 是一种允许多个文件系统层叠在一起的文件系统。它通常用于将只读文件系统(如基础镜像)与可写文件系统(如用户的修改)结合,形…