什么是“堆栈捶打”?

时间:2010-02-13 18:25:04

标签: c embedded

什么是“堆叠捶打”?还是“堆叠捶打”? (因为我不知道定义,所以我不确定它是否是可数或不可数的术语。)

6 个答案:

答案 0 :(得分:4)

堆栈颠簸就像堆抖动一样,但在堆栈上。

现在已经解释了。

哦,你想要更多细节吗?

如果你在处理器上模拟一个基于堆栈的处理器而不是你正在颠覆堆栈。

如果您的C代码malloc是免费的,那么每一行代码都是免费的。

作为一个问题的堆栈抖动点是,如果你分析了你的代码,那么CPU几乎花费了大量的时间来推动和推动。

对于堆栈颠簸而言,它是malloc()& free()是你的#1& #2最常用的功能。

现在有些CPU(罗克韦尔制造了一些)实际上已经过优化,可以在硬件中运行基于堆栈的语言。

  • 内部ram缓存CPU内部堆栈的前N千字节
  • 很少注册
  • 所有说明都是相对的

奇怪的是,Java虚拟机是基于堆栈的模型。

在x86硬件上运行一个非常愚蠢的FORTH实现会破坏堆栈。 在阅读Forth规范后你可能会写的那种东西,所以你发出x86机器代码以获得第四条指令并且不进行优化。我很抱歉,我知道你的建议要好得多。

Postscript也是基于堆栈的,这使得早期的postscript打印机令人兴奋:它们有限的ram和缓慢的CPU:并且运行了堆栈式的语言。我确信在原来的Apple Laserwriter之类的东西上做了很多努力才能让它运行得更好。 它的摩托罗拉68000 CPU运行速度为(10兆)兆赫兹和1Mb RAM IIRC。

再次,堆栈thrashers。

这有帮助吗?

答案 1 :(得分:2)

我已经在Forth的上下文中看到过这个术语,其中缺少堆栈帧访问有时需要过度使用堆栈操作(“颠倒堆栈”)以获得堆栈顶部的某些单词。

此外,This glossary将其定义为“频繁的堆栈扩展(溢出)和收缩(下溢)”。显然需要进一步解释的定义。也许更熟悉Cray X1的人可以解释一下。

答案 2 :(得分:1)

我从未遇到过这个词,而领先的谷歌和维基百科的热门歌曲都没有形容它。

但是,它似乎类似于磁盘thrash ,这对磁盘的使用效率很低。这不是直接适用于堆栈 - 它与机械上的任何东西都不对应。也许它与页面错误有关,这会导致机械效率低下的关系。或者通过一些昂贵的执行/内核补救来纠正堆栈溢出。

该术语的某些背景会有所帮助。

答案 3 :(得分:1)

我在堆栈守卫的背景下听到了“堆栈颠簸”一词,但我认为它通常被称为“堆栈粉碎”。堆栈粉碎意味着任何类型的漏洞利用漏洞(如buffer overflows)。这就是为什么GCC堆栈保护称为SSP(Stack-Smashing Protector)。

答案 4 :(得分:1)

我确信这个词完全是口语,并没有确切含义。您是否有特定的引文或链接到您看到它的位置?

如果没有任何精确的技术定义,我认为这意味着该术语的用户认为它意味着什么。我可以假设应用于任何类型的滥用或低效使用堆栈,但由于堆栈操作中通常发生的所有事情是堆栈指针被移动,因此很难定义什么会导致“垃圾”不是只是正常和理想的行为。

在一个多线程应用程序中,每个线程都有自己的堆栈,上下文切换也意味着堆栈的快速切换,但是这个事件完全且不那么模糊地用术语“任务颠簸”来描述。

答案 5 :(得分:0)

我听说过一次“破坏堆栈”(没有第一个h),意思是“破坏堆栈”,例如当一个函数从堆栈中获取/放置更多字节时,弄乱堆栈指针并使其他函数无法在之后正常工作。

当您使用错误的调用约定调用外部函数时可能会发生这种情况(例如,当dll中的函数是stdcall但是您将其声明为cdecl时),或者当您调用varfadic函数(如printf或scanf)传递错误的格式时字符串,因此它会弹出比它更多/更少的字节。