内存中的映射区域和未映射区域有什么区别space?

What is the difference between mapped region and unmapped region in memory space?

我在 an article about malloc 中看到了以下段落。

The heap is a continuous (in term of virtual addresses) space of memory with three bounds:a starting point, a maximum limit (managed through sys/ressource.h’s functions getrlimit(2) and setrlimit(2)) and an end point called the break. The break marks the end of the mapped memory space, that is, the part of the virtual address space that has correspondence into real memory.

我想更好地理解映射区域和未映射区域的概念。

如果内存地址是 64 位长,就像在许多现代计算机中一样,您有 18446744073709551616 个可能的内存地址。 (这取决于处理器架构实际可以使用多少位,但地址是使用 64 位存储的。)这超过 170 亿千兆字节,这可能比您的计算机实际拥有的内存还要多。因此,这 170 亿千兆字节中只有一部分对应于实际内存。对于其余地址,内存根本不存在。内存地址和内存位置之间没有对应关系。因此,这些地址未映射

这就是简单的解释。实际上,它有点复杂。您程序的内存地址不是您计算机中内存芯片的实际内存地址,即物理内存。相反,它是 虚拟内存 。每个进程都有自己的内存space,也就是自己的18446744073709551616地址,进程使用的内存地址被计算机硬件翻译成物理内存地址。所以一个进程可能在内存地址4711存储了一些数据,实际上存储在这边的一个真实的物理内存芯片中,而另一个进程可能在内存地址4711存储了一些数据,但那是一个完全不同的地方,存储在 上面的一个真正的物理内存芯片中。进程内部虚拟内存地址被翻译或映射到实际物理内存,但不是全部。其余的也是 未映射

当然也就是一个简化的解释。您可以使用比计算机中的物理内存量更多的虚拟内存。这是通过 paging 完成的,也就是说,取出一些现在未使用的内存块(称为 pages),并将它们存储在磁盘上直到他们又被需要了。 (这也称为 "swapping",即使该术语最初意味着将 所有 进程的内存写入磁盘,而不仅仅是其中的一部分。)

更复杂的是,一些现代操作系统,例如 Linux 和 MacOS X(但有人告诉我,不是 Windows)过度使用 当他们分配内存时。这意味着它们分配的内存地址超过了计算机可以存储的地址,即使使用磁盘也是如此。例如,我这里的计算机有 32 GB 的物理内存,只有 4 GB 可用于将数据分页到磁盘,不可能允许超过 36 GB 的实际可用虚拟内存。但是 malloc 愉快地分配了超过一百 千兆字节。直到我真正尝试将东西存储在所有连接到物理内存或磁盘的内存中。但它是我的虚拟内存 space 的一部分,所以我也将其称为 映射 内存,即使它没有映射 随便。

堆中的映射区域是指可以与物理内存一起映射的虚拟内存区域。未映射区域表示未使用的虚拟内存space,不指向任何物理内存。

堆的映射区域和未映射区域之间的边界是系统断点。由于 malloc() 用于申请一些内存,系统断点将被移动以扩大映射区域。 Linux系统提供了brk()sbrk()方法来增加和减少系统断点的虚拟内存地址。