Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux 線程與進程深度解析:從核心實現到線程模型演進

編輯:Linux 教學

進程是程式在計算機上的一次執行活動。當你啟動一個程式,實際上就是啟動了一個進程。程式本身是靜態的代碼,而進程則是動態的執行實體。進程可分為系統進程和用戶進程:系統進程負責完成作業系統的各項功能,本質上是處於運行狀態下的作業系統本身;用戶進程則是由用戶啟動的所有進程。進程是作業系統進行資源分配的基本單位。

一、基礎知識:線程與進程的區別與聯繫

在 Windows 環境下,進程被進一步細化為線程,即一個進程擁有多個獨立運行的更小單位。關於 Linux 下的進程與線程,公認的經典觀點認為:

  • 進程是資源管理的最小單位,擁有獨立的地址空間、文件描述符、信號處理等資源。
  • 線程是程式執行的最小單位,僅包含程式計數器、棧和寄存器等執行上下文,共享進程的資源。

作業系統引入線程的主要目的有二:更好地支持對稱多處理器(SMP)架構,以及減小進程/線程上下文切換的開銷。一個進程至少需要一個線程作為指令執行體;進程管理資源(CPU、內存、文件等),而線程被調度到 CPU 上執行。若進程擁有多線程且運行在 SMP 機器上,可同時利用多 CPU 實現真正的並行,大幅提升效率。即便在單 CPU 機器上,多線程模型也能簡化程式設計、提高響應效率,且線程上下文切換開銷遠小於進程。

二、線程模型的演進:核心級、用戶級與混合模型

針對線程模型的兩大意義,衍生出核心級線程和用戶級線程兩種模型,分類標準在於線程調度者是在核心態還是用戶態。前者利於並發使用多處理器資源,後者則著眼於減小上下文切換開銷。現代商用系統通常採用混合模型:既提供核心線程滿足 SMP 需求,又支持用戶態線程庫實現另一套機制,此時一個核心線程同時充當多個用戶態線程的調度者。

Linux 內核從一開始就未實現傳統混合模型,但採用了另一種思路的「混合」:僅在內核提供輕量進程支持,並著重優化進程調度開銷,在一定程度上彌補了缺陷。最流行的 LinuxThreads 採用線程-進程「一對一」模型,調度交給核心,用戶態實現包含信號處理在內的線程管理機制。

三、Linux 2.4 內核中的輕量進程實現

早期進程定義包含程式、資源、執行三部分。為減小切換開銷,作業系統設計者逐漸允許進程共享部分資源(文件、信號、數據內存甚至代碼),由此發展出輕量進程概念。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)等高性能線程庫奠定了基礎。

Copyright © Windows教程網 All Rights Reserved