白話linux操作系統(tǒng)原理

鏡像下載、域名解析、時間同步請點擊 阿里云開源鏡像站

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

本文整體采用的是類似遞歸調(diào)用的遞進式結(jié)構(gòu)。

linux內(nèi)核的本質(zhì)

file

簡單來說如上圖所示,咱們平時的應(yīng)用程序或者linux命令要和操作系統(tǒng)打交道,都要經(jīng)過一個叫做linux內(nèi)核的軟件。所有的硬件操作都需要通過他。就像古代女子出嫁,都要有媒人。

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

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

file

為什么說linux內(nèi)核是一種保護機制呢,這要從馮·諾依曼體系結(jié)構(gòu)說起。

馮·諾依曼體系結(jié)構(gòu)

file

馮·諾依曼體系結(jié)構(gòu)的要點是:

計算機的數(shù)制采用二進制。計算機應(yīng)該按照程序順序執(zhí)行。它采用存儲程序方式,指令和數(shù)據(jù)不加區(qū)別,混合存儲在同一個存儲器中。數(shù)據(jù)和程序在內(nèi)存中是沒有區(qū)別的,它們都是內(nèi)存中的數(shù)據(jù)。當EIP指針指向哪,CPU就加載哪段內(nèi)存中的數(shù)據(jù)。如果是不正確的指令格式,CPU就會發(fā)生錯誤中斷。

這里提到計算機是在順序的執(zhí)行指令,但是咱們明明可以一邊聽歌一邊敲代碼。這個除了在目前多CPU架構(gòu)下可以實現(xiàn),之前單CPU下也可以實現(xiàn)。因為有時鐘分片。如果沒有插入優(yōu)先級高的任務(wù),cpu會在均勻的執(zhí)行多項任務(wù)分片。因為CPU執(zhí)行速度快,人可能完全感覺不到實際上是斷續(xù)執(zhí)行的。

不過我記得上大學的時候,03年我買了一臺筆記本用來打魔獸。當時可是用的市面上的頂配呢。有時候還是會一卡一卡的??梢郧猩砀惺艿綍r鐘分片。

如果出現(xiàn)錯誤,可以通過中斷來處理。中斷也需要等待時鐘分片。好在linux內(nèi)核的分片十分合理,讓中斷可以及時響應(yīng)。

file

在現(xiàn)代CPU的保護模式中,每個內(nèi)存段都有其描述符。這個描述符記錄著這個內(nèi)存段的訪問權(quán)限。在《接下來一段時間會對大家進行網(wǎng)絡(luò)通信的魔鬼訓練-理解socket》里我就提到過文件描述符。這里稍詳細的解釋下。

文件描述符

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

文件描述符、文件、進程間的關(guān)系

1.描述:

  • 每個文件描述符會與一個打開的文件相對應(yīng)

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

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

2.系統(tǒng)為維護文件描述符,建立了三個表

  • 進程級的文件描述符表

  • 系統(tǒng)級的文件描述符表

  • 文件系統(tǒng)的i-node表

file

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

file
  • 在進程A中,文件描述符1和30都指向了同一個打開的文件句柄(#23),這可能是該進程多次對執(zhí)行打開操作

  • 進程A中的文件描述符2和進程B的文件描述符2都指向了同一個打開的文件句柄(#73),這種情況有幾種可能,1.進程A和進程B可能是父子進程關(guān)系;2.進程A和進程B打開了同一個文件,且文件描述符相同(低概率事件=_=);3.A、B中某個進程通過UNIX域套接字將一個打開的文件描述符傳遞給另一個進程。

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

文件描述符限制

有資源的地方就有戰(zhàn)爭,文件描述符也是一種資源,系統(tǒng)中的每個進程都需要有文件描述符才能進行改變世界的宏圖霸業(yè)。世界需要秩序,于是就有了“文件描述符限制”的規(guī)定。

如下表:

file

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

  • 找到需要檢查的進程id

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

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

file

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

file

這就是一個進程實際占用的文件描述符和文件描述符數(shù)。超過系統(tǒng)設(shè)定值就會發(fā)生too many open files異常。這里大家應(yīng)該可以切實理解一個文件描述符就是一個文件,文件描述符占用超限就是too many open files啦。

特殊的文件描述符

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

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

file

總結(jié)

linux的內(nèi)存分段、中斷機制和文件描述符限制都是內(nèi)核的保護機制。當然這并不全面,還有其他機制。

本文轉(zhuǎn)自:https://www.cnblogs.com/xiexj/archive/2022/01/20/15825930.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容