白話linux作業系統原理

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

 

本文整體採用的是類似遞歸調用的遞進式結構。

 

linux內核的本質

 

 

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

 

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

 

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

 

 

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

 

馮·諾依曼體系結構

 

 

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

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

 

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

 

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

 

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

 

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

 

文件描述符

 

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

 

文件描述符、文件、進程間的關係

 

1.描述:

  • 每個文件描述符會與一個打開的文件相對應

  • 不同的文件描述符也可能指向同一個文件

  • 相同的文件可以被不同的進程打開,也可以在同一個進程被多次打開

     

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

  • 進程級的文件描述符表

  • 系統級的文件描述符表

  • 文件系統的i-node表

 

 

3.通過這三個表,認識文件描述符

 

 

  • 在進程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),換言之,指向同一個文件。發生這種情況是因為每個進程各自對同一個文件發起了打開請求。同一個進程兩次打開同一個文件,也會發生類似情況。

文件描述符限制

  

有資源的地方就有戰爭,文件描述符也是一種資源,系統中的每個進程都需要有文件描述符才能進行改變世界的宏圖霸業。世界需要秩序,於是就有了「文件描述符限制」的規定。

如下表:

 

查看文件描述符限制也可以使用linux命令。

  • 找到需要檢查的進程id

  • 查看該進程的資源,比如fd 是描述符,limits是限制。

  • 查看該進程的限制,如圖,在 Max open files 那一行,可以看到當前設置中soft最大文件描述符的數量為1024。

 

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

 

 

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

 

特殊的文件描述符

 

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

 

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

 

總結

 

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

 

本篇內容和《網路通訊之Session的歷史血脈》《深入理解MQ生產端的底層通訊過程-理解channel》《接下來一段時間會對大家進行網路通訊的魔鬼訓練-理解socket》《網路位元組序列-大端序和小端序》《https引起的跨域問題-COE&casestudy》《懂得三境界-使用dubbo時請求超過問題》《一個http請求進來都經過了什麼(2021版)》是一個系列。等全部串聯起來,之前很多讓人望而卻步的生產問題,會有了大致的排查方向吧~