【问题标题】:How many stack areas are there in memory?内存中有多少堆栈区域?
【发布时间】:2016-06-29 09:02:43
【问题描述】:

听起来可能是一个愚蠢的问题,但我只是想知道内存中有多少不同的堆栈区域,比如 4 个 CPU 内核(如果这真的完全取决于 CPU 的数量)?

据我所知,在引导加载程序中执行第一个 C 函数之前的某个时间点,在内存中的某个位置会创建一个为单个堆栈保留的区域。由于此时(只有一个正在运行的 CPU 内核)只有一个线程,我想只会创建一个堆栈区域。

然后,只要其他 3 个 CPU 开启,就会创建另外 3 个堆栈。我猜每个内核线程都会有它自己的堆栈区,每个用户进程和线程也是如此。

这个幼稚的假设正确吗?不确定 SO 是否是发布此问题的正确位置,但由于它是 STACKoverflow,我猜它是。 SU 甚至没有适当的堆栈标签。

【问题讨论】:

    标签: memory operating-system stack cpu bootloader


    【解决方案1】:

    (我假设您所说的“堆栈区域”不是指一个内存池,可以从中分配许多用于不同执行线程的堆栈。相反,我假设您分配给特定的内存区域堆栈。)

    我并不是说这个答案听起来很圆滑,但简短的回答是,有多少就多少。

    现在是更长的答案。通常,在多线程系统(可能有也可能没有多个 CPU)中,每个执行线程至少分配一个堆栈。我工作过的操作系统通常会为堆栈和线程控制块分配内存,以便它们相邻。这种 1:1 的堆栈与线程比率在编写多线程代码时为用户提供了更大的灵活性。

    如果系统有用户空间线程来向内核进行系统调用,事情会变得有点复杂。据我所见,只要用户线程正在处理系统调用,它通常会切换到一个新堆栈(位于内核空间中)。一些系统可能有少量这些系统调用堆栈可供选择(从而限制了可以进行并发系统调用的用户线程的数量),或者每个用户线程可能有一个系统调用堆栈。

    中断/异常呢?同样,这将因系统而异。中断可能共享被中断线程的堆栈,或者有自己的堆栈。

    如果您的系统支持多个 CPU,您可以期望每个 CPU 至少有一个线程。这将使堆栈数成为线程数的函数,而不是 CPU 数。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-07-04
      • 1970-01-01
      • 2012-05-25
      • 2016-10-04
      • 2018-05-02
      • 2016-03-25
      • 2015-05-01
      • 1970-01-01
      • 2021-08-18
      相关资源
      最近更新 更多