關於《深入理解計算機系統》中「異常控制流」的小故事

2021-09-25 07:29:08 字數 1862 閱讀 5413

在閱讀《深入理解計算機系統》的第八章「異常控制流」時,可能會出現這樣一種情況:看完這一整章以後都不知道這章到底在講什麼,這章到底有什麼用。這裡我想通過乙個生活中的小故事,將一些計算機中的概念轉化為生活中的例項,讓你對這章講述的東西有個大體的了解,避免在閱讀過程**現不知道它是什麼,不知道它到底有什麼用這樣的情況,從而能夠更好的學習本章的內容。

這裡我們將人 模擬成一台計算機,人所要做的事情模擬成乙個程式。乙個人一天中可以幹很多事情,比如吃飯、睡覺、做作業,而對於每件事情都有很多步驟。一件事情就相當於乙個程式,其中的步驟就相當於一條條指令。對於計算機來說,從給處理器加電到處理器斷電為止,處理器會執行乙個個程式。而對於人來說,人從早上起來到晚上睡覺這中間的時間也是在做一件件事情。只要你提前規定好了一天的索要做的事情,你就按照你所規定的事情,一件件執行就行了。而對於人做一件事情來說,可能其中的步驟並不是一直固定不變,按照統一個順序執行下去的,它會根據實際的情況進行調整。就像在做作業時,如果老師要求選做1、2、3題中的任一一題就行了,這時候你就需要根據自己的實際情況,選擇乙個自己想做的題,而不是從頭到尾把3道題都做了(這就相當於在乙個程式中指令沒有順序執行,而是根據一些變數的情況,使得程式發生了跳轉、返回、呼叫這些情況)。但是這些都是可以事先規劃好的,也就像乙個程式一樣,都是事先寫好,然後再根據執行時的變數選擇相應的執行步驟進行執行的。

但是這樣的情況並不能完美的描述生活,因為計畫總是趕不上變化的,總有一些意料之外的突發情況,是你在剛開始規劃的時候沒有想到的,會對你當前所做的事情產生影響。比如說在你做作業的時候,你媽媽給你打了個**,或者說是小夥伴突然找你出去玩,這個時候你不可能邊學習邊打**,或者說邊學習邊玩(對應於當你在執行乙個程式時,遇到一些其他的非編寫程式時所考慮的情況),這時候你必須要去處理掉這些事情。

而現代系統通過使控制流(即將預先寫好的程式,從頭到尾按順序執行就形成了控制流)發生突變(異常控制流,即通過跳轉到相應的為止來解決異常的情況)來對這些異常情況作出反應。在計算機系統中,異常控制流發生在三個層次:硬體層,作業系統層和軟體層。如下的幾個例子描繪了在不同層所發生的異常,及其相應的處理方式

比如說,在你寫作業的時候,寫著寫著你的筆突然沒水了(發生故障),這時候你必須拿一支新的筆來解決這樣的情況(異常處理程式),否則你就沒有辦法繼續做作業了。這裡對應的是在硬體層,系統出現了硬體故障,故障事件會使控制轉移到處理程式,處理異常情況。

又比如說,假設你做作業的習慣不是先把乙個作業從頭到尾全部完成了,再去做其他作業。而是換著寫作業,比如先寫寫語文(相當於計畫中的乙個任務,對應著計算機中的乙個程序),後寫寫數學(計畫中的另乙個任務),回過頭再來寫寫語文。這就像作業系統層中,核心通過上下文切換將乙個程序轉移到另乙個程序執行,這就是作業系統層中的異常控制流。

現在假設你還有有乙個習慣,就是每完成乙個作業/乙個作業的一部分(相當於傳送乙個程序傳送訊號)後,你就會在自己任務單上的相應位置打個勾勾(打勾也算乙個任務,這裡就相當於另外乙個程序對你的訊號做出相應的處理),來表示自己已經完成了這個任務/任務的一部分(這個就相當於在系統中,乙個程序向另外乙個程序傳送乙個訊號,然後另外乙個程序會根據訊號的內容進行相應的訊號處理)。  

當你在寫數學題時,乙個大題下面往往會有很多小題,這裡假設你有乙個習慣,就是你每做完一道題,你必須要自己批改才算完成這道題(即做一道題有相應的規則/步驟),然後你會回過頭來再看看大題的描述,再做其他小題,而不是直接做接下來的題。現在有這樣的乙個情況,當你在做第乙個小題的時候,做到一半的時候,你一看,發現第乙個小題的題目弄錯了,這時候你直接可以不用批改(不用完整的完成做題的規則和步驟),什麼也都不管,直接回看大題,然後去做其他的題目。這裡就相當於系統中的非本地跳轉,它可以迴避函式呼叫時的堆疊規則。即每個函式的呼叫需要一系列的規則/步驟,而非本地跳轉則無視這樣的規則,直接將當前棧的情況恢復到棧的某個歷史時刻的情況,執行那個歷史時刻下堆疊內容中對應的函式,實現控制的轉移(類似於github中將當前版本直接恢復到歷史版本,從那個歷史版本重新開始)。

深入理解計算機系統 異常

異常是異常控制流的一種形式,它一部分是由硬體實現的,一部分是由作業系統實現的。異常就是控制流中的突變,用來響應處理器狀態中的某些變化。在處理器中,狀態被編碼為不同的位和訊號。狀態變化稱為事件event,事件可能與當前指令的執行直接相關。比如發生虛擬儲存器的換頁,算數溢位,或者一條指令試圖除以零。另一...

深入理解計算機系統 異常

2012 07 19 22 41 53 分類 linux 標籤 linux 計算機系統異常 字型大小大中小 訂閱異常是異常控制流的一種形式,它一部分是由硬體實現的,一部分是由作業系統實現的。異常就是控制流中的突變,用來響應處理器狀態中的某些變化。在處理器中,狀態被編碼為不同的位和訊號。狀態變化稱為事...

《深入理解計算機系統》 異常處理

異常表 在作業系統啟動時,系統建立和初始化了乙個被稱為異常表的跳轉表,條目k對應異常k的異常處理程式入口位址。異常的分類 中斷 interrupt 來自處理器外部i o裝置的訊號,並不是由專門的指令造成的,是非同步的,其處理程式成為中斷處理程式。陷阱 trap 故意的異常,是執行指令的結果,其作重要...