進程是程式在計算機上的一次執行活動。當你啟動一個程式,實際上就是啟動了一個進程。程式本身是靜態的代碼,而進程則是動態的執行實體。進程可分為系統進程和用戶進程:系統進程負責完成作業系統的各項功能,本質上是處於運行狀態下的作業系統本身;用戶進程則是由用戶啟動的所有進程。進程是作業系統進行資源分配的基本單位。
在 Windows 環境下,進程被進一步細化為線程,即一個進程擁有多個獨立運行的更小單位。關於 Linux 下的進程與線程,公認的經典觀點認為:
作業系統引入線程的主要目的有二:更好地支持對稱多處理器(SMP)架構,以及減小進程/線程上下文切換的開銷。一個進程至少需要一個線程作為指令執行體;進程管理資源(CPU、內存、文件等),而線程被調度到 CPU 上執行。若進程擁有多線程且運行在 SMP 機器上,可同時利用多 CPU 實現真正的並行,大幅提升效率。即便在單 CPU 機器上,多線程模型也能簡化程式設計、提高響應效率,且線程上下文切換開銷遠小於進程。
針對線程模型的兩大意義,衍生出核心級線程和用戶級線程兩種模型,分類標準在於線程調度者是在核心態還是用戶態。前者利於並發使用多處理器資源,後者則著眼於減小上下文切換開銷。現代商用系統通常採用混合模型:既提供核心線程滿足 SMP 需求,又支持用戶態線程庫實現另一套機制,此時一個核心線程同時充當多個用戶態線程的調度者。
Linux 內核從一開始就未實現傳統混合模型,但採用了另一種思路的「混合」:僅在內核提供輕量進程支持,並著重優化進程調度開銷,在一定程度上彌補了缺陷。最流行的 LinuxThreads 採用線程-進程「一對一」模型,調度交給核心,用戶態實現包含信號處理在內的線程管理機制。
早期進程定義包含程式、資源、執行三部分。為減小切換開銷,作業系統設計者逐漸允許進程共享部分資源(文件、信號、數據內存甚至代碼),由此發展出輕量進程概念。Linux 2.0.x 版本已實現輕量進程,應用程式可通過統一的 clone() 系統調用,以不同參數指定創建輕量進程或普通進程。內核中 clone() 經參數解析後調用 do_fork(),該函數同時也是 fork()、vfork() 的最終實現:
int do_fork(unsigned long clone_flags, unsigned long stack_start,
struct pt_regs *regs, unsigned long stack_size)
clone_flags 取自以下宏的「或」值(節選):
CLONE_VM:共享內存空間CLONE_FS:共享文件系統信息CLONE_FILES:共享打開文件CLONE_SIGHAND:共享信號處理器和阻塞信號CLONE_THREAD:隱含在 CLONE_SIGHAND 中,標識線程創建通過組合這些標誌,Linux 以極簡的內核機制實現了靈活的線程/進程創建,為後續 NPTL(Native POSIX Thread Library)等高性能線程庫奠定了基礎。
Linux 系統效能監控全景圖:mpstat/vmstat/sar/iostat/top 六大神器深度解析與實戰判讀
資深 Linux 系統管理員經驗談:從命令行到架構師的進階之路
Linux 伺服器維護四大錦囊:軟體更新、啟動盤、分區規劃、服務精簡
Linux 系統程式設計:使用 Netlink Socket 監聽 U 盤熱插拔事件 (含完整 C 代碼範例)
crontab 定時任務完全指南:語法、範例、環境變坑、日誌與 systemd timer 現代替代
Linux 正常關機偵測機制:rc.d 腳本建立/刪除旗標檔判斷關機狀態