内存中有多少堆栈区域?

时间:2016-03-14 10:54:18

标签: memory operating-system stack cpu bootloader

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

据我所知,在引导程序中执行第一个C函数之前的某些时刻,在内存中的某个地方会创建一个为单个堆栈保留的区域。从那时起(只有一个正在运行的CPU核心),只有一个线程,我想只会创建一个堆栈区域。

然后,只要其他3个CPU打开,就会创建3个其他堆栈。我想每个内核线程都有它自己的堆栈区域以及每个用户进程和线程。

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

1 个答案:

答案 0 :(得分:2)

(我假设通过"堆栈区域"你不是指一个内存池,可以从中分配许多用于执行不同执行线程的堆栈。相反,我假设你的区域是为特定堆栈分配的内存。)

对于声音滑稽的答案,我并不是故意的,但简短的回答是有尽可能多的答案。

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

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

中断/例外怎么样?同样,这将根据系统而有所不同。中断可能共享被中断线程的堆栈,或者拥有自己的堆栈。

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

希望这有帮助。