雖然計算機相關專業,作業系統和計算機組成原理是必修課,但是大學時和真正從事相關專業作業之后,對于知識的認知自然會發生變化,還很有可能,一輩子呆在學校的老師們只是照本宣科,自己的理解也不深,所以今天我站在真正排查解決問題時的需要層面,用白話說一說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版)》是一個系列,等全部串聯起來,之前很多讓人望而卻步的生產問題,會有了大致的排查方向吧~
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/417028.html
標籤:其他
上一篇:基礎夯實:作業系統
