天天看點

作業系統核心子系統的協調工作

第一部分、内務子系統 

操 作系統核心的管理功能以及執行最終也要歸于cpu的執行流,是以最簡單的設計就是将核心的内務也設計成程序,但是對于一些特别的内務這個辦法就不适用了,因為這些内務的特殊性恰恰在于它們是依賴cpu的,或者說是和cpu進行接口的。如果我們把計算機視為一台人類發明的智能的機器,那麼很自然的,類似上帝造人那樣,我們會把計算機設計成人的模樣,計算機應該有心跳和反射。

     到底什麼是核心的内務 呢?其實舉個例子就明白了。餐廳是顧客吃飯的地方,然而餐廳服務員也是人,也要吃飯,他們的吃飯問題就是内務問題,另外,餐廳需要及時打掃保持衛生,餐廳打掃衛生的阿姨的工作也屬于内務問題。重要的問題是内務事務應該怎樣執行。餐廳從業人員吃飯是直接付費還是免費還是從薪水中扣除...

     内務子系統包括作業系統所有的子系統(程序、檔案、記憶體...)加上中斷等内容

一、時鐘 

1、時鐘是最底層也是最基本的驅動器。 

時 鐘提供了基本的脈搏。

正 如動物的心跳一樣,時鐘提供了一切的節拍。

整 個機器依靠時鐘的驅動運作。cpu晶片被精确設計,在周期性的時鐘邊緣觸發事件中推進執行邏輯的值,比如EIP寄存器。然而cpu認為系統隻有一個程序,一個執行流,這是馮.諾依曼機器模型決定的。

操 作系統必須擷取這個事件,然後執行作業系統相關的操作,比如程序排程等等。

2、中斷處理 

如 果再次和動物心跳進行類比,那麼中斷就類似于反射(條件反射和非條件反射),當人被從背後拍打肩膀時,人會本能的扭頭,或者膝跳反射,這些都是明顯的例子。

操 作系統設定了中斷處理程式,當cpu檢測到中斷事件發生時,将執行流自動路由到時鐘中斷處理程式。設定中斷處理程式正如條件反射的學習過程一樣。

3、時鐘和中斷的關系 

對 于會思考的動物,心跳和反射無疑在其生理和心理行為中扮演了兩大重要的角色,可以想象,沒有心跳和瞬時反射的植物雖然也是生物,然而卻幾乎隻能進行細胞分裂而無法進行豐富的生理和心理活動。

對 于計算機而言,心跳和反射依然重要,然而不同于動物,計算機的心跳是反射的一部分,對于動物來講,心跳是心髒完成的,而反射是神經系統完成的。

時 鐘中斷也是一種中斷,心跳和反射統一于中斷。時鐘也是由一個中斷提供的。注意計算機和動物的差別,是否這一點導緻了計算機不可能實作智能化?

神 經系統和心髒的分工是好的,心髒僅僅提供節拍和能量,而神經系統隻提供行為。然而問題真的如此簡單嗎? 

4、時鐘中斷處理-Linux 

更 新目前程序的時間統計值

檢 查是否需要進行程序排程

如 果需要排程的話,進行程序排程。使更需要運作的程序運作。

再 次重申,具體實作不重要,代碼不重要,是以此部分内容很少,看代碼就好... 

二、軟中斷機制 

1、硬體中斷機制 

外 設有事件的時候,會發起硬體中斷,硬體中斷處理程式需要做的工作量很不統一。

硬 件中斷處理程式必須需要很快完成。中斷是一種異常執行流,它不應該過分的影響正常執行流。比如一家人其樂融融,突然被一個不速之客(比如送快遞的或者送牛奶的)打斷了快樂,此時,不速之客最好的辦法就是辦完事趕快離開,或者在不能快速幹完事的情況下,告知主人重要事宜後離開,主人待到快樂過後自行處理...

L inux在硬體中斷處理程式中觸發一種稱為softirq的軟中斷。

2、軟中斷 

耗 時比較久的中斷處理事務

三、核心線程和工作隊列      

L inux将核心的一些事務交給核心線程來做。

任 何驅動程式或者核心子系統在任何時候都可以送出一些任務讓核心來執行,這些任務全部交給工作隊列是合理的。

2.6 核心中引入了工作隊列,實際上工作隊列也是一種核心線程。在經過了多次瘦身之後,2.6.36之後将工作隊列進行了徹底的改進,使用者(核心子系統或者驅動等)僅僅送出任務,具體如何排程這些任務全部由核心來完成,剝奪了任務送出者的很多權力,比如驅動隻能送出任務,而不能建立過多的核心線程。

第二部分、内務子系統和Linux各子系統的協調 

四、Linux程序的執行 

1、被fork,建立一個task_struct 

2、exec一個新的磁盤映像,填充程序位址空間 

一 般的,Linux的可執行映像是ELF檔案,該檔案的内容被載入新程序的位址空間

3、執行系統調用,比如read。 

該 步驟使用了作業系統核心中的VFS子系統,如果保證程序永遠不使用檔案,那麼VFS完全可以從核心中移除。

4、被中斷 

L inux程序在執行過程中會經常被外設中斷,即使沒有任何外設,也會有時鐘中斷。被中斷之後,執行中斷政策,見前述。

5、執行期間需要大量記憶體 

調 用mmap在程序位址空間申請虛拟記憶體,使用時通過alloc_pages申請實體頁面。

如 果系統再也沒有足夠的可用實體頁面了,将調用相關核心線程來釋放一些實體頁面,将之配置設定給目前需要頁面的程序。

Linux的内務子系統采用“盡量滿足”的政策,因為Linux的内務子系統的首要任務是為了解決有限的系統資源和潛在的、未知的、無限的程序需求之間的沖突,是以核心決不能使用“怕堵車就不讓人買車”的政策,既然linux内務子系統是“服務性”的,它就要盡量滿足程序的需求,隻有在實在滿足不了的情況下,才會傳回一個錯誤,告知使用者沒有可以使用的記憶體了,這是合理的,起碼,内務子系統沒有什麼私心。

Linux的OOM-Killer存在很大的問題,問題就出在政策上,核心不能簡單的将占用記憶體最多的程序kill掉,比如說一個重要的服務占據可300M的記憶體,夠大了,然而一個惡意的程式僅占3M的記憶體,可是它fork出1000個子程序...接下來咋辦?Linux記憶體子系統應該想辦法探測到這個事情嗎?如果這麼做了,勢必引起設計惡化的惡化,因為政策和機制耦合了,按道理來講,機制應該不了解政策的...

6、執行完畢,調用exit系統調用退出 

Game over ,我呀,也該睡覺啦。今天是五一,工作時間,工作時間,時間,時間,時間...

<b> 本文轉自 dog250 51CTO部落格,原文連結:</b><b>http://blog.51cto.com/dog250/1271048</b>

繼續閱讀