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

malloc返回内存或虚拟地址空间,c,windows,linux,memory,C,Windows,Linux,Memory,malloc是在堆上分配内存块还是应该称为虚拟地址空间 我是在挑剔地称它为虚拟地址空间,还是这只是DOS的遗留问题?Linux怎么样 编辑: 许多答案都非常详细,但没有一个回答我的问题。malloc在堆上分配一个块。对于分配的块所跨越的每个内存页,在开始时可能有物理内存,也可能没有物理内存。尽管如此,整个块还是可用的,因为操作系统将负责处理页面错误和管理支持分配所需的物理/虚拟内存。内核和用户空间使用由内存管理硬件映射到物理地址的虚拟地址(也称为线性地址)。 此映射由操作系统设置的页表定义 请在

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

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

编辑:


许多答案都非常详细,但没有一个回答我的问题。

malloc
在堆上分配一个块。对于分配的块所跨越的每个内存页,在开始时可能有物理内存,也可能没有物理内存。尽管如此,整个块还是可用的,因为操作系统将负责处理页面错误和管理支持分配所需的物理/虚拟内存。

内核和用户空间使用由内存管理硬件映射到物理地址的虚拟地址(也称为线性地址)。 此映射由操作系统设置的页表定义


请在上浏览此链接。

答案取决于底层操作系统、libc实现和硬件体系结构。随着大多数现代操作系统(如Linux或Windows)在x86体系结构上运行,您将在线性地址空间中获得一个指针,但通常这取决于实现。例如,我怀疑当用C语言编程一些小型设备(如微控制器)时,malloc()会返回指向虚拟内存的指针,因为没有虚拟内存。

所有进程都在自己的虚拟地址空间内运行。对内存的每次访问都由内存管理单元进行调解。如果内存已映射,则从相应的物理地址加载或存储数据。如果没有内存映射到指定的地址,内存管理单元(MMU)将触发异常

Malloc管理一堆(甚至可能只是一小部分)映射内存页。这些页称为堆。当从Malloc请求大量字节时,Malloc将在其已管理的页中找到该内存,或者询问操作系统(在linux上使用brk或mmap)。这对malloc的用户是完全透明的


因此,这两个概念是完全正交的。进程访问虚拟内存,MMU可以将其转换为物理地址,堆是由malloc管理的内存块。

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

  • 虚拟地址空间—分配占用的进程地址空间量。这也会影响碎片和将来可以进行的最大连续分配
  • 提交费用-这是操作系统对维护分配给您的进程的所有可写、非文件/设备备份内存所需的最大可能物理存储的计费。如果操作系统允许其超过总物理内存+交换,则在第一次写入多余内存时,可能会发生非常糟糕的事情
  • 物理内存—您的进程当前占用的物理资源量(可能包括交换,具体取决于您的解释)。这可能低于由于文件的virgin zero pages和virgin private writable maps而产生的提交费用,也可能高于由于进程使用的不可写或共享映射而产生的提交费用(但这些通常是可交换/可丢弃的)
malloc
通常会影响它们

编辑:所以,我能想到的回答你问题的最佳方式是:


malloc
分配虚拟内存

而虚拟内存会消耗:

  • 虚拟地址空间
  • 指控,以及
  • 物理资源,如果已写入
malloc是在堆上分配内存块还是应该称为虚拟地址空间

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


说malloc在虚拟地址[sic]空间中分配内存不够精确,因为调用堆栈本身是该空间的一部分。

malloc在堆上分配内存,堆是虚拟地址空间的一部分

你称之为虚拟地址空间并不是吹毛求疵,你只是太笼统了。这可以比作“你在浴室里呕吐”。严格地说,这是真的,但“你在锅里呕吐”更准确,因为前一句话暗示你也可以在水槽或浴缸里呕吐

从概念上讲,大多数操作系统(包括Dos和Linux)都支持它。

  • malloc()
    在堆上分配内存块

  • 它应该被称为虚拟地址空间吗?请稍等。VAS(虚拟地址空间)是一种内存映射机制,它包含应用程序的整个内存空间。换句话说,VAS不限于堆的内存区域。堆实际上只是它的另一部分


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

如果您费心使用RTFM:-)您可以自己回答这个问题

特别是,在Linux机器上键入
manmalloc
并(一次一个)搜索“heap”和“virtual”将让您清楚地看到
malloc()
是根据堆内存而不是虚拟内存定义的

for
malloc()
与Linux手册页一致。它声明(重点是我的):

在C中,库函数
malloc
是 用于在上分配内存块 堆
[…]一些平台提供 允许运行时调用的库调用 动态分配