内存空间中映射区域和未映射区域之间有什么区别?

Hel*_*ian 7 c heap-memory

我在一篇关于malloc的文章中看到了以下段落.

堆是一个连续的(在虚拟地址方面)内存空间,有三个边界:起点,最大限制(通过sys/ressource.h的函数getrlimit(2)和setrlimit(2)管理)和一个调用的终点休息.中断标记映射的内存空间的末尾,即虚拟地址空间中与真实内存对应的部分.

在此输入图像描述

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

Tho*_*thy 11

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

这是简单的解释.实际上,它有点复杂.程序的内存地址不是计算机中内存芯片(物理内存)的实际内存地址.相反,它是虚拟内存.每个进程都有自己的内存空间,即自己的18446744073709551616地址,进程使用的内存地址由计算机硬件转换为物理内存地址.所以,一个进程可能已存储在内存地址4711,这实际上是存储在一个真实的物理内存芯片在这里的一些数据,而另一进程可能储存在内存地址4711的一些数据,但是这是一个完全不同的地方,存放在那边有一个真正的物理内存芯片.进程内部虚拟内存地址被转换或映射到实际的物理内存,但不是全部.其余的,再次,未映射.

当然,这也是一个简化的解释.您可以使用比计算机中物理内存量更多的虚拟内存.这是通过分页来完成的,即,暂时不使用一些内存块(称为页面),并将它们存储在磁盘上,直到再次需要它们为止.(这也称为"交换",即使该术语最初意味着将进程的所有内存写入磁盘,而不仅仅是部分内容.)

而且为了进一步复杂化,现代操作系统(如Linux和Windows)在分配内存时会过度使用.这意味着即使使用磁盘,它们也会分配比存储在计算机上的内存地址更多的内存地址.例如,我的计算机具有32千兆字节的物理内存,只有4千兆字节可用于将数据分页到磁盘,不可能允许超过36千兆字节的实际可用虚拟内存.但malloc乐意分配超过十万千兆字节.直到我真正尝试将内容存储在连接到物理内存或磁盘的所有内存中.但它是我的虚拟内存空间的一部分,所以我会称之为映射内存,即使它没有映射任何东西.