第一部分、內務子系統
操作系統核心的管理功能以及執行最終也要歸於cpu的執行流,因此最簡單的設計就是將核心的內務也設計成程序,但是對於一些特別的內務這個辦法就不適用了,因為這些內務的特殊性恰恰在於它們是依賴cpu的,或者說是和cpu進行介面的。如果我們把計算機視為一台人類發明的智慧型的機器,那麼很自然的,類似上帝造人那樣,我們會把計算機設計**的模樣,計算機應該有心跳和反射。
到底什麼是核心的內務 呢?其實舉個例子就明白了。餐廳是顧客吃飯的地方,然而餐廳服務員也是人,也要吃飯,他們的吃飯問題就是內務問題,另外,餐廳需要及時打掃保持衛生,餐廳打掃衛生的阿姨的工作也屬於內務問題。重要的問題是內務事務應該怎樣執行。餐廳工作人員吃飯是直接付費還是免費還是從薪水中扣除...
內務子系統包括作業系統所有的子系統(程序、檔案、記憶體...)加上中斷等內容
一、時鐘
1、時鐘是最底層也是最基本的驅動器。
時鐘提供了基本的脈搏。
正如動物的心跳一樣,時鐘提供了一切的節拍。
整個機器依靠時鐘的驅動執行。cpu晶元被精確設計,在週期性的時鐘邊緣觸發事件中推進執行邏輯的值,比如eip暫存器。然而cpu認為系統只有乙個程序,乙個執行流,這是馮.諾依曼機器模型決定的。
操作系統必須獲取這個事件,然後執行作業系統相關的操作,比如程序排程等等。
2、中斷處理
如果再次和動物心跳進行模擬,那麼中斷就類似於反射(條件反射和非條件反射),當人被從背後拍打肩膀時,人會本能的扭頭,或者膝跳反射,這些都是明顯的例子。
操作系統設定了中斷處理程式,當cpu檢測到中斷事件發生時,將執行流自動路由到時鐘中斷處理程式。設定中斷處理程式正如條件反射的學習過程一樣。
3、時鐘和中斷的關係
對於會思考的動物,心跳和反射無疑在其生理和心理行為中扮演了兩大重要的角色,可以想象,沒有心跳和瞬時反射的植物雖然也是生物,然而卻幾乎只能進行細胞**而無法進行豐富的生理和心理活動。
對於計算機而言,心跳和反射依然重要,然而不同於動物,計算機的心跳是反射的一部分,對於動物來講,心跳是心臟完成的,而反射是神經系統完成的。
時鐘中斷也是一種中斷,心跳和反射統一於中斷。時鐘也是由乙個中斷提供的。注意計算機和動物的區別,是否這一點導致了計算機不可能實現智慧型化?
神
經系統和心臟的分工是好的,心臟僅僅提供節拍和能量,而神經系統只提供行為。然而問題真的如此簡單嗎?
4、時鐘中斷處理-linux
更新當前程序的時間統計值
檢查是否需要進行程序排程
如果需要排程的話,進行程序排程。使更需要執行的程序執行。
再
次重申,具體實現不重要,**不重要,因此此部分內容很少,看**就好...
二、軟中斷機制
1、硬體中斷機制
外設有事件的時候,會發起硬體中斷,硬體中斷處理程式需要做的工作量很不統一。
硬件中斷處理程式必須需要很快完成。中斷是一種異常執行流,它不應該過分的影響正常執行流。比如一家人其樂融融,突然被乙個不速之客(比如送快遞的或者送牛奶的)打斷了快樂,此時,不速之客最好的辦法就是辦完事趕快離開,或者在不能快速幹完事的情況下,告知主人重要事宜後離開,主人待到快樂過後自行處理...
linux在硬體中斷處理程式中觸發一種稱為softirq的軟中斷。
2、軟中斷
耗時比較久的中斷處理事務
三、核心執行緒和工作佇列
linux將核心的一些事務交給核心執行緒來做。
任何驅動程式或者核心子系統在任何時候都可以提交一些任務讓核心來執行,這些任務全部交給工作佇列是合理的。
2.6核心中引入了工作佇列,實際上工作佇列也是一種核心執行緒。在經過了多次**之後,2.6.36之後將工作佇列進行了徹底的改進,使用者(核心子系統或者驅動等)僅僅提交任務,具體如何排程這些任務全部由核心來完成,剝奪了任務提交者的很多權力,比如驅動只能提交任務,而不能建立過多的核心執行緒。
第二部分、內務子系統和linux各子系統的協調
四、linux程序的執行
1、被fork,建立乙個task_struct
2、exec乙個新的磁碟映像,填充程序位址空間
一般的,linux的可執行映像是elf檔案,該檔案的內容被載入新程序的位址空間
3、執行系統呼叫,比如read。
該步驟使用了作業系統核心中的vfs子系統,如果保證程序永遠不使用檔案,那麼vfs完全可以從核心中移除。
4、被中斷
linux程序在執行過程中會經常被外設中斷,即使沒有任何外設,也會有時鐘中斷。被中斷之後,執行中斷策略,見前述。
5、執行期間需要大量記憶體
調用mmap在程序位址空間申請虛擬記憶體,使用時通過alloc_pages申請物理頁面。
如果系統再也沒有足夠的可用物理頁面了,將呼叫相關核心執行緒來釋放一些物理頁面,將之分配給當前需要頁面的程序。
linux的內務子系統採用「盡量滿足」的策略,因為linux的內務子系統的首要任務是為了解決有限的系統資源和潛在的、未知的、無限的程序需求之間的矛盾,因此核心決不能使用「怕堵車就不讓人買車」的策略,既然linux內務子系統是「服務性」的,它就要盡量滿足程序的需求,只有在實在滿足不了的情況下,才會返回乙個錯誤,告知使用者沒有可以使用的記憶體了,這是合理的,起碼,內務子系統沒有什麼私心。
linux的oom-killer存在很大的問題,問題就出在策略上,核心不能簡單的將占用記憶體最多的程序kill掉,比如說乙個重要的服務佔據可300m的記憶體,夠大了,然而乙個惡意的程式僅佔3m的記憶體,可是它fork出1000個子程序...接下來咋辦?linux記憶體子系統應該想辦法探測到這個事情嗎?如果這麼做了,勢必引起設計惡化的惡化,因為策略和機制耦合了,按道理來講,機制應該不理解策略的...
6、執行完畢,呼叫exit系統呼叫退出
作業系統核心子系統的協調工作
第一部分 內務子系統 操作系統核心的管理功能以及執行最終也要歸於cpu的執行流,因此最簡單的設計就是將核心的內務也設計成程序,但是對於一些特別的內務這個辦法就不適用了,因為這些內務的特殊性恰恰在於它們是依賴cpu的,或者說是和cpu進行介面的。如果我們把計算機視為一台人類發明的智慧型的機器,那麼很自...
作業系統核心子系統的協調工作
第一部分 內務子系統 操作系統核心的管理功能以及執行最終也要歸於cpu的執行流,因此最簡單的設計就是將核心的內務也設計成程序,但是對於一些特別的內務這個辦法就不適用了,因為這些內務的特殊性恰恰在於它們是依賴cpu的,或者說是和cpu進行介面的。如果我們把計算機視為一台人類發明的智慧型的機器,那麼很自...
作業系統核心子系統的協調工作
第一部分 內務子系統 操 作系統核心的管理功能以及執行最終也要歸於cpu的執行流,因此最簡單的設計就是將核心的內務也設計成程序,但是對於一些特別的內務這個辦法就不適用了,因為這些內務的特殊性恰恰在於它們是依賴cpu的,或者說是和cpu進行介面的。如果我們把計算機視為一台人類發明的智慧型的機器,那麼很...