malloc返回内存或虚拟地址空间

Luk*_*don 5 c linux memory windows

malloc是否在堆上分配了一块内存,还是应该称为虚拟地址空间?

我是挑剔的称它为虚拟地址空间还是这只是DOS的遗产?Linux怎么样?

编辑:

许多答案都有很多细节,但没有一个能回答我的问题.

Rum*_*kin 9

malloc是库调用。在linux上,它依次调用sbrk系统调用。sbrk将增加堆的大小,但实际上并不分配物理内存。当进程试图访问这个地址时,apage fault被引发,然后内核分配实际的物理页面并映射到虚拟地址。

TL;DR:malloc返回一个虚拟地址并且不分配物理内存。

看看这个


Han*_*Lub 8

malloc 在堆上分配内存,句点.

您的C库通常会保留可用内存块的列表(或更复杂的数据结构),找到一个合适的块来满足malloc(可能将更大的块拆分为多个较小的块)并将free内存返回到列表中(可能将一些较小的块合并为一个较大的块

只有当列表中没有足够大的块来满足您的需求时malloc,库才会向操作系统请求更多内存,例如使用sbrk系统调用.此系统调用返回的地址可能是虚拟地址,也可能是真实地址,具体取决于您的硬件,但作为程序员,您不能(也不需要)知道这一点.

malloc在堆上分配虚拟地址空间而不是块就像是read从硬盘而不是从文件中读取:从调用者的角度看它是无关紧要的,并不总是如此.


R..*_*R.. 6

至少有3种测量内存消耗的方法:

  • 虚拟地址空间 - 分配所消耗的进程地址空间量.这也会影响碎片化以及您可以进行的最大连续未来分配.
  • 提交费用 - 这是操作系统对维护分配给您的进程的所有可写,非文件/设备支持的内存所需的最大可能物理存储量的计算.如果操作系统允许它超过总物理内存+交换,那么第一次写入超额内容时可能会发生非常糟糕的事情.
  • 物理内存 - 您的进程当前占用的物理资源量(可能包括交换,具体取决于您的解释).由于处理零页面和原始私有可写文件映射,这可能少于提交费用,或者由于进程正在使用的不可写或共享映射而导致收费(但这些通常是可交换/可丢弃的).

malloc 通常会影响他们.

编辑:那么,我能想到回答你问题的最佳方式就是说:

malloc分配虚拟内存.

并且虚拟内存消耗:

  • 虚拟地址空间,
  • 承诺,和
  • 物理资源,如果它被写入.


haw*_*awk 5

malloc 是在堆上分配一块内存还是应该称为虚拟地址空间?

简短回答: malloc 在堆上分配内存。

它不是足够精确的说在虚拟ADRESS [原文]空间的malloc分配内存,因为调用栈本身是同一空间的一部分。


kar*_*lip 5

  • malloc()确实在 HEAP 上分配一块内存。

  • 它应该被称为虚拟地址空间吗?暂时保留这个想法。VAS虚拟地址空间)是一种内存映射机制,包含应用程序的整个内存空间。也就是说,VAS并不局限于HEAP的内存区域。HEAP实际上只是它的另一部分。

每次运行新的应用程序时,操作系统都会创建一个新进程并为该应用程序分配新的VAS。通过分配的内存malloc()保留在 HEAP 上,如您所知,HEAP 是 VAS 内的一个特殊内存区域,通过标准方式分配的内存最终位于堆栈中,这是位于应用程序的 VAS 内的另一个内存区域。


Luk*_*don 5

要回答这个问题,我们需要知道我们正在处理什么样的操作系统和架构。正如 pmg 提到的标准和文章指的是 \xe2\x80\x9cstorage\xe2\x80\x9d 或 \xe2\x80\x9cspace\xe2\x80\x9d。这些是最通用的术语,也是唯一有效的术语,除非我们做出一堆假设。

\n\n

例如:

\n\n
\n

malloc 在堆上分配一块虚拟\n 地址空间

\n
\n\n

这对于许多嵌入式系统来说是不正确的。其中许多不使用虚拟内存,因为不需要(没有多任务处理等)或出于性能原因。更重要的是,某些外来设备可能没有堆 \xe2\x80\x93 的概念,怀疑会使用 malloc,但公平地说,这就是标准引用 \xe2\x80\x9cstorage 的原因之一\xe2\x80\x9d - 它是特定于实现的。

\n\n

另一方面,该示例对于我们 PC 中的 Window 和 Linux 是正确的。我们来分析一下来回答这个问题。

\n\n

首先,我们需要定义什么是虚拟地址空间。

\n\n

虚拟地址空间 (VAS) 是一种内存映射机制,有助于管理多个进程。

\n\n
    \n
  • 隔离进程 \xe2\x80\x93 每个进程都有\n自己的地址空间
  • \n
  • 允许分配 32 位\n架构限制的内存。
  • \n
  • 提供一种简洁的记忆模型
  • \n
\n\n

回到问题,\xe2\x80\x9d malloc 是在堆上分配一块内存还是应该称为虚拟地址空间?\xe2\x80\x9d

\n\n

两种说法都是正确的。我宁愿说 VAP 而不是内存 \xe2\x80\x93 它更明确。有一个普遍的误解:malloc = RAM 内存。回到过去,DOS 内存分配非常简单。每当我们要求内存时,它总是 RAM,但在现代操作系统中它可能会有所不同。

\n