Linux : 多線程【線程概念】

Linux : 多線程【線程概念】

  • (一)線程概念
    • 線程是什么
    • 用戶層的線程
    • linux中PID與LWP的關系
  • (二) 進程地址空間頁表
  • (三) 線程總結
    • 線程的優點
    • 線程的缺點
    • 線程異常
    • 線程用途

(一)線程概念

線程是什么

  • 在一個程序里的一個執行路線就叫做線程(thread)。更準確的定義是:線程是“一個進程內部的控制序列”。
  • 一切進程至少都有一個執行線程。
  • 線程在進程內部運行,本質是在進程地址空間內運行。
  • 在Linux系統中,在CPU眼中,看到的PCB都要比傳統的進程更輕量化。
  • 透過進程虛擬地址空間,可以看到進程的大部分資源,將進程資源合理分配給每個執行流,就形成了線程執行流。
    在這里插入圖片描述

進程是資源分配的基本單位,線程是cpu執行調度的基本單位。一個進程創造不僅只有task_struck(PCB)還有頁表、進程地址空間等等。而一個線程的創建只有task_struct并且沿用進程的地址空間和頁表等,所以線程的創建十分輕量。

  • 一個線程都是當前進程里面的一個執行流
  • 線程在進程內部運行,本質就是線程在進程地址空間內運行,也就是說曾經這個進程申請的所有資源,幾乎都是被所有線程共享的。

cpu是通過task_struct來執行調度,而一個進程中是可以有多個線程即執行流的,所以線程的執行粒度是比進程細(即線程是執行進程的一部分代碼)


用戶層的線程

進程和線程是如此的相似,那么究竟是如何創建線程的呢??

實際上在Linux中沒有真正意義的線程,那么也就絕對沒有真正意義上的線程相關的系統調用

想要用好線程就必須要對線程做管理,進程已經有一套進程的管理模式了,而描述線程的控制塊和描述進程的控制塊是類似的,那么再對線程做一套管理算法等等就十分繁瑣,因此Linux并沒有重新為線程設計數據結構,而是直接復用了進程控制塊,所以我們說Linux中的所有執行流都叫做輕量級進程
(在windows系統中真正實現了線程,因此Windows操作系統系統的實現邏輯一定比Linux操作系統的實現邏輯要復雜得多。)
在這里插入圖片描述

在linux操作系統沒有線程的概念,但是我們用戶卻需要一個真正的線程的概念,所以原生線程庫pthread由此誕生。原生線程庫實際就是對輕量級進程的系統調用進行了封裝,在用戶層模擬實現了一套線程相關的接口。因此對于我們來講,在Linux下學習線程實際上就是學習在用戶層模擬實現的這一套接口,而并非操作系統的接口。


linux中PID與LWP的關系

進程是由操作系統將程序運行所需地址空間、映射關系、代碼和數據打包后的資源包,而 線程/輕量級線程/執行流 則是利用資源完成任務的基本單位

  • 進程是承擔系統資源分配的實體
  • 線程是 CPU 運行的基本單位

實際上 進程 = 線程 + 虛擬地址空間 + 映射關系 + 代碼和數據,這才是一個完整的概念

使用 ps -aL指令查看所有的線程
在這里插入圖片描述
LWP就是我們的輕量級進程也就是線程,每一個線程都有自己的LWP號,而線程組成線程組,我們用pid來描述這個線程組,也就是我們常說的一個進程的pid。

(二) 進程地址空間頁表

在 32 位系統中,存在 2^32 個地址(一個內存單元大小是 1byte),意味著虛擬地址空間 的大小為 4GB。

通常將這32位分為 10、10、12

  • 第一個10: 虛擬地址中的前 10 個比特位,用于尋址 二級頁表
  • 第二個10:虛擬地址中間的 10 個比特位,用于尋找 頁框起始地址
  • 第三個12:虛擬地址中的后 12 個比特位,用于定位 具體地址(偏移量)
    在這里插入圖片描述
  1. 選擇虛擬地址的前10個比特位在頁目錄當中進行查找,找到對應的二級頁表。
  2. 再選擇虛擬地址的10個比特位在對應的頁表當中進行查找,找到物理內存中對應頁框的起始地址(一個頁框4KB)。
  3. 最后將虛擬地址中剩下的12個比特位作為偏移量從對應頁框的起始地址處向后進行偏移,找到物理內存中某一個對應的字節數據。

說明:

  • 物理內存實際是被劃分成一個個4KB大小的頁框的,而磁盤上的程序也是被劃分成一個個4KB大小的頁幀的,當內存和磁盤進行數據交換時也就是以4KB大小為單位進行加載和保存的。
  • 4KB實際上就是2的12次方個字節,也就是說一個頁框中有2的12次方個字節,而訪問內存的基本大小是1字節,因此一個頁框中就有2的12次方個地址,于是我們就可以將剩下的12個比特位作為偏移量,從頁框的起始地址處開始向后進行偏移,從而找到物理內存中某一個對應字節數據。

上面所說的所有映射過程,都是由**MMU(MemoryManagementUnit)**這個硬件完成的,該硬件是集成在CPU內的。頁表是一種軟件映射,MMU是一種硬件映射,所以計算機進行虛擬地址到物理地址的轉化采用的是軟硬件結合的方式。
注意:32位計算機下是二級頁表,64位平臺下用的是多級頁表。

當引發異常操作時,操作系統能在 查頁表 階段就進行攔截,而不是等到真正影響到 物理內存 時才報錯.
在這里插入圖片描述
頁表是有權限的,所以當我們在進行修改一個常量字符串的時候,虛擬地址必須經過頁表映射找到對應的物理內存,但在頁表開始對應的時候發現其權限是只讀此時你要對其進行修改就會在MMU內部觸發硬件錯誤,操作系統在識別到是哪一個進程導致的之后,就會給該進程發送信號對其進行終止。

(三) 線程總結

線程的優點

  • 創建一個新線程的代價要比創建一個新進程小得多
  • 與進程之間的切換相比,線程之間的切換需要操作系統做的工作要少很多
  • 線程占用的資源要比進程少很多
  • 能充分利用多處理器的可并行數量
  • 在等待慢速I/O操作結束的同時,程序可執行其他的計算任務
  • 計算密集型應用,為了能在多處理器系統上運行,將計算分解到多個線程中實現
  • I/O密集型應用,為了提高性能,將I/O操作重疊。線程可以同時等待不同的I/O操作。

注釋:

計算密集型:執行流的大部分任務,主要以計算為主。比如加密解密、大數據查找等。
IO密集型:執行流的大部分任務,主要以IO為主。比如刷磁盤、訪問數據庫、訪問網絡等。

線程的缺點

  • 性能損失:一個很少被外部事件阻塞的計算密集型線程往往無法與共它線程共享同一個處理器。如果計算密集型線程的數量比可用的處理器多,那么可能會有較大的性能損失,這里的性能損失指的是增加了額外的同步和調度開銷,而可用的資源不變。
  • 健壯性降低:編寫多線程需要更全面更深入的考慮,在一個多線程程序里,因時間分配上的細微偏差或者因共享了不該共享的變量而造成不良影響的可能性是很大的,換句話說線程之間是缺乏保護的。
  • 缺乏訪問控制:
    進程是訪問控制的基本粒度,在一個線程中調用某些OS函數會對整個進程造成影響。
  • 編程難度提高:
    編寫與調試一個多線程程序比單線程程序困難得多。

線程異常

  • 單個線程如果出現除零,野指針問題導致線程崩潰,進程也會隨著崩潰
  • 線程是進程的執行分支,線程出異常,就類似進程出異常,進而觸發信號機制,終止進程,進程終止,該進程內的所有線程也就隨即退出

線程用途

  • 合理的使用多線程,能提高CPU密集型程序的執行效率
  • 合理的使用多線程,能提高IO密集型程序的用戶體驗(如生活中我們一邊寫代碼一邊下載開發工具,就是多線程運行的一種表現)

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

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

相關文章

IDEA轉戰TREA AI IDE : springboot+maven+vue項目配置

一、trea下載安裝 Trae官方網址: https://www.trae.com.cn/ Trae官方文檔:https://docs.trae.com.cn/docs/what-is-trae?_langzh w3cschool: https://www.w3cschool.cn/traedocs/ai-settings.html 安裝這里省略,正常安裝即可。…

Java--圖書管理系統(簡易版)

目錄 目錄 前言 🔔1.library包 1.1 Book類 1.2 BookList類 🔔2.user包 2.1User類(父類) 2.2Admin(管理員) 2.3 NormalUser(普通用戶) 🔔3.Operation包 🕐3.1 IOperation接口 🕑3.2ListOperation(查看操作)…

深入淺出:Spring Boot 中 RestTemplate 的完整使用指南

在分布式系統開發中,服務間通信是常見需求。作為 Spring 框架的重要組件,RestTemplate 為開發者提供了簡潔優雅的 HTTP 客戶端解決方案。本文將從零開始講解 RestTemplate 的核心用法,并附贈真實地圖 API 對接案例。 一、環境準備 在 Spring…

大數據處理利器:Hadoop 入門指南

一、Hadoop 是什么?—— 分布式計算的基石 在大數據時代,處理海量數據需要強大的技術支撐,Hadoop 應運而生。Apache Hadoop 是一個開源的分布式計算框架,致力于為大規模數據集提供可靠、可擴展的分布式處理能力。其核心設計理念是…

685SJBH計量管理系統

摘 要 計量,在我國已有五千年的歷史。計量的發展與社會進步聯系在一起,它是人類文明的重要組成部分。它的發展經歷了古典階段、經典階段和現代階段。而企業的計量管理是對測量數據、測量過程和測量設備的管理。 本系統通過分析現有計量系統的業務邏輯…

從0到1構建前端監控系統:錯誤捕獲、性能采集、用戶體驗全鏈路追蹤實戰指南SDK實現

目錄 前言為什么要做前端監控前端監控目標穩定性用戶體驗業務 前端監控流程常見埋點方案代碼埋點可視化埋點無痕埋點 創建項目第一步、創建monitor文件,cmd進入文件進行npm init -y 項目初始化第二步、創建src/index.js和src/index.html文件第三步、創建webpack.con…

前端瀏覽器判斷設備類型的方法

前端瀏覽器判斷設備類型的方法 在前端開發中,判斷設備類型(如手機、平板、桌面電腦)有多種方法,以下是常用的幾種方式: 1. 使用 User Agent 檢測 通過 navigator.userAgent 獲取用戶代理字符串進行判斷:…

MNIST 手寫數字分類

轉自我的個人博客: https://shar-pen.github.io/2025/05/04/torch-distributed-series/1.MNIST/ 基礎的單卡訓練 本筆記本演示了訓練一個卷積神經網絡(CNN)來對 MNIST 數據集中的手寫數字進行分類的過程。工作流程包括: 數據準備&#xff…

數據庫中的 Segment、Extent、Page、Row 詳解

在關系型數據庫的底層存儲架構中,數據并不是隨意寫入磁盤,而是按照一定的結構分層管理的。理解這些存儲單位對于優化數據庫性能、理解 SQL 執行過程以及排查性能問題都具有重要意義。 我將從宏觀到微觀,依次介紹數據庫存儲中的四個核心概念&…

DAMA車輪圖

DAMA車輪圖是國際數據管理協會(DAMA International)提出的數據管理知識體系(DMBOK)的圖形化表示,它以車輪(同心圓)的形式展示了數據管理的核心領域及其相互關系。以下是基于用戶提供的關鍵詞對D…

《QDebug 2025年4月》

一、Qt Widgets 問題交流 1. 二、Qt Quick 問題交流 1.QML單例動態創建的對象,訪問外部id提示undefined 先定義一個窗口組件,打印外部的id: // MyWindow.qml import QtQuick 2.15 import QtQuick.Window 2.15Window {id: controlwidth: …

JS | 正則 · 常用正則表達式速查表

以下是前端開發中常用的正則表達式速查表,包含驗證規則、用途說明與示例: 📌 常用正則表達式速查表 名稱正則表達式描述 / 用途示例手機號/^1[3-9]\d{9}$/中國大陸手機號13812345678 ?座機號/^0\d{2,3}-?\d{7,8}$/固定電話010-12345678 ?…

系統思考:個人與團隊成長

四年前,我交付的系統思考項目,今天學員的反饋依然深深觸動了我。 我常常感嘆,系統思考不僅僅是一場培訓,更像是一場持續的“修煉”。在這條修煉之路上,最珍貴的,便是有志同道合的伙伴們一路同行&#xff0…

寫屏障和讀屏障的區別是什么?

寫屏障(Write Barrier)與讀屏障(Read Barrier)的區別 在計算機科學中,寫屏障和讀屏障是兩種關鍵的內存同步機制,主要用于解決并發編程中的可見性、有序性問題,或在垃圾回收(GC&…

ssh -T git@github.com 測試失敗解決方案:修改hosts文件

問題描述 通過SSH方式測試,使用該方法測試連接可能會遇到連接超時、端口占用的情況,原因是因為DNS配置及其解析的問題 ssh -T gitgithub.com我們可以詳細看看建立 ssh 連接的過程中發生了什么,可以使用 ssh -v命令,-v表示 verbo…

大疆無人機搭載樹莓派進行目標旋轉檢測

環境部署 首先是環境創建,創建虛擬環境,名字叫 pengxiang python -m venv pengxiang隨后激活環境 source pengxiang/bin/activate接下來便是依賴包安裝過程了: pip install onnxruntime #推理框架 pip install fastapi uvicorn[standard] #網絡請求…

00 Ansible簡介和安裝

1. Ansible概述與基本概念 1.1. 什么是Ansible? Ansible 是一款用 Python 編寫的開源 IT 自動化工具,主要用于配置管理、軟件部署及高級工作流編排。它能夠簡化應用程序部署、系統更新等操作,并且支持自動化管理大規模的計算機系統。Ansibl…

Linxu實驗五——NFS服務器

一.NFS服務器介紹 NFS服務器(Network File System)是一種基于網絡的分布式文件系統協議,允許不同操作系統的主機通過網絡共享文件和目錄3。其核心作用在于實現跨平臺的資源透明訪問,例如在Linux和Unix系統之間共享靜態數據&#…

『 測試 』測試基礎

文章目錄 1. 調試與測試的區別2. 開發過程中的需求3. 開發模型3.1 軟件的生命周期3.2 瀑布模型3.2.1 瀑布模型的特點/缺點 3.3 螺旋模型3.3.1 螺旋模型的特點/缺點 3.4 增量模型與迭代模型3.5 敏捷模型3.5.1 Scrum模型3.5.2 敏捷模型中的測試 4 測試模型4.1 V模型4.2 W模型(雙V…