机制OR策略
? ? Unix/Linux的接口設計有一句通用的格言“提供機制而不是策略”。
? ? 區別對待機制(mechanism)和策略(policy)是Unix設計中的一大亮點。大部分的編程問題都可以被切割成兩個部分:“需要提供什么功能”(機制)和“怎樣實現這些功能”(策略)。如果由程序中的獨立部分分別負責機制和策略的實現,那么開發軟件就更容易,也更容易適應不同的需求。
?
? ? ?開源的存在展現在我們面前的是數以千計的代碼,在那一行行的代碼背后,到底蘊藏著怎樣的設計思想,高手們曾怎樣苦思冥想。在一堆堆的代碼面前,有時候,我們很容易迷失曾經進來的入口,而掉入符號,變量以及函數堆積成的沼澤地。
?
? ? ?操作系統的本質是什么?管理者?亦或服務者?但,歸根結底,它是一個執行者:執行用戶程序-所謂為用戶服務;執行中斷-所謂為外設服務;執行系統調用-所謂解放程序員(姑且說它為廣大的程序員服務,因為程序員不再與繁雜的硬件打交道了);執行內核線程-為操作系統自身服務。
? ?而這所有執行的核心,無非是在恰當的時機,讓哪個對象(程序,線程,中斷服務程序,中斷的下半部,系統調用)占有CPU。 換句話說,Unix/Linux抽象出對這些對象的執行機制: 程序的執行機制-進程 內核函數的執行機制-線程
中斷服務程序的執行機制-中斷信號觸發
中斷下半部的執行機制-softirq,tasklet,工作隊列
系統調用的執行-軟中斷(int $0x80觸發)
??
? ? 從機制和策略的角度看問題,也許,你對曾經困惑的問題有赫然開朗之感。 ? ?如果說機制是一種框架,那么,策略就是填充框架的一個個具體實體。機制提供的是一種開放而寬松的環境,而策略就是在這個環境下賴以生存的生命個體。比如,我們編寫的一個程序,fork()以后,就成為一個個進程的生命個體。而操作系統所提供給我們創建、執行以及結束進程的各種原語-fork(),exex()和exit()等是統管各種進程的機制。我們所創建進程的死活并不會影響機制本身。 ? ? ?如此看來,也許我們對原理之困惑有所醒悟。我們任何人在任何時候都可以調用fork()創建N多進程。這樣一個簡單的fork()殼,想追根溯源者,剝開這個殼,可以看到其五臟六腑。fork()如果出現任何一個小bug,直接影響到我們任何人和任何進程。 ? ? ? ?如此看來,也許我們對開發者所承擔的角色有所感悟。系統分析員和設計人員,任重而探究的路漫漫兮。說到此,設計模式等系列書,對有志于從編碼走向設計的開發者或許有所啟發。
? ?而這所有執行的核心,無非是在恰當的時機,讓哪個對象(程序,線程,中斷服務程序,中斷的下半部,系統調用)占有CPU。 換句話說,Unix/Linux抽象出對這些對象的執行機制: 程序的執行機制-進程 內核函數的執行機制-線程
中斷服務程序的執行機制-中斷信號觸發
中斷下半部的執行機制-softirq,tasklet,工作隊列
系統調用的執行-軟中斷(int $0x80觸發)
??
? ? 從機制和策略的角度看問題,也許,你對曾經困惑的問題有赫然開朗之感。 ? ?如果說機制是一種框架,那么,策略就是填充框架的一個個具體實體。機制提供的是一種開放而寬松的環境,而策略就是在這個環境下賴以生存的生命個體。比如,我們編寫的一個程序,fork()以后,就成為一個個進程的生命個體。而操作系統所提供給我們創建、執行以及結束進程的各種原語-fork(),exex()和exit()等是統管各種進程的機制。我們所創建進程的死活并不會影響機制本身。 ? ? ?如此看來,也許我們對原理之困惑有所醒悟。我們任何人在任何時候都可以調用fork()創建N多進程。這樣一個簡單的fork()殼,想追根溯源者,剝開這個殼,可以看到其五臟六腑。fork()如果出現任何一個小bug,直接影響到我們任何人和任何進程。 ? ? ? ?如此看來,也許我們對開發者所承擔的角色有所感悟。系統分析員和設計人員,任重而探究的路漫漫兮。說到此,設計模式等系列書,對有志于從編碼走向設計的開發者或許有所啟發。
總結
- 上一篇: ARM中LDR伪指令与LDR加载指令
- 下一篇: 耦合