I never make exceptions. An exception disproves the rule
-- Sherlock Holmes
福爾摩斯的世界沒有Exception才可以更好的去在既有的框架下解決問題亲族,但Exception卻是計(jì)算機(jī)構(gòu)成的一個(gè)有力武器炒考,因?yàn)楝F(xiàn)實(shí)世界總是有各種的不完美,而作為要去表達(dá)世界的計(jì)算機(jī)自然也要包容這個(gè)不停有意外(Exception)的世界霎迫。
最理想的系統(tǒng)是一切可控斋枢,從開啟到結(jié)束一步步去執(zhí)行我們計(jì)劃的命令,最終達(dá)到結(jié)果知给,這種基于我們之前實(shí)現(xiàn)過的跳轉(zhuǎn)-分支與調(diào)用-返回就可以實(shí)現(xiàn)瓤帚,但是不能覆蓋這個(gè)不完美的世界,比如你之前要的數(shù)據(jù)經(jīng)歷了重重阻隔終于到手邊可以用了,定了個(gè)鬧鐘要提醒你了缘滥,甚至于外力想阻斷系統(tǒng)的流程轰胁,這些都需要更為復(fù)雜的一個(gè)體系去包容谒主,稱為異吵螅控制流(exceptional control flow)
異常控制流貫穿于整個(gè)系統(tǒng)霎肯,存在于各個(gè)系統(tǒng)的層級擎颖。
最底層的機(jī)制稱為異常(Exception),主要涵蓋了系統(tǒng)事件观游,通常是由硬件和操作系統(tǒng)共同實(shí)現(xiàn)的搂捧。
進(jìn)程切換(Process Context Switch),主要涵蓋硬件過渡到操作系統(tǒng)懂缕,操作系統(tǒng)過渡到語言庫允跑,由硬件計(jì)時(shí)器和操作系統(tǒng)共同實(shí)現(xiàn)的。
信號(Signal)搪柑,主要涵蓋了操作系統(tǒng)到進(jìn)程聋丝。由操作系統(tǒng)實(shí)現(xiàn)。
非本地跳轉(zhuǎn)(Nonlocal Jumps)工碾,主要是涵蓋進(jìn)程內(nèi)部弱睦,一般由操作系統(tǒng)配合語言本身實(shí)現(xiàn)
異常
異常是計(jì)算機(jī)應(yīng)對“意外”的一種機(jī)制。主要用來響應(yīng)處理器發(fā)出的信號渊额。而這些意外又會有多種况木,包括interrupt,trap旬迹,fault和abort火惊,從這四種我們也可以了解到“異常”其實(shí)不一定是壞事奔垦,更是一種“包容”的手段
進(jìn)程
進(jìn)程是一個(gè)偉大的抽象概念屹耐。基本的操作系統(tǒng)編程概念立足于此宴倍。而異常就是提供這個(gè)概念基礎(chǔ)的一個(gè)構(gòu)造塊张症。
進(jìn)程的定義是一個(gè)執(zhí)行中程序的實(shí)例,就像是給一個(gè)單調(diào)的可執(zhí)行文件填充了血肉鸵贬,賦予他兩個(gè)層次的抽象俗他,獨(dú)占處理器和獨(dú)占內(nèi)存系統(tǒng)。而這和我們常識是不同的阔逼,我們的確可以一邊聽歌一邊打代碼順便還瀏覽著網(wǎng)站兆衅,我們可憐的處理器縱有多核應(yīng)該也不夠分,更何況摩爾定律往前幾輪處理器也就是單核,但概念卻幾乎沒有變化羡亩,主要就是靠進(jìn)程切換這個(gè)概念去實(shí)現(xiàn)的摩疑。不只是我們直覺上的普通進(jìn)程是在不停切換的,把代碼執(zhí)行的鏡頭拉近我們會發(fā)現(xiàn)應(yīng)用程序和操作系統(tǒng)之間的部分畏铆,也是有“切換”這個(gè)概念的雷袋。
信號
信號是一種在計(jì)算機(jī)體系中偏高層的概念,與操作系統(tǒng)實(shí)現(xiàn)有關(guān)辞居。信號大體像一種操作系統(tǒng)固定下來給進(jìn)程小弟們利用的約定楷怒,然后小弟們在這個(gè)約定下,接收信號瓦灶,發(fā)送信號鸠删,老實(shí)做人:)
非本地跳轉(zhuǎn)
而非本地跳轉(zhuǎn)又是更為上層的概念,以C為例贼陶,它的目的主要是將控制直接從一個(gè)函數(shù)轉(zhuǎn)移到另一個(gè)當(dāng)前正在執(zhí)行的函數(shù)刃泡,而不需要經(jīng)過正常的調(diào)用-返回順序