1. 程式人生 > 實用技巧 >高階Linux運維工程師養成記-計算機基礎之作業系統基礎

高階Linux運維工程師養成記-計算機基礎之作業系統基礎

高階Linux運維工程師養成記-計算機基礎之作業系統基礎

高階Linux運維工程師養成記

作業系統功能

作業系統(Operating System)是一個通用目的的軟體程式,提供了硬體驅動(CPU、記憶體、音效卡、顯示卡、網絡卡、印表機)、程序管理、記憶體管理、網路管理、安全管理、檔案管理等通用功能提供給系統軟體和應用軟體使用。
作業系統介於應用軟體和計算機硬體之間,給應用軟體提供開發和執行平臺,同時管理和排程硬體資源。

平常使用的應用軟體都是執行在作業系統之上,利用作業系統提供的通用功能實現聽音樂、上網、聊天等等應用。因為有了作業系統,應用軟體開發人員只需要專注功能實現,不需要關注硬體差異性。

目前主流的作業系統包含 伺服器端的RHEL、CentOS(RHEL社群版)、Ubuntu Server 和桌面端 Windows、 macOS、Ubuntu桌面版以及移動端Android 、IOS、華為鴻蒙。

Linux運維主要是圍繞RHEL/CentOS與Ubuntu Server兩個系統以及相關的生態展開。

作業系統相關概念

互動式介面

作業系統通過介面的方式,建立了使用者與計算機硬體的溝通方式。使用者通過呼叫作業系統的介面來使用計算機的各種服務。

介面(interface):來源於電氣工程學科,指的是插座與插頭的連線口,起到將電與電氣連線起來的功能。後來延伸到軟體工程裡,指軟體包向外I同工的功能模組的函式介面,所以介面是用來連線兩個東西,訊號轉換和遮蔽細節。

作業系統一般會提供兩個重要的介面來滿足使用者的一些一般性的使用需求:

  • 命令列
    實際上是一個叫shell的終端程式提供的功能,該程式底層的實質還是呼叫一些作業系統提供的函式。
    例如Windows上可以使用win+r快捷鍵開啟執行視窗

    然後輸入cmd後回車

    系統會彈出一個shell終端

    我們可以在上面輸入相關的命令並回車後執行,檢視相關結果的輸出
    例如使用ipconfig檢視無線網絡卡的ip地址

  • 視窗介面
    視窗介面通過編寫的視窗程式來接收來自作業系統訊息佇列的一些滑鼠、鍵盤動作,進而做出一些響應。Windows,macOS,Ubuntu都是使用視窗介面完成絕大多數日常任務。

在Linux運維的絕大多數任務都是基於命令列的字元介面完成。

開發介面標準

  • ABI
    ABI(Application Binary Interface) 即應用程式二進位制介面,描述了應用程式與作業系統之間的底層介面,允許編譯好的目的碼在使用相容ABI的系統中無需改動就能執行。
    Windows中程式的執行格式通常是EXE,還有一些依賴的動態連結庫(檔名字尾通常是.dll 即dynamic link library)以及庫檔案(字尾名是.lib)

linux中程式的執行格式通常是ELF,還有一些依賴的庫檔案(字尾名通常是.so即shared object),Linux中可執行程式和字尾名無關,甚至可以沒有後綴。

因為每個作業系統的ABI不同,也就意味著Windows上執行的程式(例如notepad.exe)不能在linux上執行。就像香港的插頭必須經過轉接頭才能在國行使用。

  • API
    API(Application Programming Interface) 即應用程式程式設計介面,API定義了原始碼和庫之間的介面,開發人員在開發程式時可以呼叫系統提供的API來完成某些功能,因此同樣的原始碼可以支援在這個API的任何系統編譯。
    為了統一規範,IEEE在作業系統上定義了一系列的API標準:POSIX(Portable Operating System Interface)即可移植的作業系統介面,實現了POSIX標準相容的程式可以在其他POSIX作業系統編譯執行。

幸運的是現在的高階程式語言(Java,Go,Python)已經實現了完全的跨平臺,遮蔽了作業系統的差異,實現一次編寫,到處編譯\解釋執行。

如果對Java開發感興趣的同學可以關注高階Java工程師養成記系列

使用者態和核心態

計算機硬體資源都是作業系統核心進行管理,目前的作業系統都是基於多工,多使用者的。如果每個使用者程序都可以隨意訪問作業系統的核心模組,改變狀態,那麼整個系統的穩定性、安全性都大大降低。

為了讓核心程式與使用者程式隔離開,在硬體層面上提供了一個機制,將程式執行的狀態分層了不同的級別,從Ring 0到Ring 3,數字越小,訪問級別越高。0代表核心態,在該特權級別下,所有記憶體上的資料都是可見的,可訪問的。3代表使用者態,在這個特權級下,程式只能訪問一部分的記憶體區域,只能執行一些特定的指令。

如果應用程式想要訪問硬體資源,此時需要傳送請求給核心,由核心和硬體的互動。

庫函式和系統呼叫

對於非一般性使用需求,作業系統提供了一系列的函式呼叫給軟體開發者,由軟體開發者來實現一些使用者需要的功能。這些函式呼叫由於是作業系統核心提供的,為了區別於一般的函式呼叫,被稱為系統呼叫。
比如使用C語言進行軟體開發時,經常使用的printf()函式,它的內部實際上就是通過write這個系統呼叫,讓作業系統核心把字元列印在螢幕上。

庫函式和系統呼叫

使用者空間和核心空間

  • 使用者空間(User Space) 表示使用者程式的執行空間,為了安全,使用者空間和核心空間是隔離的,即使使用者的程式崩潰,也不會影響核心。使用者空間智慧執行簡單的運算,不能直接呼叫系統資源,必須通過系統介面(system call) 才能向核心發出指令。

  • 核心空間(Kernel Space) 表示核心的執行空間,可以執行任意指令,呼叫系統的一切資源。


使用者空間與記憶體空間

str ="www.ittimeline.net";
x=100;
x=x+100;
file.write(str);
y=x+200

第1,2,3行都是簡單的賦值操作,直接在使用者空間執行,第四行需要寫入檔案,就需要切換到核心空間,因為使用者不能直接寫檔案,需要通過核心來執行。第五行又是賦值運算,需要從核心空間切換回使用者空間。核心空間和使用者空間的切換需要消耗資源。

如果想要在Linux下開發程式,就需要掌握某種程式語言,例如C/C++/Java/Python/Go/Ruby等等。
其中Linux核心使用C語言和少數組合語言開發的,而Linux系統的應用是使用C/C++/Java/Python/Go/Ruby語言開發的。

想要高薪就業、在IT行業長久發展,必須掌握系統運維與應用開發。開發語言首推Java,Python,Go