RSS和堆有什么区别?

在Node.js的情况下,我经常遇到提及RSS内存的情况。 关于RSS的维基百科文章非常简洁,我仍然不确定它与堆内存的区别。 它是堆+堆栈吗? 有人能像我5岁那样向我解释吗?

一个进程被给予内存由操作系统运行。 在现代的32位和64位系统上,这个内存空间看起来像是可以处理的所有可能的内存地址的一个广阔的领域。 实际上,操作系统对进程是“撒谎”的,往往可以用这个进程可能解决的部分内存来回报这个承诺。 其余的是“虚拟的”。

由于CPU只能执行内存中的数据和代码,操作系统与CPU一起工作,以跟踪程序使用的内存在RAM中,以及在虚拟RAM中保存到磁盘上的特殊文件(即页面文件/交换文件)。 RAM中的内容称为“居民”或“工作”集。

作为一名开发人员,了解这一点非常重要,因为访问已经在RAM中的内存所需的时间比操作系统必须首先将内存从磁盘加载到RAM中要快好几个数量级。 devise保持关键数据驻留的程序比不小心内存如何分配和访问的程序具有更高的性能特征。

堆是OS展示给进程的开放内存的划分,组织成一个同名的数据结构 。 该进程在执行时使用该组织来访问(并追踪以后的版本),一次只能访问小块。 例如,如果进程想要存储一个整型数组,它需要一个内存块,其中的字节数与整数大小的元素一样多。

这个分区是在操作系统做交换的顶部。 我在运行时访问堆来为我的对象和数据结构存储内存字节的分配,但是这个堆分配仍然存在于操作系统给我的内存中,它以4096个可移动的字节“页”从磁盘来回。

栈是另一个特殊的数据结构,操作系统给出一个进程,但不同之处在于它一次获得所有的栈,并且当一个进程按顺序将项目放在栈上时,它会增加(或减less)一个特殊的指针一个特殊的CPU寄存器)来跟踪它在这个堆栈中的位置。 在更高层次上,每个线程都跟踪堆栈以及指针在堆栈中的位置。 局部variables,函数参数和返回指针被存储在这里,当进程执行时,指针在这个内存上增加和减less以跟踪这些事情。

一般来说,应用程序级别的程序员称为存储器实际上只是一个地址空间。 所以堆,堆栈,甚至程序段都只是一组地址。 我们的程序,包括节点中的程序,使用这些地址读写数据。 我们把malloc称为“内存pipe理器”,但它确实应该是“地址pipe理器”。 一个单独的“虚拟内存”系统确定这些地址集是否映射到RAM,磁盘或根本没有。 驻留集是那些由RAM支持的地址。 居民组的规模是多大的设置。