白話linux作業系統原理

哈哈哈hh 發表於 2022-01-26
Linux

映象下載、域名解析、時間同步請點選  阿里雲開源映象站

雖然計算機相關專業,作業系統和計算機組成原理是必修課。但是大學時和真正從事相關專業工作之後,對於知識的認知自然會發生變化。還很有可能,一輩子呆在學校的老師們只是照本宣科,自己的理解也不深。所以今天我站在真正排查解決問題時的需要層面,用白話說一說linux作業系統的那些知識。

本文整體採用的是類似遞迴呼叫的遞進式結構。

linux核心的本質

file

簡單來說如上圖所示,我們們平時的應用程式或者linux命令要和作業系統打交道,都要經過一個叫做linux核心的軟體。所有的硬體操作都需要通過他。就像古代女子出嫁,都要有媒人。

雖然現在都是婚姻自由,沒有父母之命媒妁之言那一套。其實在古代,媒人對於整個古代歷史上的婚姻而言,起到的正向的作用。現在社會欺騙的婚姻也不少。而古代媒人都要是對兩家熟悉,或者做過背調,掌握了情況的人。多數都是門當戶對,除了個別婚前就心有所屬的,大多數還是過得很幸福的。畢竟多數人的標準都差不多:好看就行。我覺得自己老公長得就挺好看,只是出去打聽了一下,95%的人不這麼認為 file

本文不是為封裝制度正名。想表達的是:媒人最初是一種保護機制。而linux之父林納斯最初設計linux核心也是設計成一種保護機制。

file

為什麼說linux核心是一種保護機制呢,這要從馮·諾依曼體系結構說起。

馮·諾依曼體系結構

file

馮·諾依曼體系結構的要點是:

計算機的數制採用二進位制。計算機應該按照程式順序執行。它採用儲存程式方式,指令和資料不加區別,混合儲存在同一個儲存器中。資料和程式在記憶體中是沒有區別的,它們都是記憶體中的資料。當EIP指標指向哪,CPU就載入哪段記憶體中的資料。如果是不正確的指令格式,CPU就會發生錯誤中斷。

這裡提到計算機是在順序的執行指令,但是我們們明明可以一邊聽歌一邊敲程式碼。這個除了在目前多CPU架構下可以實現,之前單CPU下也可以實現。因為有時鐘分片。如果沒有插入優先順序高的任務,cpu會在均勻的執行多項任務分片。因為CPU執行速度快,人可能完全感覺不到實際上是斷續執行的。

不過我記得上大學的時候,03年我買了一臺筆記本用來打魔獸。當時可是用的市面上的頂配呢。有時候還是會一卡一卡的。可以切身感受到時鐘分片。

如果出現錯誤,可以通過中斷來處理。中斷也需要等待時鐘分片。好在linux核心的分片十分合理,讓中斷可以及時響應。

file

在現代CPU的保護模式中,每個記憶體段都有其描述符。這個描述符記錄著這個記憶體段的訪問許可權。在 《接下來一段時間會對大家進行網路通訊的魔鬼訓練-理解socket》裡我就提到過檔案描述符。這裡稍詳細的解釋下。

檔案描述符

linux系統中,一切皆檔案。檔案描述符是一個索引值,指向核心為每一個程式所維護的該程式開啟檔案的記錄表。當程式開啟一個現有檔案或者建立一個新檔案時,核心向程式返回一個檔案描述符。在程式設計中,一些涉及底層的程式編寫往往會圍繞著檔案描述符展開。

檔案描述符、檔案、程式間的關係

1.描述:

  • 每個檔案描述符會與一個開啟的檔案相對應

  • 不同的檔案描述符也可能指向同一個檔案

  • 相同的檔案可以被不同的程式開啟,也可以在同一個程式被多次開啟

2.系統為維護檔案描述符,建立了三個表

  • 程式級的檔案描述符表

  • 系統級的檔案描述符表

  • 檔案系統的i-node表

file

3.通過這三個表,認識檔案描述符

file

  • 在程式A中,檔案描述符1和30都指向了同一個開啟的檔案控制程式碼(#23),這可能是該程式多次對執行開啟操作

  • 程式A中的檔案描述符2和程式B的檔案描述符2都指向了同一個開啟的檔案控制程式碼(#73),這種情況有幾種可能,1.程式A和程式B可能是父子程式關係;2.程式A和程式B開啟了同一個檔案,且檔案描述符相同(低概率事件=_=);3.A、B中某個程式通過UNIX域套接字將一個開啟的檔案描述符傳遞給另一個程式。

  • 程式A的描述符0和程式B的描述符3分別指向不同的開啟檔案控制程式碼,但這些控制程式碼均指向i-node表的相同條目(#1936),換言之,指向同一個檔案。發生這種情況是因為每個程式各自對同一個檔案發起了開啟請求。同一個程式兩次開啟同一個檔案,也會發生類似情況。

檔案描述符限制

有資源的地方就有戰爭,檔案描述符也是一種資源,系統中的每個程式都需要有檔案描述符才能進行改變世界的巨集圖霸業。世界需要秩序,於是就有了“檔案描述符限制”的規定。

如下表:

file

檢視檔案描述符限制也可以使用linux命令。

  • 找到需要檢查的程式id

  • 檢視該程式的資源,比如fd 是描述符,limits是限制。

  • 檢視該程式的限制,如圖,在 Max open files 那一行,可以看到當前設定中soft最大檔案描述符的數量為1024。

file

在《提供一個排查效能問題的思路》裡,我就提到過解決過too many open files問題。我們們今天來實際理解一下。執行下面命令:

file

這就是一個程式實際佔用的檔案描述符和檔案描述符數。超過系統設定值就會發生too many open files異常。這裡大家應該可以切實理解一個檔案描述符就是一個檔案,檔案描述符佔用超限就是too many open files啦。

特殊的檔案描述符

有三個特殊的檔案描述符,分別是0、1、2,對應每個程式的標準輸入、標準輸出和錯誤輸出。每個程式啟動時,作業系統就會給它分配這三個標準的檔案描述符。我們們平時用的console控制檯就是通過讀寫這三個檔案來實現滴。

linux基礎裡有介紹怎麼重定向,下面一條命令可以將標準輸出1和錯誤輸出2重定向到一個檔案:

file

總結

linux的記憶體分段、中斷機制和檔案描述符限制都是核心的保護機制。當然這並不全面,還有其他機制。

本文轉自:https://www.cnblogs.com/xiexj/archive/2022/01/20/15825930.html


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70003733/viewspace-2854057/,如需轉載,請註明出處,否則將追究法律責任。