Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 多线程中堆栈和调用堆栈的区别?_C_Multithreading_Operating System_Embedded - Fatal编程技术网

C 多线程中堆栈和调用堆栈的区别?

C 多线程中堆栈和调用堆栈的区别?,c,multithreading,operating-system,embedded,C,Multithreading,Operating System,Embedded,在阅读关于所有线程共享哪些内容的答案时,我偶然发现了术语“调用堆栈”。虽然我知道线程有自己的堆栈,但它们不与其他线程共享,但我不理解调用堆栈对于线程意味着什么。 我看到了一些答案,但不是很清楚。 请澄清调用堆栈的含义,以及在多任务上下文中它与堆栈的区别。 关于阅读关于和的维基页面 从纯理论上讲,C实现甚至可能不使用任何堆栈。实际上,我听说的每一个编译后的C实现都使用一个调用堆栈,即处理器堆栈(有些处理器可能有两个机器堆栈),而实际上只有一个(好吧,IBM大型机没有任何硬件堆栈,这是一些寄存器的常

在阅读关于所有线程共享哪些内容的答案时,我偶然发现了术语“调用堆栈”。虽然我知道线程有自己的堆栈,但它们不与其他线程共享,但我不理解调用堆栈对于线程意味着什么。 我看到了一些答案,但不是很清楚。 请澄清调用堆栈的含义,以及在多任务上下文中它与堆栈的区别。 关于

阅读关于和的维基页面

从纯理论上讲,C实现甚至可能不使用任何堆栈。实际上,我听说的每一个编译后的C实现都使用一个调用堆栈,即处理器堆栈(有些处理器可能有两个机器堆栈),而实际上只有一个(好吧,IBM大型机没有任何硬件堆栈,这是一些寄存器的常规用法)。因此,对于大多数处理器(ARM、x86、x86-64等),调用堆栈就是堆栈,每个线程都有自己的调用堆栈

请澄清调用堆栈的含义以及它与堆栈的区别 在多任务环境中

区别是微妙的,但这是我理解它的方式。通常,人们在某种程度上可以互换使用它们,但调用堆栈只是一种数据结构。它描述了一组函数调用以及各种相关状态,如局部变量值、返回状态等

堆栈也是一个数据结构,但它最终是一个内存分配器。它使用非常简单、恒定的时间、对称的
push
pop
分配和释放内存的方式,将分配给线程用于调用堆栈之类的事情的内存集中起来

粗略地说,您可能认为它就像
std::vector
std::allocator
之间的关系
std::vector
严格来说是一种数据结构<代码>std::分配器为其分配内存(这通常涉及引擎盖后面的数据结构,但仅用于内存管理的数据结构)。但是
std::vector
不一定要使用
std::分配器

从概念上讲,调用堆栈实际上不必使用堆栈来分配内存。实际上,很难找到一个能做到这一点的编译器。例如,调用堆栈实际上可以使用堆而不是堆栈。实际上,每当它只想为函数调用推送一个参数时,它可能需要一个线性时间内存分配。这将是可怕的,但它与调用堆栈的概念并不矛盾


通常,调用堆栈使用线程本地堆栈来分配内存,因为它实用、高效,符合预期分配/解除分配的后进先出特性,并允许每个线程拥有自己的内存空间(缓解与共享内存访问相关的瓶颈)调用堆栈是一种堆栈数据结构,用于存储有关计算机程序的活动子例程的信息

线程堆栈是线程的私有堆栈,您知道它

如果线程正在执行函数,则当前函数
调用堆栈
将存储到
线程堆栈


这两件事本质上是一样的。它们都是堆栈数据结构。

Read它在线程上下文中也完全相同。“调用堆栈”仅指“堆栈”。堆栈是表示的缩写形式。实际上,IBM大型机有一个很棒的硬件堆栈,通常称为链接堆栈。程序员可以选择管理自己的堆栈(可以更快地执行),或者使用硬件提供的堆栈(更健壮、更安全)……这主要是开发人员的偏好。另一点是,编译器倾向于通过仔细控制调用堆栈的管理方式来优化函数调用开销。例如,编译器可能会安排对简单函数的调用,以便该函数可以自由使用某些硬件寄存器进行工作,从而避免在函数调用中保存和恢复这些寄存器。以一种智能的方式处理这些事情可能会使您的CPU时间提高20-30%,不管是什么体系结构,但这意味着每个函数的调用堆栈都可能不同,这取决于优化器所做的工作。