System Performance 讀書筆記 - 操作系統(1)

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

內核(Kernel)

經典模型中,內核在操作系統結構中的位置如圖所示: 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

用戶態切換到內核態是一種模式切換(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

link

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章