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

9

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

我这样说是不是有点挑剔,这只是DOS的遗留问题吗?那Linux呢?

编辑:

许多答案都提供了很好的细节,但没有一个回答我的问题。


虚拟地址空间是一种将内存从某个角度映射到另一个角度的方式。您不需要分配虚拟地址空间,而是需要分配内存,并将内存映射到您的地址空间中。 - Erik
标准中提到了“存储”:没有堆、没有虚拟地址空间、没有表格等。 - pmg
因此,正确的说法是“线程消耗1MB内存”,而不正确的说法是“线程消耗1MB虚拟地址空间”。 - Lukasz Madon
请查看我的回答更新。最好的描述是它消耗了1MB的匿名虚拟内存。 - R.. GitHub STOP HELPING ICE
15个回答

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

0

Malloc函数在堆上分配内存,而堆是虚拟地址空间的一部分。

你称之为虚拟地址空间并不是太挑剔,而是过于笼统。这就好比说,“你在浴室里呕吐。”严格来说这是正确的,但“你在马桶里呕吐”更加准确,因为前者暗示你也可以在水槽或浴缸里呕吐。

从概念上讲,malloc虚拟内存都得到了大多数操作系统的支持,包括Dos和Linux。


0

malloc() 专门从堆中分配内存。

堆内存是否在虚拟地址空间中完全取决于操作系统和硬件架构。在具有MMU并使用它的操作系统上,所有内存(堆、代码空间、堆栈、静态内存和内存映射I/O等)都存在于虚拟空间中,即使物理到虚拟映射是一对一的。

要拥有虚拟地址空间,需要一个MMU将物理地址映射到虚拟地址,不是所有目标都有MMU,因此堆内存和虚拟内存在任何情况下都不是同义词或可互换的概念;它们是完全独立的概念。

关于“虚拟地址空间”是“DOS的遗产”,您的说法完全错误,16位x86架构根本不支持MMU或虚拟内存。我想知道您是怎么得出这个想法的?


0

malloc()函数分配由进程拥有的虚拟内存。

在执行过程中,操作系统可以多次将进程重新加载到物理内存中。操作系统将每个进程的虚拟地址映射到物理内存中。进程不知道这种映射。

虚拟地址空间包括

  • 系统空间(驱动程序)和
  • 用户空间(一个程序代码区域,用于动态内存分配的,以及用于变量、参数、返回值等的

-1

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

访问此链接 Memory Allocation


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接