RSS和堆的区别是什么?

12
在Node.js的上下文中,我经常遇到RSS内存的提及。维基百科关于RSS的文章非常简洁,我仍然不太确定它与堆内存有何区别。它是堆+栈吗?能否向我解释得像我五岁一样简单易懂?
2个回答

12
操作系统为进程分配内存以运行。在现代32位和64位系统中,这个内存空间看起来像是一个可以寻址的所有可能内存地址的广阔开放领域。实际上,操作系统向进程“说谎”,并且通常只能用部分可被进程潜在寻址的内存来支持这一承诺。其余部分是“虚拟”的。
由于CPU只能在RAM中执行和从数据和代码中获取RAM,所以操作系统与CPU合作跟踪程序正在使用的内存是在RAM中还是保存在磁盘上的特殊文件中的虚拟RAM中(即页面文件/交换文件)。在RAM中的内容称为“常驻集”或“工作集”。
作为开发人员,了解这一点非常重要,因为访问已经存在于RAM中的内存所需的时间比OS必须首先将内存从磁盘加载到RAM中所需的时间快得多。设计使关键数据常驻的程序具有比粗心地分配和访问内存的程序更高的性能特征。
堆是操作系统提供给进程的一块开放内存的划分,组织成一个具有相同名称的数据结构。进程在执行过程中使用这种组织方式来访问(并跟踪以便稍后释放)每次只有小块内存。例如,如果进程想要存储一个整数数组,则需要一块内存,其字节数为元素个数乘以整数大小。
这种划分是在交换机制上进行的。我访问堆来存储运行时对象和数据结构的字节分配,但这种堆分配仍然存在于操作系统给我的内存中,它按照4096字节的“页面”来查看,可以从磁盘移动回来。

栈是操作系统提供给进程的另一种特殊数据结构,与其他数据结构不同的是,它会一次性获取所有的栈。当进程按顺序将项目放入栈中时,它会递增(或递减)一个特殊指针(通常是特殊的 CPU 寄存器)来跟踪其在栈中的位置。在更高层面上,每个线程都跟踪一个栈以及该指针在该栈中的位置。局部变量、函数参数和返回指针存储在这里,并且随着进程执行,指针会递增和递减来跟踪这些内容所占用的内存。


5
一般来说,应用级程序员所谓的内存实际上只是地址空间。因此,堆、栈甚至是程序段都只是一组地址。我们的程序(包括Node中的程序)使用这些地址读取和写入数据。像malloc这样的东西被称为“内存管理器”,但实际上它应该叫做“地址管理器”。另外,一个独立的“虚拟内存”系统决定这些地址集是否映射到RAM、磁盘或什么也没有。常驻集是那些由RAM支持的地址。常驻集大小就是指这个集合有多大。

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