首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当我们使用new来分配内存时,操作系统会做什么样的记账呢?

当我们使用new来分配内存时,操作系统会做什么样的记账呢?
EN

Stack Overflow用户
提问于 2011-04-22 12:17:31
回答 2查看 485关注 0票数 1

除了记住对象指针的地址外,我认为操作系统还需要记录内存的大小。这样,当我们使用delete时,操作系统将知道要释放多少内存。

谁能告诉我更多关于这方面的细节?还记录了哪些其他信息?这些信息存储在哪里?删除内存后,操作系统会做什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-22 12:40:18

如前所述,new是一个库函数,而不是操作系统特性。

一般情况大致如下:

equivalent)

  • The allocator编译器将C++关键字翻译成对new的函数调用(或者equivalent)

  • The allocator保留一个空闲内存块的列表,它在那里搜索最佳的match.

  • Typically,。‘最佳’匹配大于你的程序所要求的数量。)
  • C++编译器会将new关键字转换为对malloc()的函数调用(或者your保留一个空闲内存块的列表,它会在那里搜索最佳匹配)。
  • 如果没有找到合适的空闲块,分配器会向操作系统请求一些内存块。有几种方法可以做到这一点,但它通常被认为是一种缓慢的操作,因此它要求更大的步骤(一次至少一页,通常为4KB)。当它获得新的空闲块时,拆分成请求的大小,其余的放在空闲表中。
  • 操作系统是控制处理器内存管理单元( MMU )的操作系统。该单元负责将当前运行的进程所看到的线性地址转换为RAM页的物理地址。这允许操作系统灵活地分配和释放内存页面给每个process.
  • Each进程,每个进程都有不同的内存映射,允许每个进程“看到”线性内存空间,同时保持每个进程与其他进程隔离。操作系统负责在每个进程交换机上将映射加载和卸载到MMU中。为进程分配新页面最终意味着将其添加到进程的内存映射中。
票数 3
EN

Stack Overflow用户

发布于 2011-04-22 12:55:16

谁能告诉我更多关于这方面的细节?

这些都是高度依赖于操作系统和编译器的细节,我只能提供相当广泛的答案(但您真的不必担心这一点,当然,除非您正在考虑从事这项工作)。

还记录了哪些其他信息?

通常,freestore内存通常被称为“堆”。这基本上是因为它是作为堆实现的,这是一种构建节点树(空闲内存块)的优先级队列实现。实际的实现和使用的算法非常复杂,因为它们需要执行得非常好(例如,当请求新内存时,需要非常快地找到空闲块,并且必须非常快地将新释放的内存合并到堆中),然后,还有所有的碎片问题等等。请查看Buddy memory allocation上的维基,以获得一个非常简化的版本。

因此,不仅仅是分配的指针列表和它们对应的内存块大小。事实上,可用内存块的列表要重要得多。

和这些信息存储在哪里?

堆是正在运行的程序的一部分(实际上,每个进程,甚至每个加载的模块,都将具有一个或多个这样的结构)。堆没有驻留在操作系统中(我甚至不确定它是否需要由操作系统提供,至少不是所有OSes都需要)。但是,每当程序的内存请求耗尽容量时,堆显然会要求操作系统为其提供大量内存块,以便合并到其空闲内存块树中。

删除内存后,操作系统会做什么?

通常,当您删除内存时,它只是被添加到空闲(或可用)内存块列表中,并可能与相邻的空闲内存块合并。不存在“用零填充内存”或对内存进行的任何其他实际操作,这是不必要的,也是对处理时间的浪费。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5752239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档