晶片層 開放閱讀

執行緒

Thread

概念 ID
thread
更新時間
2026-05-29
來源數量
待補

執行緒

3秒看懂

執行緒是作業系統能夠進行運算排程的最小單位。它被包含在程序之中,是程序中的實際運作單位。一個程序可以併發多個執行緒,每條執行緒並行執行不同的任務。在AI訓練中,資料載入、梯度計算、通訊等環節普遍使用多執行緒來掩蓋I/O延遲、提升硬體利用率。理解執行緒是掌握平行計算、高效能系統設計的基石。

3分鐘產業解釋

在現代AI產業鏈中,執行緒直接影響訓練和推論的吞吐量。當GPU執行矩陣運算時,CPU負責資料預處理、最佳化器步驟、梯度壓縮、多機通訊協調。這些任務若不通過多執行緒重疊執行,昂貴的加速器將頻繁陷入等待。在超大型模型分散式訓練時,引數伺服器、流水線並行排程、All-Reduce通訊等元件均深度依賴執行緒池與非同步執行模型。雲端廠商提供的vCPU實質上就是執行緒的虛擬化暴露,合理繫結執行緒與物理核能降低尾延遲。從端側部署的NNAPI到伺服器級的NUMA最佳化,執行緒的親和性、優先順序、數量配置都是成本與效能調優的核心槓桿。

15分鐘專家深入

深入看執行緒,需要分辨三個層次:使用者態執行緒(UT)、核心態執行緒(KT)以及它們之間的對映關係。應用層看到的std::thread、pthread_create建立的是使用者態可見的執行緒實體,幕後由作業系統根據排程模型對映到可執行的核心排程實體。三個經典模型是:1:1(一個使用者執行緒對應一個核心執行緒,如Linux Threads/NPTL);N:1(多個使用者執行緒複用同一個核心執行緒,即綠色執行緒,如早期的Java虛擬機器);M:N(多個使用者執行緒對映到多個核心執行緒,如Go語言的goroutine與網路輪詢器和工作執行緒的組合)。AI架構大多執行在1:1模型之上,因其能充分利用多核並行性,但代價是上下文切換直接陷入核心。

執行緒的生命週期受排程器控制。典型狀態機包括:就緒、執行、阻塞。搶佔式排程器會基於時間片中斷當前執行緒,儲存上下文(暫存器、程式計數器、棧指標等),選擇下一個就緒執行緒恢復上下文。該上下文切換開銷包含直接CPU週期損耗以及TLB、快取失效的間接懲罰,線上程遷移到新核時還可能面臨TLB冷快取,導致TLB缺失增多。在AI訓練場景中,頻繁的執行緒切換會汙染CPU快取中駐留的訓練資料,降低峰值記憶體頻寬,對資料預處理流水線造成抖動。由此,架構常採用自定義執行緒池配合忙等/條件變數混合策略,並設定CPU親和性來固定資料載入執行緒到指定物理核,避免遷移。

同步是多執行緒程式設計的核心複雜度來源。互斥鎖、讀寫鎖、訊號量、條件變數、屏障等原語建置了協作模型。用鎖不慎可能導致死鎖、優先順序反轉、車隊效應。現代無鎖程式設計藉助CAS(Compare-And-Swap)指令實現資料結構,在競爭溫和時能極大減少核心參與,但在高爭用下可能引發快取行乒乓(cache line bouncing),反而劣化效能。記憶體序(memory order)是更底層的約束,C++11的記憶體模型定義了acq_rel等順序,確保無鎖並行的正確性。

GPU端的執行緒概念與CPU不同。CUDA中的“thread”是指SIMT模型中的一條執行通道,幾萬個執行緒併發排程在流多處理器上,以warp為單位執行。但控制這些GPU執行緒的CPU端驅動、資料搬運流(Stream)則是通過CPU執行緒或非同步回撥來管理,這是異構程式設計中容易忽視的執行緒併發域。

最後,超執行緒(SMT)是處理器微架構層面的技術,將單個物理核的資源(如前端解碼、執行單元、快取埠)劃分成兩份或多份架構狀態,在作業系統看來表現為多個邏輯處理器。物理核上兩個邏輯執行緒共享執行資源,一個遇到長延遲事件(如快取缺失)時另一個可以頂上,但並非等同於兩個獨立核。AI負載中整數指令佔比高的部分(如資料變換、控制邏輯)常從SMT獲益,而純粹浮點飽和計算可能會因資源爭搶導致每執行緒效能下降。

技術原理

執行緒的核心機制與排程

作業系統通過執行緒控制塊(TCB)管理每個執行緒。TCB內包含程式計數器、暫存器快照、棧指標、執行緒狀態、優先順序、排程引數等。上下文切換時將當前執行緒的上下文壓入其核心棧或TCB,再從排程佇列選中下一個執行緒恢復。

上下文切換流程簡示(ASCII圖):

   Running Thread A                Running Thread B
   +------------------+           +------------------+
   |  User Stack      |           |  User Stack      |
   |  ...             |           |  ...             |
   |  (saved SP→)     |           |                  |
   +------------------+           +------------------+
          │                                │
          ▼  (trap)                        ▲  (return-from-trap)
   +------------------+           +------------------+
   |  Kernel Stack A  |           |  Kernel Stack B  |
   |  saved PC, regs  |           |  restored PC/regs|
   |  TCB pointer     |           |  TCB pointer     |
   +------------------+           +------------------+
          │                                │
          └───────── Switch ───────────────┘
               (scheduler selects B)

使用者級執行緒與核心級執行緒對映模型

模型描述建立開銷阻塞影響並行能力典型實現
1:1每個使用者執行緒對應一個核心執行緒較高(系統呼叫)僅單一執行緒阻塞多核真並行Linux pthread, Windows執行緒
N:1多個使用者執行緒對映到單個核心執行緒很低(使用者空間)任一執行緒阻塞導致全組阻塞無多核並行早期Java綠色執行緒
M:N多個使用者執行緒複用多個核心執行緒中等執行緒阻塞可排程其他UT多核並行,伸縮性好Go runtime (goroutine+M個核心執行緒), 歷史上的Solaris LWP

關鍵同步原語與代價定性

  • 互斥鎖(Mutex): 加鎖失敗時執行緒進入睡眠/等待佇列,觸發上下文切換。適用於臨界區較長的場景。若臨界區極短(幾個指令),自旋鎖可能更高效,因為避免了兩次上下文切換損耗。
  • 自旋鎖(Spinlock): 執行緒忙等,不放棄CPU。在鎖持有時間短、多核系統上合理,但消耗CPU週期且可能引起快取行乒乓。常在作業系統內部或無鎖資料結構建置中使用。
  • 原子操作與CAS: 單個不可分割的讀-改-寫指令。CAS迴圈實現無鎖佇列/棧。在高爭用下,失敗的CAS浪費CPU,不如互斥鎖。
  • RCU(讀-複製-更新): 讀者無鎖,寫者複製修改,延遲迴收舊節點。廣泛用於核心中讀多寫少資料結構。

多執行緒與記憶體一致性

現代處理器硬體會亂序執行、store buffer和cache coherence協議可能導致不同執行緒看到的記憶體操作順序與程式順序不同。因此,需要記憶體屏障(fence)或具有acquire/release語義的操作來建立happen-before關係。這是多執行緒程式正確性的基石,也是除錯最困難之處,因為錯誤只會在特定交織下暴露。

技術演進史

  • 1960s: 早期分時系統開始引入併發概念,但程序為排程單位,無獨立執行緒。
  • 1980s: 執行緒概念在作業系統研究領域成熟,Mach微核心引入執行緒和任務分離。DEC VMS等系統支援輕量級程序。
  • 1990s: POSIX執行緒標準(IEEE Std 1003.1c-1995)定義統一API,pthread庫成為Unix及類Unix系統的規範。Windows NT提供原生CreateThread API。Java語言通過JVM內建的綠色執行緒或原生執行緒提供Thread類。
  • 2000s: 多核處理器普及,1:1執行緒對映成為Linux(NPTL)、Windows的主流實現。Intel於2002年引入超執行緒技術,實現SMT。Solaris推出M:N模型嘗試平衡併發與並行。
  • 2011: C++11標準化執行緒庫、原子操作和記憶體模型,極大提升可移植性與正確性。同年Java 7引入Fork/Join池。
  • 2010s至今: 大規模併發需求驅動非同步I/O與協程流行,執行緒與任務(task)解耦。Go語言執行時以goroutine實現M:N排程,避免系統呼叫開銷。Rust語言以所有權模型靜態消除資料競爭。在AI領域,CUDA流、PyTorch DataLoader workers、分散式訓練中的多執行緒通訊庫(NCCL多執行緒驅動)將執行緒作為基礎併發工具深度融入訓練架構。

技術路線對比

維度執行緒(核心級,1:1)使用者級執行緒(綠色執行緒)協程(Coroutine)非同步事件迴圈(asyncio)
併發模型搶佔式多執行緒協作式多工,通常對映單KT協作式,可掛起/恢復單執行緒事件驅動
排程者OS排程器使用者級排程器程式語言執行時事件迴圈(由單執行緒執行)
上下文切換開銷高(核心陷入+硬體上下文)低(僅儲存使用者上下文)極低(儲存少數暫存器)僅callback開銷
利用多核是(不同執行緒可並行)否(若對映單KT)需與多執行緒結合需啟動多個程序/執行緒
阻塞操作真正阻塞執行緒,釋放CPU偽裝阻塞,實際全組暫停主動讓出控制權必須使用非阻塞I/O
典型用例CPU密集型並行歷史上小型裝置併發高併發I/O服務(網路伺服器)高併發網路應用

AI架構實踐傾向:PyTorch/TensorFlow外部資料載入使用子程序(多程序)以規避Python全域性直譯器鎖(GIL)對多執行緒的限制;內部C++後端則大量使用執行緒池處理運算元排程、通訊。NCCL的預設通訊使用獨立執行緒以流水線通訊與計算。

上下游

上游:處理器微架構與指令集

  • 硬體多執行緒支援:核心數、SMT/超執行緒(Intel HT、AMD SMT、IBM POWER SMT8)、硬體上下文數量。
  • 原子指令與記憶體模型:LR/SC、CAS、FAA等原子操作指令,提供無鎖同步基石。
  • 快取一致性協議:MESI/MOESI決定了多核共享資料的可見性開銷,影響多執行緒程式的快取行設計。
  • 中斷與異常機制:為搶佔式排程提供時鐘中斷(tickless或週期性時鐘)支援。

中游:作業系統與執行時

  • 排程器與排程類:CFS(Completely Fair Scheduler)、μs級排程、即時排程類(SCHED_FIFO/RR/DEADLINE)。
  • 同步原語實現:核心態futex為互斥鎖/條件變數提供快速使用者空間慢速核心機制。
  • 執行緒本地儲存(TLS)與執行緒終止/回收機制。
  • 程式語言封裝:C++ std::thread、Java java.lang.Thread、Python threading(受GIL限制需區分)、Go runtime (GMP模型)。

下游:應用與架構

  • AI/ML架構:PyTorch DataLoader多程序/多執行緒資料餵養;TensorFlow內部執行緒池;ONNX Runtime執行提供器執行緒策略;vLLM等推論引擎中的多執行緒排程。
  • 資料庫:連線池執行緒模型(one-thread-per-connection vs thread-per-connection with pooling)。
  • Web伺服器與RPC:Apache prefork/worker、Nginx worker多程序+執行緒;gRPC基於執行緒池的完成佇列。
  • 量化交易系統:鎖定執行緒到核,排程延遲敏感。

關鍵指標

由於未獲得檢索資料,以下僅作定性描述和公認範圍標識,具體數字取決於測試環境與體系結構。

  • 執行緒建立/銷燬開銷:約數微秒至數十微秒量級。建立需要分配棧記憶體(典型棧大小1–8 MB,可配置)、初始化TCB、系統呼叫開銷。與核心執行緒啟動相關。
  • 上下文切換開銷:大致數千個CPU週期,摺合微秒級。主要耗時在儲存恢復暫存器、切換地址空間(同一程序內執行緒切換無需切換頁表基址,但可能重新整理TLB);若跨核遷移,增加快取區域性性損耗。
  • 延遲與吞吐量權衡:執行緒數遠大於物理核心數時,額外排程的上下文切換與快取競爭可能導致吞吐量不升反降(over‑subscription)。
  • 可擴充套件性:現代Linux在數千個執行緒的休眠/喚醒管理上表現尚可,但若多數執行緒處於活躍 Runnable 狀態,排程器開銷不可忽略。應用常通過執行緒池+任務佇列來限制併發執行緒數為核心數的1–2倍。
  • NUMA影響:多插槽系統上,執行緒訪問遠端記憶體時頻寬下降、延遲上升。繫結執行緒與記憶體節點是提高效能的必要手段。標註:[通用架構知識,未引用特測資料]。

供需與市場資料

執行緒本身無直接“市場”。其供需隱含在處理器核心數增長、雲端運算的vCPU售賣、並行程式設計技能需求之中。

  • 伺服器CPU核心數持續增加,主流x86伺服器單顆可達64核心(128執行緒),ARM伺服器(如AWS Graviton)單顆64核無SMT。核心密度提高削弱了SMT的相對收益,部分雲端工作負載傾向關閉SMT以獲取確定性能。 [行業趨勢,無檢索具體數字]
  • 公共雲端廠商以vCPU(通常對應一個邏輯執行緒)為單位售賣算力,多執行緒效能直接決定租戶成本。比如,規格為4 vCPU的例項可能在物理上對應2核4執行緒或4核,其實際計算能力因爭搶而異。
  • 開發者市場:併發程式設計能力持續位列高薪技能,對執行緒、鎖、無鎖資料結構、並行模型的掌握度在AI系統、資料庫、高頻交易領域招聘中常為硬性要求。

代表公司與資本對映

  • Intel / AMD: 處理器SMT實現,直接影響作業系統執行緒排程策略。Intel引入超執行緒(HT),AMD實現類似SMT。資本關注新一代核心與執行緒配比。
  • NVIDIA: GPU執行緒模型(CUDA core可視為執行緒執行通道)及SM的排程器設計。多執行緒的CPU端管理如CUDA流併發。其Mellanox網路部門NCCL庫中的通訊執行緒模型。
  • 雲端服務商(AWS, Microsoft Azure, GCP): 提供基於vCPU(邏輯執行緒)的計算例項,並將物理拓撲暴露給租戶(如NUMA繫結)。資本看重虛擬化中執行緒排程的最佳化以減少“noisy neighbor”效應。
  • Red Hat / Canonical / Linux Foundation: 負責Linux核心排程器、futex、cgroup執行緒管理等核心基礎設施的演進。
  • 程式語言生態:
    • Go (Google): 開創性M:N goroutine排程器,降低大規模併發程式設計心智負擔,廣泛用於雲端原生基礎設施。
    • Rust (社群/Mozilla): 所有權系統提供了資料競爭的自由,適合系統級併發。
    • Oracle (Java): Loom專案旨在將輕量級虛擬執行緒引入JVM,可大幅提升吞吐量,與作業系統執行緒解耦。
  • AI 架構:PyTorch (Meta)、TensorFlow (Google) 等內部執行緒池與資料載入實現,資本關注其訓練效率提升帶來的能效比。

投資邏輯

  1. 多核CPU趨勢的長期受益者:雲端伺服器、邊緣計算的算力擴充套件依賴核心數增長,要求軟體有效利用多執行緒。能提供高效能執行緒庫、編譯器最佳化、並行分析工具的公司/開源專案具有價值。
  2. SMT/超執行緒的取捨:晶片面積與功耗限制下,如何配置物理核與邏輯執行緒比例是一個投資決策點。在某些AI重浮點負載下,SMT可能帶來收益遞減,影響雲端例項選型。
  3. 新型併發模型的破壞性:協程、有棧/無棧非同步模型對核心執行緒模型的衝擊體現在C10k到C10M問題。Go、Java Loom等可能降低併發伺服器的資源消耗,提升雲端服務毛利率。
  4. 硬體輔助排程:Intel TSX事務記憶體、AMX對矩陣運算的加速等新指令集,使得某些場景可避免細粒度鎖,投資相關生態的早期適配者可獲得壁壘。
  5. 異構計算下的執行緒編排:CPU執行緒與GPU核心、DPU執行緒之間的協同排程(如CUDA stream回撥、DMA控制)成為系統最佳化的高地。相關工具鏈、中介軟體市值隨AI增長。

常見誤讀糾偏

  1. “多執行緒一定比單執行緒快”
    僅當程式具備可並行的計算任務且系統有空閒核心時才可能。執行緒建立/銷燬、同步、上下文切換會引入開銷。大量執行緒爭搶臨界區時可能因鎖競爭導致吞吐量低於單執行緒。阿姆達爾定律嚴格限制加速比:若序列部分佔5%,則最多加速20倍,無限增加執行緒無效。

  2. “有了超執行緒,雙核四執行緒就等於四核效能”
    超執行緒是兩個邏輯執行緒共享一個物理核的執行單元、快取、記憶體頻寬等資源。當兩個執行緒都執行高吞吐的浮點乘法時,共用執行埠會相互阻塞,整體吞吐可能只比單執行緒提升不到20%。而在I/O密集或分支密集的程式碼中效率提升明顯。因此,絕不能等同物理核心。

  3. “併發(concurrency)就是並行(parallelism)”
    併發是邏輯上的同時處理(多個執行緒交錯執行),可以在單核上通過時間片輪轉實現。並行是物理上的同時執行,必須有多核或多處理器。多執行緒程式是併發的,但只有當多個執行緒同時執行在不同物理核上才是並行的。

  4. “加鎖一定保證執行緒安全”
    鎖僅保護臨界區互斥訪問,不能自動解決所有正確性問題。不當的鎖粒度可能導致邏輯上的不一致(如拿到了鎖,但在兩個相關變數更新中途釋放了鎖)。記憶體順序問題即使加了鎖,若對共享資料的讀寫在鎖外進行,依然可能看到過時值。正確使用還需要注意死鎖、活鎖和優先順序反轉。

學習路徑

  1. 入門理論:《作業系統概念》(Silberschatz)中程序與執行緒章節,理解TCB、上下文切換、排程器基本原理。
  2. 程式設計實戰
    • C/POSIX:pthread_create, mutex, condition variable,實現一個簡單的執行緒池。
    • C++:掌握std::thread, std::mutex, std::async, std::atomic, 記憶體序。參考《C++ Concurrency in Action》。
    • Java:java.lang.Thread, Executor架構,synchronized, ReentrantLock, volatile,再進一步學習Loom虛擬執行緒。
  3. 並行效能分析:學習使用perf, VTune Profiler等分析執行緒的上下文切換、快取缺失、鎖競爭。理解false sharing及解決辦法。
  4. 高階主題
    • 無鎖程式設計:CAS、Lock-free佇列,ABA問題,記憶體回收(Hazard Pointers / Epoch Based Reclamation)。
    • Linux核心排程:CFS實現,cgroup CPU share,排程域與負載均衡,preemption。
    • 異構程式設計:CUDA Stream與CPU執行緒的併發模式,NCCL多執行緒通訊。
  5. 語言範式比較:對比Go goroutine、Erlang actor、Rust async/await以及傳統執行緒模型,理解事件驅動與協程的排程機制。

一句話總結

執行緒是併發與並行的原子排程單位,深刻理解其同步機制、排程原理和與硬體拓撲的對映關係,是建置高效能AI訓練系統、低延遲推論服務和高吞吐雲端基礎設施的必備能力。

延伸閱讀與來源

  • 《Operating Systems: Three Easy Pieces》(Arpaci-Dusseau) 中併發章節 —— 提供執行緒、鎖、條件變數、訊號量的經典講解,含模擬實驗。
  • 《Computer Systems: A Programmer’s Perspective》(Bryant & O’Hallaron)第9、12章 —— 深入程序與執行緒的底層實現,以及併發程式設計模型。
  • 《C++ Concurrency in Action (2nd Edition)》(Anthony Williams) —— C++多執行緒與記憶體模型的權威實操指南。
  • POSIX Threads Programming (Blaise Barney, LLNL) —— 簡潔的pthread入門。
  • Linux核心文件:sched-design-CFS、futex、threads相關 Documentation。
  • NVIDIA CUDA C Programming Guide 中 Hardware Implementation 及 Asynchronous Concurrent Execution 章節 —— GPU流與CPU執行緒的互動。
  • Go語言排程器設計文件:《The Go scheduler》 (morsmachine.dk)。

注:由於本次未獲取到即時檢索資料,文中所有具體技術細節均採納公認的計算機系統基礎知識,效能量級採用定性描述或標註標準估計,未繫結特定廠商產品具體代際或未經核實的實測數值。

source: 公開揭露與公開資料整理 本頁僅用於產業鏈學習、資訊檢索和研究輔助;不構成投資建議,不預測漲跌,不提供買賣、部位或目標價建議。
完整概念頁 複盤 13 節結構 公司投研頁 沿產業鏈找到受益公司 投資課 把概念轉成可跟蹤模型