多线程中堆栈和调用堆栈的区别?
Difference between a stack and call stack in multithreading?
在阅读有关线程共享的所有内容的答案时,我偶然发现了术语 "call stack"。虽然我知道线程有自己的堆栈,它们不与其他线程共享,但我是不理解调用堆栈对于线程的意义。
我看到了一些答案,但他们不是很清楚。
请阐明调用堆栈的含义以及它与多任务处理上下文中的堆栈有何不同。
问候
阅读有关 call stack and multithreading 的维基页面。
在纯理论中,C 实现甚至可能不使用任何堆栈。实际上,我听说的每个 compiled C 实现都使用一个调用堆栈,它是处理器堆栈(某些处理器,可能 Itanium IA-64, sort-of have two machine stacks) when there is one (AFAIK, the IBM z Series mainframe don't have any hardware stack, it is a conventional use of some registers). So for most processors & ABIs(ARM、x86、x86-64、 ...)调用栈就是栈,每个线程都有自己的。
Please clarify what a call stack means and how it differs from stack
in the context of multitasking.
区别很微妙,但这是我理解它的方式。人们通常可以互换使用它们,但调用堆栈只是一个 数据结构 。它描述了一堆函数调用以及各种关联状态,如局部变量的值、return 状态等。
栈也是一种数据结构,但归根结底是内存分配器。它汇集了为线程分配的内存,用于调用堆栈之类的东西,具有非常简单、恒定时间、对称的 push
和 pop
分配和释放内存样式。
粗略地说,你可能会认为它是std::vector
和std::allocator
之间的关系。 std::vector
严格来说是一种数据结构。 std::allocator
为其分配内存(通常确实涉及引擎盖后面的数据结构,但数据结构仅用于内存管理)。但是std::vector
不一定要用std::allocator
.
从概念上讲,调用堆栈实际上不必使用堆栈来分配内存。实际上,很难找到能够做到这一点的编译器。例如,调用堆栈实际上可以使用堆而不是堆栈。每次它只想为函数调用推送一个参数时,它实际上可能需要线性时间内存分配。这将是可怕的,但它与调用堆栈的概念并不矛盾。
通常调用堆栈使用线程局部堆栈分配内存,因为它实用、高效,符合预期的 allocation/deallocation 后进先出性质,并允许每个线程拥有自己的内存 space(缓解与共享内存访问相关的瓶颈)。
调用堆栈是一种堆栈数据结构,用于存储有关计算机程序的活动子例程的信息。
其中thread stack是什么线程的私有栈你懂的。
如果线程正在执行函数,则当前函数 call stack
将存储到 thread stack
中。
这两个东西本质上是一样的。它们都是栈数据结构。
在阅读有关线程共享的所有内容的答案时,我偶然发现了术语 "call stack"。虽然我知道线程有自己的堆栈,它们不与其他线程共享,但我是不理解调用堆栈对于线程的意义。 我看到了一些答案,但他们不是很清楚。 请阐明调用堆栈的含义以及它与多任务处理上下文中的堆栈有何不同。 问候
阅读有关 call stack and multithreading 的维基页面。
在纯理论中,C 实现甚至可能不使用任何堆栈。实际上,我听说的每个 compiled C 实现都使用一个调用堆栈,它是处理器堆栈(某些处理器,可能 Itanium IA-64, sort-of have two machine stacks) when there is one (AFAIK, the IBM z Series mainframe don't have any hardware stack, it is a conventional use of some registers). So for most processors & ABIs(ARM、x86、x86-64、 ...)调用栈就是栈,每个线程都有自己的。
Please clarify what a call stack means and how it differs from stack in the context of multitasking.
区别很微妙,但这是我理解它的方式。人们通常可以互换使用它们,但调用堆栈只是一个 数据结构 。它描述了一堆函数调用以及各种关联状态,如局部变量的值、return 状态等。
栈也是一种数据结构,但归根结底是内存分配器。它汇集了为线程分配的内存,用于调用堆栈之类的东西,具有非常简单、恒定时间、对称的 push
和 pop
分配和释放内存样式。
粗略地说,你可能会认为它是std::vector
和std::allocator
之间的关系。 std::vector
严格来说是一种数据结构。 std::allocator
为其分配内存(通常确实涉及引擎盖后面的数据结构,但数据结构仅用于内存管理)。但是std::vector
不一定要用std::allocator
.
从概念上讲,调用堆栈实际上不必使用堆栈来分配内存。实际上,很难找到能够做到这一点的编译器。例如,调用堆栈实际上可以使用堆而不是堆栈。每次它只想为函数调用推送一个参数时,它实际上可能需要线性时间内存分配。这将是可怕的,但它与调用堆栈的概念并不矛盾。
通常调用堆栈使用线程局部堆栈分配内存,因为它实用、高效,符合预期的 allocation/deallocation 后进先出性质,并允许每个线程拥有自己的内存 space(缓解与共享内存访问相关的瓶颈)。
调用堆栈是一种堆栈数据结构,用于存储有关计算机程序的活动子例程的信息。
其中thread stack是什么线程的私有栈你懂的。
如果线程正在执行函数,则当前函数 call stack
将存储到 thread stack
中。
这两个东西本质上是一样的。它们都是栈数据结构。