操作系統: 線程(Thread)

目錄

什么是線程(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 倍。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/92578.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/92578.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/92578.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Uber的MySQL實踐(一)——學習筆記

MySQL 是Uber數據基礎設施的核心支柱,支撐著平臺上大量關鍵操作。Uber 擁有一套龐大的 MySQL 集群,如何構建一個控制平面來管理如此大規模的 MySQL 集群,并同時確保零宕機、零數據丟失是一個十分有挑戰性的問題。下面重點介紹 Uber 的 MySQL …

騰訊云EdgeOne產品深度分析報告

一、產品概述騰訊云EdgeOne是騰訊云推出的新一代邊緣安全加速平臺,集成內容分發網絡(CDN)、Web應用防火墻(WAF)、DDoS防護、Bot管理、API安全及邊緣計算能力,致力于為企業提供一站式安全加速解決方案。該平…

Spring Boot 優雅配置InfluxDB3客戶端指南:@Configuration + @Bean + yml實戰

前言 想用Java玩轉InfluxDB 3?要是還靠寫main函數硬編碼配置,那就像穿著睡衣開正式會議,實在有點不靠譜。現代Spring開發套路講究配置和代碼分離,講究優雅和靈活。用@Configuration配合@Bean注解,再加上yml配置文件集中管理連接信息,簡直是為代碼打扮一身西裝,既整潔又…

記錄:rk3568適配開源GPU驅動(panfrost)

rk3568采用的GPU是Mali-G52,該型號的GPU已在5.10內核的panfrost驅動中被支持。下面記錄下移植過程。 1.內核dts修改: kernel 5.10: arch/arm64/boot/dts/rockchip/rk3568.dtsigpu: gpufde60000 {compatible "rockchip,rk3568-mali", "ar…

SMBIOS詳解:系統管理BIOS的工作原理與實現

1. SMBIOS概述 SMBIOS(System Management BIOS)是由DMTF(分布式管理任務組)制定的行業標準,旨在為計算機系統提供統一的硬件信息描述框架。它定義了計算機硬件組件(如處理器、內存、主板等)的標…

8.5 CSS3多列布局

多列布局 CSS3之多列布局columns CSS3中新出現的多列布局(multi-column)是傳統HTML網頁中塊狀布局模式的有力擴充。這種新語法能夠讓WEB開發人員輕松的讓文本呈現多列顯示。 設置列寬 column-width: | auto 設置對象的寬度;使用像素表示。 auto&#…

Chrome插件快速上手

目錄 前言 一、瀏覽器插件的主要功能 二、插件的工作原理 插件結構 manifest.json icons background.js content-scripts 三、插件例子 popup popup.html popup.js styles.css background.js content-script.js manifest.json 四、其它 前言 本文不做特殊說明…

moment和dayjs

一:moment和dayjs 區別moment 大且可變、維護模式;dayjs 小且不可變、插件化、tree?shaking 友好。antd v4 用 moment;antd v5 用 dayjs。請在同一項目中統一其一,避免混用導致組件報錯。二: antd 4.24.16&#xff08…

Flutter Packge - 組件應用

一、組件創建1. 在工程根目錄創建 packages 目錄。mkdir packages #創建文件夾 cd packages 2. 創建純 Dart Package(適合工具類/UI組件)。flutter create --templatepackage common_network二、組件配置1. 在 common_network 的 pubspec.yaml 中添加…

基于雙塊輕量級神經網絡的無人機拍攝的風力渦輪機圖像去霧方法

基于雙塊輕量級神經網絡的無人機拍攝的風力渦輪機圖像去霧方法 UAV-Taken Wind Turbine Image Dehazing With a Double-Patch Lightweight Neural Network 我是菜雞!我是菜雞!我是菜雞! 如果老師及學姐學長對該文有任何意見,請…

Spring AI Alibaba 項目接入阿里云百煉平臺大模型

1 依賴jdk 21 springboot 3.4.5 spring-ai-alibaba-starter-dashscope 1.0.0.2<properties><java.version>21</java.version><spring-ai.version>1.0.0</spring-ai.version><spring-ai-alibaba.version>1.0.0.2</spring-ai-alibaba.v…

電腦和手機訪問網站,自動檢測跳轉不同網站

自動檢測跳轉不同網站 自動檢測設備手機或電腦來跳轉不同網頁 開箱即用&#xff0c;不過需要自己修改一下跳轉鏈接 源碼截圖&#xff1a; 下載地址&#xff1a;電腦和手機訪問網站&#xff0c;自動檢測跳轉不同網站.zip - 藍奏云

Spring Boot 集成 ShardingSphere 實現讀寫分離實踐

Spring Boot 集成 ShardingSphere 實現讀寫分離實踐 在高并發的業務場景中,數據庫往往是系統性能的瓶頸。為了提高系統的吞吐量和穩定性,讀寫分離是一種常見的優化方案。本文將詳細介紹如何使用 Spring Boot 結合 ShardingSphere 實現數據庫的讀寫分離,并提供完整的配置和實…

以rabbitmq為例演示podman導出導入鏡像文件

1. 導出鏡像為 tar 文件 將鏡像保存為壓縮包&#xff08;默認格式為 docker-archive&#xff09;&#xff1a; podman save -o rabbitmq_management.tar docker.io/rabbitmq:management-o&#xff1a;指定輸出文件名&#xff08;如 rabbitmq_management.tar&#xff09;。鏡像名…

LIS(最長上升子序列)與LCS(最長公共子序列)

最長上升子序列定義&#xff1a;給出一個數字序列&#xff08;arr&#xff09;&#xff0c;求出其中長度最長的數值嚴格遞增的子序列做法一&#xff1a;使用動態規劃&#xff0c;我們定義dp[i]為以arr[i]結尾的最長上升子序列的長度。#include<bits/stdc.h> using namesp…

javaSE(基礎):5.抽象類和接口

抽象類一.理解抽象類思維&#xff1a;假如我想定義一個Shape&#xff08;圖形類&#xff09;類&#xff0c;我在這個類中寫了一個draw()方法&#xff0c;但是這個方法是不能用來描述圖形形狀的&#xff08;不能有方法體&#xff09;&#xff0c;因為我只要對他進行了準確描述&a…

ESG評級可持續發展之路,ESG評級的好處

在商業文明的演進歷程中&#xff0c;ESG評級正成為衡量企業價值的全新坐標系。這套融合環境&#xff08;Environmental&#xff09;、社會&#xff08;Social&#xff09;和治理&#xff08;Governance&#xff09;三大維度的評估體系&#xff0c;猶如一盞明燈&#xff0c;指引…

camera人臉識別問題之二:【FFD】太陽逆光場景,人像模式后置打開美顏和濾鏡,關閉heif拍攝格式對著人臉拍照,成像口紅出現位置錯誤

【關注我&#xff0c;后續持續新增專題博文&#xff0c;謝謝&#xff01;&#xff01;&#xff01;】 上一篇我們講了&#xff1a; 這一篇我們開始講&#xff1a; camera人臉識別問題之二&#xff1a;【FFD】太陽逆光場景&#xff0c;人像模式后置打開美顏和濾鏡&#xff0c;關…

YOLO-Count:用于文本到圖像生成的可微分目標計數

摘要 https://arxiv.org/pdf/2508.00728v1 我們提出了YOLO-Count&#xff0c;一種可微分的開放詞匯目標計數模型&#xff0c;旨在解決通用計數挑戰并實現文本到圖像(T2I)生成的精確數量控制。核心貢獻是"基數"圖(cardinality map)&#xff0c;這是一種新穎的回歸目標…

Go 的錯誤處理方式深度解析—— error vs panic vs recover:機制原理與實戰取舍

一、Go 的錯誤處理哲學Go 的設計哲學鼓勵明確的、顯式的錯誤處理方式。它不像 Java 或 Python 使用異常機制&#xff0c;而是采用了返回值 error 的方式&#xff0c;讓錯誤成為程序流程的一部分。Go 的錯誤處理核心理念是&#xff1a; 錯誤是值&#xff08;Errors are values&a…