堆内存和Slab分配

2024-04-28

我很困惑heap and free list。我有几个问题,我对C中malloc的工作原理有自己的理解。如果我错了,请纠正我。

  • 堆内存是否被组织为数据的链表(空闲列表) 块?
  • 堆内存和空闲列表有区别吗?

我对存储分配的理解(有待改进):- 当我们调用malloc时,它会在堆中分配内存,并通过从堆中选择一个合适大小的数据块来分配内存。free list, 正确的 ?

当 malloc 返回某个内存块时,它将从空闲列表中删除,并在页表中更新该内存块的物理地址。

当内存被释放时使用free(),数据块被插回到空闲列表中,并且可能,为了减少碎片,与相邻块结合,并且present页表项中的位被清除。

所以整个堆是一个空闲列表(空闲块的链表)+分配的数据块。

这是存储分配的全面描述吗?

编辑:来自Linux内核开发(Robert Love)关于内存管理的章节,板坯分配

“空闲列表包含可用的、已分配的数据块 结构。当代码需要数据结构的新实例时,它 可以从空闲列表中获取结构之一而不是分配 足够的内存量并为数据结构设置它。 稍后,当不再需要该数据结构时,将其返回到 空闲列表而不是释放。从这个意义上说,空闲列表 充当对象缓存,缓存常用类型的对象。”

空闲列表被称为“可用的、已分配的数据结构块”。

  • 如何已分配,当它在空闲列表中时?
  • 以及如何将一块内存返回到空闲列表_not_ 与取消分配该块相同吗?
  • slab 分配与存储分配有何不同

malloc()与页表并没有真正的关系;它分配虚拟地址,内核负责跟踪页面实际存储在物理 RAM 或磁盘上的位置。

malloc()通过与内核交互brk()系统调用,要求内核为进程分配更多页面,或将页面释放回内核。所以内存分配实际上有两个级别:

  • 内核将页面分配给进程,使这些页面无法被其他进程使用。从内核的角度来看,页面可以位于任何地方,并且它们的位置由页表跟踪,但从进程的角度来看,它是一个连续的虚拟地址空间。 “程序中断”brk()操作是内核允许您访问的地址(因为它们对应于分配的页面)和如果您尝试访问它们将导致分段错误的地址之间的边界。
  • malloc()分配程序数据段的可变大小部分以供程序使用。当当前数据段大小内没有足够的可用空间时,它会使用brk()从内核获取更多页面,使数据段更大。当它发现数据段末尾的某些空间未被使用时,它使用brk()将未使用的页面返回给内核,从而使数据段变小。

请注意,即使在该进程中运行的程序实际上并未将页面用于任何用途,也可以将页面分配给进程(由内核)。如果你free()位于数据段中间的一块内存,free()不能使用brk()缩小数据段,因为在更高的地址上仍然有其他分配的块。因此,从内核的角度来看,这些页面仍然分配给您的程序,即使它们从内核角度来看是“可用空间”。malloc()立场。

您对空闲列表如何工作的描述对我来说听起来很正确,尽管我不是内存分配器如何实现的专家。但是您从 Robert Love 发布的引用听起来像是在谈论 Linux 内核中的内存分配,这与 的内存分配无关malloc()在用户空间进程内。这种空闲列表的工作方式可能有所不同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

堆内存和Slab分配 的相关文章

  • C++ 中的单例和抽象基类

    最近我遇到了关于实现 Singleton 但涉及抽象基类的问题 假设我们有这样的类层次结构 class IFoo it s ABC class Foo public IFoo 我们的单例类定义如下 template
  • 如何“杀死”Pthread?

    我正在学习 Pthreads 并且想知道杀死这样一个对象的最佳方法是什么 在寻找类似的问题后 我无法找到 明确 的答案 但请随时向我指出任何相关问题 我正在使用一个小型客户端服务器应用程序 其中服务器主线程正在侦听套接字上的客户端连接 每次
  • 基于 MS Bot Framework 中的响应分支对话框/表单

    我们正在尝试使用 MS Bot Framework 但尚未完全弄清楚如何实现此场景 我们有一个 LUIS 对话框 类型 它工作正常并且经过适当的培训 以常见的三明治为例 LUIS 意图寻找的基本内容是用户询问订单状态 如果问题中提供了订单号
  • 具有多重继承的类的 sizeof

    首先 我知道 sizeof 取决于机器和编译器的实现 我使用的是 Windows 8 1 x64 gcc 5 3 0 没有标志传递给编译器 我从大学讲座中得到了以下代码 include
  • 如何从linux命令行运行.exe可执行文件? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 Windows 中有一个 abc exe 可执行文件 我可以使用 DOS 命令提示来执行此应用程序 并为其提供一些运行时变量 我想从
  • C 中“for”循环中的两个变量

    我正在编写一些代码 需要在其中使用两个变量for环形 下面的代码看起来没问题吗 它确实给了我预期的结果 for loop 1 offset loop 2 offset 2 loop 1 gt offset 190 loop 2 lt 190
  • 控制器中的异常处理 (ASP.NET MVC)

    当您自己的代码抛出异常并从控制器中的操作调用时 应该如何处理 我看到很多最佳实践的例子 其中根本没有 try catch 语句 例如 从存储库访问数据 public ViewResult Index IList
  • 替换 JSON 中的转义字符

    我想用空格替换 JSON 字符串中的 字符 我怎样才能做到这一点 我发现从 JSON 字符串中删除所有转义字符的最简单 最好的方法是将字符串传递到正则表达式 Unescape 方法 此方法返回一个没有转义字符的新字符串 甚至删除了 n t
  • 获取给定EntityType的导航属性

    我在用VS2010 EF4 0 需要如下功能 private string GetNaviProps Type entityType eg typeof Employee NorthwindEntities en new Northwind
  • 从窗口内容截取屏幕截图(无边框)

    我正在寻找有关如何使用 C 将表单内容保存在位图中的解决方案 我已经尝试过使用 DrawToBitmap 但它捕获了所有带边框的窗口 这就是这段代码的结果 public static Bitmap TakeDialogScreenshot
  • Create CFrameWnd 给出了第一次机会异常——为什么?

    我正在尝试使用基于 CFrameWnd 的代码编写一个简单的 MFC 应用程序 该应用程序在可滚动窗口中绘制 下面的代码改编自 Prosise Programming Windows with MFC 第 2 版 第 89ff 页 当我在调
  • 如何用C++解析复杂的字符串?

    我试图弄清楚如何使用 解析这个字符串sstream 和C 其格式为 string int int 我需要能够将包含 IP 地址的字符串的第一部分分配给 std string 以下是该字符串的示例 std string 127 0 0 1 1
  • .Net Core 中的脚手架以及解决方案中的多个项目

    我创建了一个针对 net461 的 Net Core MVC6 应用程序 我使用了一个我非常熟悉的项目结构 其中我将数据 模型和服务类放置在单独的类库项目中 并且 Web 项目引用这些项目 当我尝试搭建控制器时 我收到一条错误 指出我正在搭
  • 使用互斥锁来阻止临界区外部的执行

    我不确定我的术语是否正确 但这里是 我有一个由多个线程使用的函数来写入数据 在注释中使用伪代码来说明我想要的内容 these are initiated in the constructor int data std atomic
  • C 的“char”使用什么字符集? [复制]

    这个问题在这里已经有答案了 简单的问题 我最近开始用 C 编程 有一个简单的问题 C 编程语言在其 char 类型中使用什么字符集 例如 ASCII 还是取决于软件 操作系统 char 本质上是 1 个字节 主要在所有操作系统上 所以默认情
  • Qt:将拖放委托给子级的最佳方式

    我在 QWidget 上使用拖放 我重新实现了 DragEnterEvent dragLeaveEvent dragMoveEvent 和 dropEvent 效果很好 在我的 QWidget 中 我有其他 QWidget 子级 我希望它们
  • 如何从代码隐藏中向我的 div 添加点击事件?

    如何从代码隐藏中向我的 div 添加点击事件 当我点击 div 时 会出现一个消息框 其中显示 您想删除它吗 并在框中显示 是 或 否 全部来自后面的代码 while reader Read System Web UI HtmlContro
  • 如何解释“错误C2018:未知字符'0x40'?[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 在编译一些代码时 我收到以下信息 错误 C2018 未知字符 0x40 我想知道如何解决这样的问题 这是我要开始的地方
  • double 类型的静态类成员的常量表达式初始值设定项

    在 C 11 和 C 14 中 为什么我需要constexpr在下面的代码片段中 class Foo static constexpr double X 0 75 而这会产生编译器错误 class Foo static const doub
  • C/C++ 通过 Android NDK 在 JNI 中看不到 Java 方法

    我正在尝试从使用 NDK 构建的 C 类文件调用 Java 方法 它不断抛出常见的 未找到非静态方法 错误并导致整个 Android 应用程序崩溃 下面的代码片段 有些东西可能不需要 但我按原样保留它们 因为焦点 问题在于refreshJN

随机推荐

  • 自定义 pytest junitxml 失败报告

    我正在尝试内省测试失败并将附加数据包含到 junit xml 测试报告中 具体来说 这是对外部产品的一套功能测试 我想将产品的日志包含到故障报告中 使用找到的方法here https stackoverflow com questions
  • 如何将maven项目转换为web应用项目?

    我想将 Maven 项目转换为 Web 应用程序项目 其中应包含 web xml 我正在使用 Eclipse Juno 4 2 和 m2e Eclipse 的 Maven 集成 插件软件 任何回复将不胜感激 Install m2e wtp
  • 使用 lsof 对“打开的文件过多”进行故障排除

    我有一个在 Linux 上运行的 Java 应用程序 PID 为 25426 运行时lsof p 25426 我注意到 java 25426 uid 420w FIFO 0 8 0t0 273664482 pipe java 25426 u
  • Python 是否有与 PHP 函数 htmlspecialchars() 等效的函数?

    Python 中是否有与 PHP 函数 htmlspecialchars 类似或等效的函数 到目前为止我发现的最接近的是htmlentitydefs entitydefs 我所知道的最接近的是cgi escape http docs pyt
  • 如何使用 cout 以全精度打印双精度值?

    In my 先前的问题 https stackoverflow com questions 553974 why does int55 54 in c我正在打印一个double using cout当我没有预料到的时候 它就被四舍五入了 我
  • 汇编编程语言:程序仅当输入为 ESC 时退出,并在退出前要求确认(y/n),否则循环

    我只是汇编语言编程的初学者 我们的第一个任务是让程序仅在输入为 ESC 时退出 退出之前请求确认 y n 否则循环 我知道 ESC 在 ASCII 代码中具有等效值 但我对插入位置或是否需要添加更多内容感到困惑 请帮我 这是程序 model
  • 如何使用事务范围的持久化上下文进行非事务性读取查询?

    我读了 Spring 文档 它说 PersistenceContext 注解有一个可选的属性类型 默认为 PersistenceContextType TRANSACTION 此默认值是您接收共享所需的 实体管理器代理 这是否意味着我必须让
  • 调用 PHP 爆炸并访问第一个元素? [复制]

    这个问题在这里已经有答案了 可能的重复 用于取消引用函数结果的 PHP 语法 https stackoverflow com questions 742764 php syntax for dereferencing function re
  • 如何选中/取消选中单个单选按钮

    ssn byphone click function var ssn role document getElementById ssn byphone checked if ssn role true ssn div hide ssn by
  • “Backbone.js 视图”中的单击事件不起作用

    我尝试开始使用backbone js 但我发现当我不使用 body 作为视图的el时 该事件不起作用 这是代码 您可以将其另存为 html 文件并运行
  • 获取 UNIX 时间戳的正确小时

    我认为这是一个愚蠢的问题 但似乎我找不到答案 我有这个时间戳 1295598602 在我的 php 脚本中我有 date date 年月日 1295598602 小时 日期 H 1295598602 00 这将返回 日期 2011 01 2
  • 确保 QTableView 中列的唯一值

    我已经实现了一个自定义QTableView and QAbstractTableModel The QTableView使用Qt 用于操作字符串数据的默认文本行编辑委托 我想确保在提交编辑后 按enter 该字符串对于其列来说是唯一的 如果
  • ngClassOdd/ngClassEven 未按预期工作

    使用 Angular 版本 1 2 15 我发现了一个错误 该错误似乎从版本 1 2 2 开始直到 1 2 15 重现 Plunker 演示 http plnkr co edit 3nExMtZ92AQS7BvLsQ8m p preview
  • 同时验证 C# Windows 窗体上的多个文本框

    我有一个带有几个文本框和其他控件的表单 我正在使用 errorprovider 控件 并将验证事件连接到需要验证的每个文本框上 当一个控件将焦点转移给另一个控件时 将发生 Validating 事件 因此 当您使用 Tab 键离开当前控件或
  • 对象作为参数传递给另一个类,通过值还是引用?

    在C 中 我知道默认情况下 传递给函数的任何参数都是通过复制的 也就是说 在函数内 有一个参数的本地副本 但是 当一个对象作为参数传递给另一个类时该怎么办 像下面这样的场景是通过引用传递还是通过值传递 class MyClass priva
  • 递归 - 与 Java 中不重复的数组相结合

    所以我知道如何获取组合的大小 数组大小 在我的例子中 除以所需数组子集大小的阶乘 我遇到的问题是获取组合 到目前为止 我已经阅读了 stackoverflow 上的大部分问题 但一无所获 我认为我发现的问题是我想将创建的组合子集中的元素添加
  • Azure DevOps REST API - 选项列表如何与字段关联?

    I am trying to use rest to create fields and picklists on the web site I created a field as type picklist String and add
  • MySQL 存储映像 BLOB 不良实践性能

    我知道不建议在 SQL 中将图像存储为 BLOB 然而 在我的本地 PC 和服务器上同时工作使得在两者之间同步图像变得困难 是否还有理由不单独使用 BLOB 作为备份 这会在本地创建缓存文件 以静态方式提供服务 本质上 只有选择 BLOB
  • 当 br 位于允许的内容中时,ckeditor 会删除

    当我将 br 添加到 ckeditor 允许的内容并添加 br 标签正在被更改为 br 但是当我添加 br 它正在被删除 为什么当 br 属于允许的内容时它会被删除 有什么建议么 您的帖子中缺少一些内容 不知道为什么 也不知道您想说什么 如
  • 堆内存和Slab分配

    我很困惑heap and free list 我有几个问题 我对C中malloc的工作原理有自己的理解 如果我错了 请纠正我 堆内存是否被组织为数据的链表 空闲列表 块 堆内存和空闲列表有区别吗 我对存储分配的理解 有待改进 当我们调用ma