2010-02-13 131 views
5

什麼是「堆棧顛簸」?或者「堆棧捶打」? (因爲我不知道定義,我不確定它是否是一個可數或不可數的術語。)什麼是「堆棧顛簸」?

+0

這不是我聽過的短語 - 上下文是什麼?我聽說有人說他們已經「拋棄了堆棧」,這意味着他們訪問了一個糟糕的指針並且覆蓋了一些堆棧,導致程序以奇怪而令人興奮的方式崩潰(並且很難調試)。 – 2010-02-13 18:26:07

+0

我通常聽說過叫「粉碎堆」。 – 2010-02-13 18:28:14

+0

垃圾或鞭打.. 海事組織它可能是像堆棧粉碎。肯定 – sud03r 2010-02-13 18:29:11

回答

4

棧抖動就像堆棧抖動,但在棧上。

那裏,現在解釋。

哦,你想要更多的細節吧?

如果您在處理器上模擬基於堆棧的處理器,而不是您打亂堆棧。

如果你的C代碼malloc的和免費的其他所有代碼行,你就是在堆積如山。

堆棧顛簸是一個問題,如果您對代碼進行概要分析,那麼CPU幾乎花費了所有時間。

對於堆抖動,這是malloc()&免費()是你的#1 &#2最常用的功能。

現在有些CPU(rockwell make some)實際上被優化爲在硬件中運行基於堆棧的語言。

該緩存CPU內堆頂的N kilobtyes
  • 幾個寄存器
    • 內部RAM
    • 所有指令堆棧相對

    奇怪的是,Java虛擬機是一個基於堆棧的模型。

    在x86硬件上運行一個非常愚蠢的FORTH實現會顛覆堆棧。 您可能在閱讀Forth規範後編寫的那種東西,因此您會發出x86機器代碼以獲取第四條指令,並且不對其進行優化。第四,我對此表示歉意,我知道你的暗示會好得多。

    Postscript也是基於堆棧的,這使得早期的postscript打印機激動人心:它們的ram和CPU速度有限:並且運行了一個堆棧顛簸語言。我相信很多努力都投入到像Apple Laserwriter這樣的東西上,以使它運行得更好。它有一個摩托羅拉68000 CPU運行在(10ish)兆赫和1Mb ram IIRC。

    再次,堆垛機。

    這有幫助嗎?

  • +0

    如果我再次找到原始參考,我會嘗試一下這個定義,看看它是否合適。但它肯定是有道理的,接受我寫了「thrash」並且按照原樣處理了問題和關鍵詞,並且與該詞的英語定義一致。蒂姆,非常感謝。 – talkaboutquality 2010-02-16 20:33:26

    1

    我從來沒有遇到過這個術語,而領先的Google和維基百科命中沒有描述它。

    但是,它似乎與磁盤thrash類似,這是磁盤使用效率很低。這不是直接適用於堆棧 - 它不對應任何機械。也許這與頁面斷層有關,這會導致機械效率低下的關係。或者由一些昂貴的執行/內核補救糾正堆棧溢出。

    該術語的某些上下文將有所幫助。

    +0

    +1我很慷慨..:P – sud03r 2010-02-13 18:34:10

    2

    我已經看到這個術語在Forth的上下文中使用,其中缺乏堆棧幀訪問有時需要過度使用堆棧操作(「顛簸堆棧」)以將特定單詞放到堆棧頂部。

    此外,This glossary定義爲「頻繁堆棧擴展(溢出)和收縮(下溢)」。顯然需要進一步解釋的定義。也許更熟悉Cray X1的人可以解釋一下。

    1

    我在堆棧衛士的背景下聽說過「stack thrashing」這個術語,但我認爲它通常被稱爲「堆棧砸碎」。堆棧粉碎意味着任何類型的利用堆棧漏洞(如buffer overflows)。這就是爲什麼GCC堆棧保護被稱爲SSP(Stack-Smashing Protector)。

    +1

    「thrash」<>「smash」 – talkaboutquality 2010-02-16 20:30:17

    0

    我聽說「搗毀堆棧」(沒有第一個h),意思是「破壞堆棧」,例如,當一個函數從堆棧中獲取/放入更多的字節比它應該更多的時候,弄亂堆棧指針並且使其他函數無法正常工作。

    當你用錯誤的調用約定調用一個外部函數時(例如,當一個dll中的函數是stdcall,但你聲明它爲cdecl),或者當你調用像printf或scanf這樣的可變參數函數時,會發生錯誤格式化字符串,所以它會彈出更多/更少的字節。

    +0

    「thrash」<>「trash」 – talkaboutquality 2010-02-16 20:30:37

    +0

    我知道了,但是因爲我從未聽說過我認爲他可能誤解了它。 – 2010-02-16 21:47:27

    1

    我相信這個詞完全是口語化的,並沒有確切的意思。你有沒有特定的引用或鏈接到你曾經見過的地方?

    沒有任何確切的技術定義,我建議它意味着該術語的用戶認爲它意味着什麼。它可以應用於任何類型的濫用或堆棧的低效使用,但由於堆棧操作中通常發生的一切都是堆棧指針被移動,所以很難定義什麼會導致「垃圾」只是普通和理想的行爲。

    在一個多線程應用程序中,每個線程都有自己的堆棧,上下文切換也意味着堆棧的快速切換,但該事件完全由術語「任務抖動」來描述。