指令層級平行與亂序執行

循序提交與精確例外(in-order commit and precise exceptions)

再想像那家用任意順序烹調、卻嚴格按接單順序上菜的廚房。一盤菜真正被放到客人面前的那一刻,就是那張訂單變「正式」的那一刻。在 CPU 裡,這一刻叫提交(commit,又稱退役 retirement):一道指令的效果被永久寫進可見的架構狀態——真正的暫存器與記憶體——的那一點。循序提交是指這個「正式化」按原本的程式順序發生,儘管烹調(執行)是以任意順序進行的。

既然執行是各憑本事,為何提交時還堅持順序?因為例外與中斷。精確例外是指:當一道指令出錯——除以零、分頁錯誤、非法指令——機器能停在一個乾淨狀態,其中出錯指令之前的每一道都已完全完成、之後的每一道都還沒有任何可見效果。那條乾淨的邊界,正是作業系統處理該錯誤(例如把缺少的分頁載入)並接著像什麼怪事都沒發生過一樣恢復執行所需要的。由重排序緩衝區驅動的循序提交,製造出這條乾淨邊界:在 ROB 頭端,你只要在放這道指令改變任何東西之前檢查「它出錯了嗎?」,若有,就丟棄它與所有更年輕的指令。

誠實的說法:亂序核心為了速度而推測地、亂序地執行,但提交把這一切混亂轉回程式設計師與作業系統所預期的、簡單的循序故事。精確例外不是奢侈品——沒有它,除錯、虛擬記憶體(可重啟的分頁錯誤)與可靠的中斷處理幾乎都不可能。代價是:一道指令在所有更老的指令提交之前無法真正完成,這就是為何 ROB 頭端一道長延遲指令會卡住退役、最終把整個視窗塞住。

ROB 頭端的一道載入觸發了分頁錯誤。作業系統必須正好從這裡恢復:每一道較早的指令都已提交,較晚的都沒有。作業系統載入該分頁後,執行就從那道載入重新開始,而暫存器與記憶體狀態完全精確。

按程式順序提交,使錯誤總是落在一條乾淨、可重啟的邊界上。

不精確例外(部分較晚指令已改變狀態)在早期機器上是真正的麻煩。精確例外才使虛擬記憶體與一般的除錯成為可行,這就是每顆通用 CPU 都提供它們的原因。

又称
retirementin-order retirementprecise interrupts退役精確中斷