HEAP是否是流程的本地化?换句话说,我们有一个堆栈,它始终是一个进程本地的,并且每个进程都是独立的。这同样适用于堆吗?此外,如果HEAP是本地的,我相信HEAP大小应该在运行时更改,因为我们从CPU请求越来越多的内存,那么谁对可以请求的内存量设置了上限?
答案 0 :(得分:2)
堆积确实是过程本地的。限制由操作系统提供。存储器也可以通过用于寻址的位数来限制(即32位只能一次寻址 2G 4G的内存)。
答案 1 :(得分:2)
是的,在现代操作系统上,每个进程都有一个单独的堆。顺便提一下,每个进程不仅有一个单独的堆栈,而且进程中的每个线程都有一个单独的堆栈。因此,一个进程可以拥有相当多的独立堆栈。
但并非所有操作系统而非所有硬件平台都提供此功能。您需要一个内存管理单元(在硬件中)才能工作。但桌面电脑有这个功能,因为......好吧......一会儿...... 386-CPU? (如果你知道的话,请发表评论)。您可能会发现自己处于某种没有该功能的微处理器上。
无论如何:堆大小的限制主要受操作系统和硬件的限制。硬件限制,特别是由于它允许的地址空间有限。例如,32位CPU不会超过4GB(2 ^ 32)。具有物理地址扩展(PAE)的CPU(当前CPU支持的CPU)可以达到64GB,但通过使用段和单个进程完成后,将无法使用此功能。它总是会看到最大4GB。
此外,操作系统可以根据需要限制内存。在Linux上,您可以使用ulimit
命令查看和设置限制。如果您运行的某些代码不是本机代码,而是例如在解释器/虚拟机(例如Java或PHP)中运行,那么该环境可以额外限制堆大小。
答案 2 :(得分:1)
'heap'是进程的本地,但是它在线程之间共享,而堆栈则不是,它是每个线程。
关于限制,例如在linux中,它由ulimit
设置(参见手册页)。
答案 3 :(得分:1)
在现代的,抢占式多任务操作系统上,每个进程都有自己的地址空间。它可以看到的内存页面集与其他进程可以看到的页面是分开的。因此,是的,每个进程都会看到自己的堆栈和堆,因为堆栈和堆只是内存区域。
在较旧的,协作式多任务操作系统上,每个进程共享相同的地址空间,因此堆在所有进程之间有效共享。
堆由其中的事物集合定义,因此堆大小仅在分配和释放内存时发生更改。无论操作系统如何管理内存,都是如此。
可以请求多少内存的上限由内存管理器决定。在没有虚拟内存的计算机中,上限是计算机中安装的内存量。对于虚拟内存,上限由物理内存加上磁盘上交换文件的大小来定义。