【问题标题】:Memory management and Process内存管理和进程
【发布时间】:2011-10-11 18:22:06
【问题描述】:

HEAP 是进程本地的吗?换句话说,我们有堆栈,它始终是进程本地的,并且对于每个进程来说都是独立的。这同样适用于堆吗?另外,如果 HEAP 是本地的,我相信 HEAP 的大小应该在运行时随着我们向 CPU 请求越来越多的内存而改变,那么谁对可以请求的内存设置了上限?

【问题讨论】:

    标签: memory-management process operating-system


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      是的,在现代操作系统上,每个进程都有一个单独的堆。顺便说一句,不仅每个进程都有一个单独的堆栈,而且进程中的每个线程都有一个单独的堆栈。因此,一个进程可以有相当多的独立堆栈。

      但并非所有操作系统和硬件平台都提供此功能。您需要一个内存管理单元(在硬件中)才能工作。但是台式计算机具有该功能,因为...嗯...不久前... 386-CPU? (如果您知道得更好,请发表评论)。不过,您可能会发现自己在使用某种不具备该功能的微处理器。

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

      此外,操作系统可以根据需要限制内存。在 Linux 上,您可以使用 ulimit 命令查看和设置限制。如果您不是在本机运行某些代码,而是在解释器/虚拟机(如 Java 或 PHP)中运行,那么该环境可以额外限制堆大小。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          在现代、抢占式多任务操作系统上,每个进程都有自己的地址空间。它可以看到的内存页面集与其他进程可以看到的页面是分开的。结果,是的,每个进程都看到自己的堆栈和堆,因为堆栈和堆只是内存区域。

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

          堆是由其中的事物集合定义的,因此堆大小只会随着内存的分配和释放而变化。无论操作系统如何管理内存都是如此。

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

          【讨论】:

            猜你喜欢
            • 2014-05-23
            • 2015-10-09
            • 1970-01-01
            • 2014-05-22
            • 1970-01-01
            • 2012-02-13
            • 1970-01-01
            • 2016-10-12
            • 2013-10-09
            相关资源
            最近更新 更多