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í)。
最底層的機(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)的。
信號(hào)(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)對(duì)“意外”的一種機(jī)制。主要用來響應(yīng)處理器發(fā)出的信號(hào)。
而這些意外又會(huì)有多種,包括interrupt,trap,fault和abort,從這四種我們也可以了解到“異?!逼鋵?shí)不一定是壞事,更是一種“包容”的手段
進(jìn)程
進(jìn)程是一個(gè)偉大的抽象概念?;镜牟僮飨到y(tǒng)編程概念立足于此。而異常就是提供這個(gè)概念基礎(chǔ)的一個(gè)構(gòu)造塊。
進(jìn)程的定義是一個(gè)執(zhí)行中程序的實(shí)例,就像是給一個(gè)單調(diào)的可執(zhí)行文件填充了血肉,賦予他兩個(gè)層次的抽象,獨(dú)占處理器和獨(dú)占內(nèi)存系統(tǒng)。而這和我們常識(shí)是不同的,我們的確可以一邊聽歌一邊打代碼順便還瀏覽著網(wǎng)站,我們可憐的處理器縱有多核應(yīng)該也不夠分,更何況摩爾定律往前幾輪處理器也就是單核,但概念卻幾乎沒有變化,主要就是靠進(jìn)程切換這個(gè)概念去實(shí)現(xiàn)的。不只是我們直覺上的普通進(jìn)程是在不停切換的,把代碼執(zhí)行的鏡頭拉近我們會(huì)發(fā)現(xiàn)應(yīng)用程序和操作系統(tǒng)之間的部分,也是有“切換”這個(gè)概念的。
信號(hào)
信號(hào)是一種在計(jì)算機(jī)體系中偏高層的概念,與操作系統(tǒng)實(shí)現(xiàn)有關(guān)。信號(hào)大體像一種操作系統(tǒng)固定下來給進(jìn)程小弟們利用的約定,然后小弟們在這個(gè)約定下,接收信號(hào),發(fā)送信號(hào),老實(shí)做人:)
非本地跳轉(zhuǎn)
而非本地跳轉(zhuǎn)又是更為上層的概念,以C為例,它的目的主要是將控制直接從一個(gè)函數(shù)轉(zhuǎn)移到另一個(gè)當(dāng)前正在執(zhí)行的函數(shù),而不需要經(jīng)過正常的調(diào)用-返回順序