2011-07-23 125 views
1

对进程来说HEAP是本地的吗?换句话说,我们有一个堆栈,它始终是一个进程本地的,对于每个进程它是分离的。这同样适用于堆吗?另外,如果HEAP是本地的,我认为HEAP大小应该在运行时改变,因为我们要求CPU占用越来越多的内存,那么谁会对需要多少内存提出上限?内存管理和进程

回答

1

'heap'是本地的一个进程,但它是在线程之间共享,而堆栈不是,它是每线程。

关于限制,例如在linux中,它由ulimit(参见手册页)设置。

2

堆确实是本地的过程。操作系统放置限制。存储器也可能受到用于寻址的位数的限制(即,32位只能一次寻址内存的 2G)。

+0

4GB ...不只是2GB – yankee

+0

啊是的,2^32 = 4GB(除非当然是签名:P) –

1

在一个现代化的,先发制人的多任务操作系统,每个进程都有自己的地址空间。它可以看到的一组内存页面与其他进程可以看到的页面是分开的。因此,每个进程都会看到自己的堆栈和堆,因为堆栈和堆只是内存区域。

在一个较老的多任务操作系统上,每个进程共享相同的地址空间,因此堆在所有进程之间有效共享。

堆由其中的东西的集合定义,所以堆大小只随内存分配和释放而改变。无论操作系统如何管理内存,情况都是如此。

的多少内存,还可以要求内存管理器确定的上限。在没有虚拟内存的机器中,最高限制仅仅是计算机中安装了多少内存。使用虚拟内存时,上限由物理内存加上磁盘上交换文件的大小来定义。

2

是的,在现代操作系统存在用于每个进程的单独堆。顺便说一下,不仅每个进程都有一个单独的堆栈,还有一个单独的堆栈用于进程中的每个线程。因此一个过程可以有相当多的独立堆栈。

但并不是所有的操作系​​统,而不是所有的硬件平台上提供此功能。您需要一个内存管理单元(硬件)才能正常工作。但是台式电脑从那时起就具备了这个功能......嗯......一段时间后...... 386-CPU? (如果你知道的更好,请发表评论)。您可能会发现自己处在某种不具备该功能的微处理器上。

无论如何:堆大小的限制主要受操作系统和硬件的限制。硬件限制,特别是由于它允许的有限数量的地址空间。例如,32位CPU的地址不会超过4GB(2^32)。具有物理地址扩展(PAE)的CPU(目前的CPU支持)可以处理高达64GB的内存,但这是通过使用段来完成的,单个进程将无法使用此功能。它总是会看到4GB的最大值。

此外,操作系统可能会限制它认为合适的内存。在Linux上,您可以使用ulimit命令查看并设置限制。如果您不是以本机方式运行某些代码,而是在解释器/虚拟机(例如Java或PHP)中运行代码,那么该环境可能会额外限制堆大小。