【问题标题】:Where is the stack implemented? [duplicate]堆栈在哪里实现? [复制]
【发布时间】:2015-06-02 00:33:30
【问题描述】:

C++ 允许程序员使用堆栈分配的内存或堆上的动态内存。我对堆栈的操作方式非常清楚(我在 C++ 中创建了堆栈作为练习),但仍然对“堆栈”的定义方式和位置感到好奇。

“堆栈”是语言的特性、操作系统的特性还是硬件的特性?我有一个模糊的想法,从操作系统的角度来看,每个堆栈都是与许多活动线程进程中的每一个相关的东西。这表明它是在软件级别实现的,而不是 CPU 或主板的硬连线功能。

我想,在 C++ 的情况下,编译器可能已将堆栈的实现插入到每个二进制文件中。或者操作系统将它自己的堆栈实现应用到每个正在运行的进程中?这是如何定义的?

我发现了一个类似的问题here,但我没有看到它得到回答,我希望更直接地重新陈述这个问题。

【问题讨论】:

标签: c++ memory-management operating-system stack language-implementation


【解决方案1】:

““堆栈”是语言的特性、操作系统的特性还是硬件的特性?”

这实际上是硬件的一个特性。大多数 CPU 提供堆栈指针寄存器的功能,用于call 指令。应该为其保留哪一部分内存实际上取决于操作系统(裸机)实现。

【讨论】:

    【解决方案2】:

    堆栈是操作系统管理的硬件功能。某些指令(例如,过程调用)会影响堆栈。将为上下文切换和处理器模式切换提供硬件支持。

    操作系统自己管理堆栈。操作系统分配堆栈。每个进程和每个处理器模式通常有一个单独的堆栈。

    堆栈通常向下增长。将值添加到卡住的硬件指令通常会减少堆栈点寄存器。虚拟内存系统通常将用户堆栈放置在用户地址空间的最高部分。

    【讨论】:

    • 那么这是否意味着硬件对堆栈的最大数量或每个堆栈的大小施加了限制?
    • 操作系统会期望某些堆栈存在。通常在用户模式下每个线程一个堆栈,在保护模式下每个进程(或可能线程)一个堆栈。理论上,操作系统可以为每个线程实现多个堆栈并在它们之间切换(这就是旧线程的工作方式)。一般不会发生这种情况。硬件限制是一次可以使用的堆栈数量;不是可以创建的堆栈数。
    • 更多空间:硬件将堆栈视为一块内存,堆栈指针寄存器指向它。操作系统可以改变寄存器指向要选择的内存。
    猜你喜欢
    • 2011-11-09
    • 2015-03-16
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    相关资源
    最近更新 更多