【问题标题】:Heap / Stack and multiple processes堆/栈和多进程
【发布时间】:2010-12-29 10:48:25
【问题描述】:

假设我有两个进程 p1,p2 作为我的应用程序的一部分运行。

假设 p1 正在运行,最初执行函数 f1(),然后 f1() 调用 f2()。随着 f2() 进程的调用,p2 开始执行

我想确认的是:- 1)我们有不同的进程不同的堆栈吗?

2)我们是否为不同的进程设置了单独的堆?还是不同的进程共享同一个堆?

3)我们知道,对于 32 位操作系统,每个进程的虚拟内存大小为 4GB。那么对于每个拥有 4GB 作为虚拟内存的进程,这 4GB 是否被分区进入堆、栈、文本、数据

谢谢。

【问题讨论】:

    标签: memory memory-management process


    【解决方案1】:
    • 进程的虚拟内存将 不同于其他流程。
    • 每个进程将获得 4GB 的虚拟空间 地址空间(在 32 位窗口中 机器),您可以从中使用 2GB 用户空间(剩余用于 核心)。用于堆栈、堆、静态数据存储,甚至加载 DLL。 (如果您使用大地址空间,则为 3GB)
    • 每个进程都将获得单独的堆, 堆栈独立于其他进程。

    【讨论】:

      【解决方案2】:

      1) 是的,每个进程都有自己的堆栈。

      2) 是的,每个进程都有自己的堆。

      3) 我不认为你得到了整个 4GB。其中一些是为内核保留的。

      【讨论】:

      • 正如 Kaizen 指出的那样,32 位操作系统有 4 GB(因为 2^32 ?)这是否意味着每个进程都有 4GB(减去保留的东西)?操作系统是如何处理的?
      • (1) 是的,单独的堆栈——因为它需要切换上下文(进程),以便可以在一台机器上运行多个程序并且所有进程都可以使用可能的最大内存(在给出向操作系统添加一些东西)(2)是的,单独的堆 - 因为每个人都需要最大可能的内存(3)不是整个 4GB(在 32 位机器中)。这就是虚拟内存的概念出现的地方。因为每个人都需要操作系统支持,所以在 32 位地址空间中,有些必须用于操作系统代码和数据。
      【解决方案3】:

      在 Java 中还需要考虑其他限制,例如最多只能使用 Integer.MAX_VALUE 来寻址数组。在很多与内存相关的领域,这会将您限制在 2GB 左右。

      【讨论】:

        猜你喜欢
        • 2016-01-19
        • 2019-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-01
        • 2011-01-26
        • 2014-06-23
        相关资源
        最近更新 更多