【问题标题】:Does Each program has its own separate segments (code, stack, data) in memory?每个程序在内存中都有自己独立的段(代码、堆栈、数据)吗?
【发布时间】:2013-07-30 16:41:02
【问题描述】:

假设有许多程序同时运行。
每个运行的可执行程序是否在 RAM 中都有自己的代码、数据和堆栈段,还是整个 RAM 分为 4 个段,每个段分别为每个程序保存段。

【问题讨论】:

  • 它在硬件和操作系统中的处理方式因硬件和操作系统而异。但通常是的,每个进程都有自己的代码、堆、堆栈等。
  • Apollo guidance computer中,所有进程使用相同的内存。
  • 一般?来吧,我们不是在说 99.9% 吗?除了共享内存等特定的例外情况。一般来说,程序在各自的处理空间中运行时不能互相影响。
  • 我没有在我的 Apollo 导航计算机上做太多编程......

标签: operating-system executable memory-segmentation


【解决方案1】:

这个问题是特定于操作系统的,而不是特定于 C 的。

一般来说,操作系统为每个进程维护一个执行上下文,其中包含堆栈和运行时标志,但malloc 之类的内存分配方式因系统而异。

如需更多信息,您不妨深入了解malloc documentation.

【讨论】:

    【解决方案2】:

    这取决于两件事:

    • 您的部署架构
    • 运行您的进程的操作系统

    如果你是在 x86 上运行常见的主流 Linux、Windows、BSD 那么

    • 每个进程都有自己的私有虚拟 RAM
    • 所有段文本(代码)、堆、数据都在同一个逻辑地址空间(虚拟 RAM 段)

    从历史上看,x86 被设计为能够支持分段内存,但操作系统从未使用过它,并且最初在 AMD64 中放弃了对它的支持。尽管最近的处理器再次支持它用于虚拟化和管理程序。如今,用户态应用程序通常在没有分段的情况下部署。

    【讨论】:

    • 所以这意味着每个程序都有一定的内存量,比如 100 MB,并且该程序将这 100 MB 划分为堆栈、数据、代码段?
    • @user1660982 或多或少。今天,每个程序通常都有 256TB 的虚拟 RAM(在原始状态下无法使用)。程序代码自动放置在某处并调用请求内存(mmap 和系列)将您的新内存映射放置在尚未使用的虚拟空间中的任何位置。通常,操作系统决定新映射的放置位置,但您的程序可能会提示它想要它们的位置。
    • 您甚至可以争辩说,每个程序“仅”给定 128TB 的 VRAM,因为内核将占用另一半,但同样,这取决于操作系统
    【解决方案3】:

    简短回答:这取决于运行它的硬件和操作系统。

    通常,每个进程都有自己的虚拟内存空间,给人一种感觉就像是计算机上唯一运行的进程。该虚拟内存空间被操作系统划分为代码/数据/堆栈段(这些通常具有固定/公共地址)。

    就物理 RAM 的使用而言,这完全取决于操作系统 - 它可以随意使用不同的 RAM 部分,而程序甚至都不知道它。

    【讨论】:

      猜你喜欢
      • 2013-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-04
      • 1970-01-01
      • 2014-01-01
      • 2021-01-09
      • 2015-05-03
      相关资源
      最近更新 更多