目錄
什么是線程(Thread)?
線程與進程之間的關系
線程調度與并發執行
并發(Concurrency)與并行(Parallelism)
多線程編程的四大核心優勢(benefits of multithreaded programming)
1?? 響應性(Responsiveness)
2?? 資源共享(Resource Sharing)
3?? 經濟性(Economy)
4?? 多核架構的利用(Utilization of Multiprocessor Architectures)
什么是線程(Thread)?
在操作系統中,線程(Thread)是程序執行的最小單位。也就是說,線程是 CPU 實際調度和執行的基本單元。
所以,從 CPU 的角度看,它不是在執行“程序”,也不是在執行“進程”,而是在執行一個個線程。
線程的組成部分
每個線程在運行時,需要具備一定的執行上下文(execution context)。一個線程通常由以下幾部分組成:
組成部分 | 作用 |
---|---|
Thread ID | 操作系統為每個線程分配的唯一編號,用于標識和管理線程 |
Program Counter(程序計數器) | 當前線程將要執行的下一條指令的地址 |
Register Set(寄存器集合) | 包括通用寄存器、堆棧指針、程序狀態字等,用于存儲線程的運行狀態 |
Stack(棧) | 每個線程都有自己的棧空間,用于存儲函數調用、返回地址、局部變量等 |
這些是線程私有的,每個線程都要擁有自己的這些資源,才能獨立運行。
線程與進程之間的關系
進程(Process)是一個正在運行的程序實例,它是操作系統資源分配的最基本單位。一個進程擁有:
-
獨立的地址空間(虛擬內存)
-
獨立的代碼段、數據段、堆和棧
-
文件描述符等系統資源
所以,一個傳統的進程只包含一個線程,也叫“單線程進程”。
具體關于進程的介紹可以參考:操作系統:進程管理(Process Management)-CSDN博客
那么,線程與進程的關系是什么?
可以這樣理解:
-
一個線程是屬于某個進程的
-
一個進程可以包含一個或多個線程
-
一個進程中的所有線程共享該進程的資源
線程共享的內容包括:
共享內容 | 描述 |
---|---|
代碼段(Code Section) | 所有線程執行的程序指令是一樣的 |
數據段(Data Section) | 包括全局變量、靜態變量等 |
堆(Heap) | 動態分配的內存區域 |
打開的文件描述符 | 所有線程可以訪問同一組文件、socket 等 |
換句話說,線程是在同一個進程中運行的多個控制流(control flow)。
線程調度與并發執行
線程是操作系統調度的單位。每當 CPU 需要切換任務,它可以在不同線程之間切換,形成并發執行的效果。
如果一個程序只有一個線程:
程序中的所有任務只能串行(sequential)執行,一件事做完,才能做下一件。
如果一個程序有多個線程:
多個線程可以并發執行,每個線程負責一部分任務,比如:
-
一個線程負責接收用戶輸入
-
一個線程負責處理后臺計算
-
一個線程負責保存文件
這樣,程序就可以顯得“更快”“更流暢”。如果只有一個線程,那么當用戶在輸入時,下載任務等就會被迫停止。
在多核 CPU 上,多個線程甚至可以真正同時執行(并行 execution)。
并發(Concurrency)與并行(Parallelism)
并發(Concurrency)
核心思想:在同一時間段里處理多個任務,但不一定真的在“同一時刻”運行。
-
系統快速切換任務,讓它們看起來像是同時進行的。
-
適合處理大量獨立或部分交互的任務,重點在管理任務。
形象比喻:
你只有一個廚師,要做三道菜。廚師會炒一會兒菜A,等水開時去切菜B,再回來煮菜C,看起來三道菜都在同時進行,但實際上廚師一次只做一件事——只是切換得足夠快。
技術特征:
-
常出現在單核CPU + 多任務調度中。
-
線程或進程可能共享CPU時間片(time slice)。
-
重點是任務切換(context switching)。
并行(Parallelism)
核心思想:在同一時刻真正執行多個任務,需要多個處理單元(多核CPU、多臺機器等)。
-
每個任務都占用獨立的處理資源,同時推進。
-
重點在加快計算速度。
形象比喻:
你有三個廚師,每個人負責一道菜,大家同時動手,三道菜能一起完成。
技術特征:
-
常出現在多核CPU、GPU、分布式計算中。
-
線程或進程在不同核心上同時運行。
-
強調硬件并行能力。
并發 vs 并行 —— 關鍵區別
特性 | 并發(Concurrency) | 并行(Parallelism) |
---|---|---|
定義 | 管理多個任務的執行順序,使它們“看起來”同時進行 | 多個任務真的同時執行 |
硬件需求 | 不一定需要多核 | 需要多核或多CPU |
實現方式 | 時間片輪轉、異步 I/O | 多核調度、向量化計算 |
目標 | 提高資源利用率、響應性 | 縮短執行時間 |
例子 | 單核CPU運行多線程Web服務器 | GPU同時計算成千上萬個像素 |
結合關系
-
并發是一個編程與調度思想,它不一定要依賴硬件多核,但可以在多核環境下跑得更快。
-
并行是一個硬件執行層面的能力,需要多個處理單元才能實現。
-
兩者的關系可以這樣總結:
并發 = 會做很多事(安排得開)
并行 = 同時做很多事(人手夠多)
實際應用中的區別
-
Web服務器:一個單核服務器通過并發(異步I/O)也能同時處理成千上萬個請求,但它一次只能用CPU處理一個任務。
-
科學計算:并行化矩陣乘法時,每個CPU核心同時計算矩陣不同部分,大幅減少總時間。
-
游戲引擎:既用并發(管理用戶輸入、AI、物理計算等任務),也用并行(多核同時渲染不同畫面部分)。
多線程編程的四大核心優勢(benefits of multithreaded programming)
多線程編程的四大核心好處
分類 | 中文名稱 | 簡要概括 |
---|---|---|
?Responsiveness | 響應性 | 線程分工協作,避免程序“卡死” |
?Resource Sharing | 資源共享 | 多線程天然共享內存資源 |
?Economy | 資源經濟性 | 線程創建和切換成本比進程低 |
?Utilization of Multiprocessors | 多核處理器利用率 | 多線程可在多核 CPU 上真正并行運行 |
下面我們一項一項詳細解釋。
1?? 響應性(Responsiveness)
在一個交互式應用程序中(例如圖形界面、瀏覽器、游戲),有些操作可能需要較長時間,例如:
-
加載大文件;
-
下載網絡資源;
-
進行復雜計算(比如渲染、解壓縮)。
如果這些任務由主線程(主控制流)執行,用戶界面將凍結或卡住,導致用戶體驗極差。
多線程的好處:
通過將耗時操作放入后臺線程執行,主線程仍然能接收用戶輸入,界面保持響應。
?舉例說明:
-
在一個 Word 編輯器中,主線程負責響應鍵盤輸入;
-
后臺線程負責保存、拼寫檢查、自動備份;
-
即使備份正在進行,你依然可以輸入文字。
2?? 資源共享(Resource Sharing)
同一進程內的所有線程共享代碼、數據、內存空間和操作系統資源(如打開的文件、套接字)。
這和進程之間數據隔離的情況不同 —— 進程之間要通信,通常要使用 IPC(進程間通信機制)。
?多線程的好處:
-
數據可以直接共享,不需要復制;
-
通信無需借助復雜機制(如管道、共享內存、消息隊列);
-
更容易開發結構清晰的協同模塊。
?舉例說明:
-
瀏覽器的多個標簽頁可能是一個進程內的多個線程;
-
所有線程共享緩存、網絡連接、內存;
-
不需要在標簽頁之間“傳遞數據” —— 它們天然就在同一個地址空間里。
3?? 經濟性(Economy)
創建一個線程比創建一個進程更加輕量(經濟):
操作 | 資源消耗 |
---|---|
創建新進程 | 分配獨立地址空間、內存映射、文件表復制等,代價高 |
創建新線程 | 只需分配一個新的棧空間,復用現有進程資源,開銷小 |
此外,線程之間的上下文切換(context switch)也比進程快得多。因為它們在同一個進程中,不涉及地址空間切換。
?多線程的好處:
-
更快的啟動速度;
-
更少的內存占用;
-
更高的執行效率。
?舉例說明:
-
一個下載器開啟 10 個線程同時下載 10 個文件;
-
如果是 10 個進程,系統將為每個進程分配內存、創建文件描述符,開銷更大;
-
使用 10 個線程則只需一份代碼和資源。
4?? 多核架構的利用(Utilization of Multiprocessor Architectures)
現代計算機幾乎都擁有多核 CPU(如 4 核、8 核甚至更多);
-
一個單線程程序始終只能在一個 CPU 核上運行;
-
而多線程程序中的多個線程可以被操作系統同時分配到多個核心上。
?多線程的好處:
-
真正的并行計算;
-
提高程序的整體吞吐量;
-
充分利用硬件資源,尤其在高性能場景(如圖像處理、科學計算)中收益巨大。
?舉例說明:
你寫了一個程序,需要對 1000 張圖片同時做縮放處理:
-
單線程:一張一張順序處理;
-
多線程:開啟 8 個線程,8 核 CPU 每個線程各自處理一部分圖片,速度提升近 8 倍。