[轉帖]System Performance 讀書筆記 - 作業系統(1)

济南小老虎發表於2024-05-17
https://cloud.tencent.com/developer/article/1927381

本系列是針對 Systems Performance: Enterprise and the Cloud, 2nd Edition (2020) 書籍的讀書筆記,加入了一些個人理解以及擴充,並且針對一些難以理解的地方提供了一些額外的參考

核心(Kernel)

經典模型中,核心在作業系統結構中的位置如圖所示:

image
image

從裡到外分別是:

  • 硬體(Hardware):作業系統執行在的硬體裝置。
  • 核心(Kernel:作業系統的核心軟體,核心管理著 CPU 排程、記憶體、檔案系統、網路協議以及各種系統裝置(磁碟 IO、網路 IO 等等)。透過系統呼叫提供服務。
  • 系統呼叫(System Calls):提供訪問硬體裝置或者核心服務的程式介面。例如 open, close, read, write, ioctl等,需包含標頭檔案unistd.h
  • 系統庫(System Libraries):直接用系統呼叫可能不太方便,我們可以使用封裝好的庫函式進行程式設計使用。從圖上可以看出,這裡其實有個缺口,因為應用也可以不使用系統庫而是直接使用系統呼叫。例如像是 Go 語言執行環境,他就使用了自己封裝的系統呼叫層而不是標準庫 libc

目前很多作業系統都在這個模型的基礎上做了變種,之後我們會詳細分析。

核心執行

經過不斷地迭代,核心目前已經非常龐大,有上百萬的程式碼。核心的執行是按需的,例如當使用者級別的應用程式發起了系統呼叫,或者裝置傳送了一個中斷(interrupt)的時候。另外,某些核心執行緒回非同步執行一些維護性的工作,可能包含核心時鐘程式以及記憶體管理任務,但是這些任務都會盡量保持輕量級並只佔用很少的 CPU 資源。

像 Web 伺服器這種 I/O 密集型的應用(不斷的接受請求返回響應),會經常在核心上下文中執行。計算密集型的應用則會盡量不打擾核心,可以不中斷地在 CPU 上執行。核心排程器會決定那個執行緒會執行,哪個會等待,以及排程到哪個 CPU 上。核心會選擇硬體快取更熱或者對於這個程序本地性更好的 CPU,來提高效能。

核心態以及使用者態

核心態(kernel mode):執行核心程式的時候,CPU 處於的模式即核心態,在這一狀態下,裝置的一切訪問以及各種特權命令執行都是被允許的。核心控制對於裝置的訪問來實現多程序處理。除非明確指定,否則程序之間或者使用者之間的資料是無法互相訪問的

使用者態(user mode):執行使用者程式的時候,CPU 處於的模式。透過系統呼叫,會從使用者態切換到核心態用更高的許可權級別執行:

image
image

使用者態切換到核心態是一種模式切換(mode switch),所有的系統呼叫都會模式切換,某些系統呼叫還會上下文切換:遇到硬碟 IO 或者網路 IO 的執行緒會上下文切換到可以執行的執行緒。這種切換都是有效能損耗的,一般透過如下幾種最佳化來避免:

  • 使用者模式系統呼叫(User-mode syscalls):可以在使用者模式庫實現一些系統呼叫。Linux 透過暴露 virtual dynamic shared object (vDSO)來實現,可以參考:https://man7.org/linux/man-pages/man7/vdso.7.html
  • 記憶體對映(Memory mappings):用於按需裝載記憶體頁(缺頁中斷),後面還會提到。這樣能避免直接訪問 IO 造成系統呼叫。
  • 核心繞開(Kernel bypass):可以讓使用者態程式直接訪問裝置,例如 DPDK(Data Plane Development Kit),這裡推薦一篇關於 DPDK 的文章
  • 核心態應用:例如執行在核心的 TUX 伺服器,以及 BPF(Berkeley Packet Filter). 關於 BPF,有一個著名的基於 BPF 實現的工具集合是:https://github.com/iovisor/bcc
在這裡插入圖片描述

相關文章