linux系统原理是什么意思,Linux系统原理之整体概述
首先,要知道計算機有硬件和軟件組成。硬件最核心的就是五大部件,分別是計算器、控制器、存儲器、輸入設備、輸出設備;這也就是馮若依曼體系結構,如下圖所示:
再向上就是我們的OS操作系統,但是要明白操作系統本身是不做任何有意義性的工作,這些工作都是由操作系統之上特定的應用程序來完成。
然后把它們組合到一塊來看,首先就是硬件系統。在CPU中除了計算器和控制器之外,還需要了解寄存器和緩存等。寄存器在計算機內部是非常重要的。而緩存則是用來協調各部件之間速度不協調的問題而設定的,同時也是提供計算機性能的一個重要組件。可以說緩存在計算機中無處不在。計算機除了CPU,還需要存儲器(內存)用來存儲數據的,而現代內存存儲器其實是編址結構的(平面編址,比如編址方式從0000000-11111111),不然CPU是無法訪問的。而CPU可以尋址多少內存,這取決于CPU的位長,32位的CPU可以尋址2的32次方個存儲單元(內存每一個單元是1字節)而64位的CPU可以尋址2的64次方個存儲單元。但是由于內存屬于易失性存儲器,一斷電數據就都沒有了。所以就需要一些外部存儲設備如光盤,硬盤等也稱為I/O設備。在計算機上外部I/O設備有很多不可能都直接連接到CPU總線上去,而是通過我們當前主板上通過一些芯片把這些I/O總線匯總起來之后再連入當前CPU的總線上去,而這些芯片有高速芯片就是北橋和低速芯片南橋。北橋離CPU比較近用來連接內存(顯卡也有接入北橋的,因為數量大),而南橋就是用來匯聚各I/O設備的然后連入北橋。但現在也有一些如PCI-E就是直接連接到北橋上面的。然后可以通過PCI-E來連接I/O設備。
接著我們回想一下我們的計算機上面有這么多I/O設備,在某一個時間點有某一個I/O設備發生I/O事件時怎么讓CPU在第一時間得知呢?這就需要一種機制如CPU不斷地去輪詢檢查I/O設備,當然這種方式非常低效。第二種是中斷機制,當其中某種I/O設備發生I/O事件時如網卡接收到ping包或鍵盤鼠標動了一下就會通過中斷控制器來通知CPU,CPU在某個針腳上發現中斷控制器有事件產生于是去通過跟中斷控制器交互從而得知到底是哪個硬件發生了中斷。而CPU又如何得知是哪個I/O設備發生中斷了呢?由于I/O總線是匯總的所有I/O都是通過一個總線傳輸數據所以也無法判別到底是哪個。所以又有了I/O端口。計算機一開機所有硬件都會向CPU申請I/O端口使用。這些都是計算機工作的基本概念。而這些基本概念的理解是有助于更好地理解計算機是怎樣工作的。
硬件本身提供了計算和運算能力,但事實上它本身并不做任何具體工作的。如果要做工作我們需要應用程序。所以我們在利用計算機的這種能力這個芯片和所謂的計算機語言實現編程就可以開發出應用程序了。這個應用程序要想真正工作就需要能夠驅動和使用計算機芯片,由于各種硬件的不同所以只能針對某一套計算機硬件進行編程,如果有一天硬件發生變化那么就需要重新編寫新的應用程序。又由于底層的硬件是非常復雜的那么想編寫一個程序可以跑在上面也是非常困難的。所以就出現了操作系統這個一個程序主要用于把底層的各個細節都隱藏起來而提供一個統一的規范的風格重新提供給程序員編程。所以無論你的CPU事Intel的還是AMD的,內存是金士頓的其它廠家的,這些都由操作系統來處理然后通過軟件提供一個統一規范簡介的接口輸出。然后程序員在編程的時候就不用關心底層硬件了,只需要關心這個操作系統本身是什么樣子的。這就是操作系統的重要意義所在,當然操作系統的功能非常強大而這些只是它的一部分功能而已。
操作系統通過統一的接口將計算機的計算能力輸出出來,這些輸出我們通常稱之為系統調用(System Call)。比如在編程時需要用到聲卡那么只需要調用系統輸出的接口即可而不需要關系聲卡是哪個廠家的和驅動這個聲卡的驅動程序。這些細節和底層部分都是由操作系統來實現了。所以我們說操作系統就是虛擬機把硬件的計算機能力通過另外一個方式虛擬出來了提供給應用程序使用。而操作系統提供的這種系統調用對于軟件級別來說也屬于非常底層,想要實現一個功能就需要很多個系統調用組合而成,并且每一個軟件都需要這么做,甚至有一些通用功能是每一個軟件都需要使用的。于是在系統調用之上又出現了系統庫(二次開發的系統調用),又稱為之API。這些庫就是用于把底層的系統調用組合成一個具體的功能實現然后直接提供給程序員使用,然后有很多庫也并也沒有使用一個系統調用而就是為了實現一個功能而開發的。所以現在在編寫程序時大部分功能都是可以直接使用系統或其它軟件提供的庫。如果某一個功能沒有庫可用,那么就需要直接調用系統調用來實現了。所以系統庫就是操作系統提供給編程人員的友好環境,封裝了各種各樣的功能。
如果說現在有兩個不同的操作系統,如果一個程序員利用了A操作系統提供的庫開發了一個程序,想要在B操作系統上運行取決于什么?是不是就是雙方的庫是相同的或是程序員所調用的接口是相同的。如果一個軟件在一個系統上開發的,能夠做到在其他操作系統上也能運行,至少編譯之后可以運行。那么最重要的一點是不是要取決于這個庫或庫提供的接口啊!其實庫也是有一種規范的就是POSIX規范。POSIX 表示可移植操作系統接口(Portable Operating System Interface ,縮寫為 POSIX ),POSIX標準定義了操作系統應該為應用程序提供的接口標準,POSIX標準意在期望獲得源代碼級別的軟件可移植性。換句話說,為一個POSIX兼容的操作系統編寫的程序,應該可以在任何其它的POSIX操作系統(即使是來自另一個廠商)上編譯執行。
現在的絕大部分系統都遵循POSIX規范,如windows,Linux,Unix等它們都是C語言研發的。事實上現在在Windows上基于ANSI C研發的程序在Linux上編譯是沒有問題的。注意這里說的是編譯不是運行,因為API只是編程規范。事實上真正程序在執行的時候還要需要ABI(application binary interface,應用二進制接口)。而ABI則是跟你的內核執行二進制的機制有關,或跟你二進制程序本身的格式密切相關。所以你在Windows上所編譯的程序是.exe格式的,而在Linux上編譯的程序是ELF格式的。所以你在Windows上編譯好的程序你在Linux上時運行不了的。反之亦然,因為它們的二進制格式不一樣。
前面也說了,想要計算機為我們做具體的工作時就需要特定的應用程序。在我們操作系統上有很多應用程序,其中有一些比較特殊是隨著操作系統一起啟動的。那么這些應用程序就是為了系統能夠提供正常功能就需要運行的。這種進程再Linux上通常被稱為守護進程。在我們的Linux操作系統上某一時刻想要去啟動一個程序該怎么去指揮操作系統去啟動這個程序呢?那么就需要一個能夠跟操作系統交互的接口,在Linux上提供的這個接口的就是我們的特定程序Shell。Shell本身也是一種程序,它也需要在內核的支持下才能跑起來。那么Shell又是怎么啟動的呢?很顯然,操作系統在初始化的時候必須以服務的形式把接口功能啟動,不然就無法進入計算機了。所以開機以后有些程序必須要能自動啟動,而有些則不需要,必要的時候我們在指揮程序啟動即可。其實在Linux中當系統初始化完成之后就會生成一個init進程器PID號為1,這個進程什么也不干主要負責用來啟動其它的子進程,init是所有進程的父進程。
在一個系統內,運行多個進程也就意味著運行多個程序,也就是多任務的概念。一個系統的運行就是內核加內核之上運行的進程(進程就是一個程序在計算機上運行的實體)所組成;系統分內核空間和用戶空間分別對應CPU的ring0特權指令和ring3普通指令;再利用虛擬內存技術來存放每個獨立的進程。我們現在的系統都是所謂的多進程多任務無非就是把CPU分片,內存分頁然后由內核來負責管理分配硬件給系統中的每個進程使用的限制;調度進程到CPU上執行并分配給多長時間;內核必須要追蹤每個進程的執行狀態而且還要明確知道當前系統上運行了多少個進程;維護一個進程隊列慢慢交給CPU運行。還有一個就是中斷技術。這幾種技術也就是多任務得以實現的核心。
在Linux的內核處理過程中,每一個進程默認會有一個固定的時間片來執行命令(默認為1/100秒),這段時間內進程被分配到CPU,然后獨占使 用。如果使用完,同時未到時間片的規定時間,那么就主動放棄CPU的占用,如果到時間片尚未完成工作,那么CPU的使用權也會被收回,進程將會被中斷掛起等待下一個時間片。其實在內核中維護了一個內核數據結構稱為task structure,用來保存每個進程的PPID、PID、NAME和上一次執行的指令到第幾條了等等,還有存放這此進程的邏輯頁面占據對應的物理頁面(負責轉換這兩者之間數據的是CPU中的芯片MMU內存管理單元)。然后根據這些信息來調度進程到CPU上執行和進程的保存現場和恢復現場,系統中進程之間的上下文切換是非常麻煩的消耗系統資源的。
Linux系統整體結構,如下圖:
系統的硬件資源都是有內核統一管理,應用層程序要使用這些資源必須向內核申請;應用層向內核申請功能是通過系統調用(system call)完成的。那么系統調用是如何實現的呢? 當前大部分操作系統通過軟中斷實現。 應用程序調用內核函數時,會同時發送一個中斷到cpu,cpu在中斷向量表里找到此中斷號對應的處理程序,從而執行內核代碼。現在x86等cpu已經從硬件層開始支持系統調用這個功能,并且性能提升了不少。 因為一個程序的越少的系統調用性能越好。 通過命令strace可以看到你的可執行代碼都調用了那些系統調用。
現在常用的CPU架構為SMP結構(即所有CPU共享L1/L2,memory,外設),區別與NUMA結構。 所以一個某一個瞬間一個進程/線程只會在一個核上運行,一個進程頻繁的在不同的CPU上運行性能會降低;因為每個核之間不共享高速緩存。如果進程頻繁在核之間切換,高速緩存命中率下降,嚴重影響性能。操作系統內核會保證一個進程盡量運行在一個核上,并保證每個核的負載均衡。我們知道cpu要頻繁的響應中斷,有些中斷來了,cpu必須放下正在執行的進程去響應中斷,比如對于web服務器網絡流量很高的服務器,網絡中斷很頻繁;操作系統提供一個親和度算法將一個終端號綁定到一個核上。這樣其他核就不會受中斷影響,提高系統性能。
cat 02 >> /proc/irq/xx/smp_affinity
如果您覺得本站對你有幫助,那么可以支付寶掃碼捐助以幫助本站更好地發展,在此謝過。
總結
以上是生活随笔為你收集整理的linux系统原理是什么意思,Linux系统原理之整体概述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 狂炫面食引游客惊叹:山东养的大熊猫相当炸
- 下一篇: 消息称字节跳动 Pico 调低 2023