在 Node.js 的上下文中,我经常提到 RSS 内存。关于 RSS的Wikipedia 文章非常简洁,我仍然不确定它与堆内存有何不同。是堆+栈吗?有人可以像我 5 岁那样向我解释吗?
2 回答
一个进程被分配给操作系统运行的内存。在现代 32 位和 64 位系统上,这个内存空间看起来像是一个广阔的开放区域,包含所有可以寻址的内存地址。实际上,操作系统对进程“撒谎”,并且通常可以仅使用进程可能寻址的部分内存来支持此承诺。其余的是“虚拟的”。
由于 CPU 只能在 RAM 中的数据和代码上执行,操作系统与 CPU 一起工作以跟踪程序正在使用的内存在 RAM 中,以及保存到虚拟 RAM 中磁盘上的特殊文件中的内容(即页面文件/交换文件)。RAM 中的内容称为“驻留”或“工作”集。
作为开发人员,了解这一点很重要,因为访问已经在 RAM 中的内存所花费的时间比操作系统必须先将内存从磁盘加载到 RAM 快很多数量级。设计保持关键数据驻留的程序比不关心内存分配和访问方式的程序具有更高的性能特征。
堆是操作系统呈现给进程的开放内存的分区,组织成具有相同名称的数据结构。该过程在执行时使用此组织来一次仅访问(并跟踪以供以后发布)小块。例如,如果进程想要存储一个整数数组,它需要一块内存,其字节数与元素数乘以整数大小一样多。
这种分区超出了操作系统对交换所做的工作。我在运行时访问堆以存储我的对象和数据结构的内存字节分配,但是这个堆分配仍然存在于操作系统给我的内存中,它以可以移动的 4096 字节“页面”的形式查看从磁盘来回。
堆栈是操作系统给进程的另一种特殊数据结构,但它的不同之处在于它一次获取所有堆栈,并且当进程按顺序将项目放入堆栈时,它会递增(或递减)一个特殊指针(通常一个特殊的 CPU 寄存器)来跟踪它在这个堆栈中的位置。在更高级别上,每个线程都跟踪堆栈以及指针在堆栈中的位置。局部变量、函数参数和返回指针存储在这里,并且随着进程执行以跟踪这些内容,指针在此内存上递增和递减。
通常,应用程序级程序员所说的内存实际上只是一个地址空间。所以堆、栈,甚至程序段都只是地址集。我们的程序,包括节点中的程序,使用这些地址读取和写入数据。我们称 malloc 之类的东西为“内存管理器”,但它实际上应该是“地址管理器”。一个单独的“虚拟内存”系统确定这些地址集是否映射到 RAM、磁盘或什么都没有。驻留集是那些由 RAM 支持的地址。驻留集大小就是该集的大小。