Linux(線程概念)

目錄

一 虛擬地址到物理地址的轉換

1. 操作系統如何管理物理內存:

2. 下面來談談虛擬地址如何轉換到物理地址:

3. 補充字段:

二 Linux中的線程

1. 先來說說進程:

2. 線程:

3. 線程相比較于進程的優缺點:

4. 線程獨有的字段:

5. pthread庫:


一 虛擬地址到物理地址的轉換

1. 操作系統如何管理物理內存:

假設物理內存是4GB,管理物理內存基本單位是1字節嗎?不是,一般是以4KB為一個基本單位,稱為頁框(頁楨),正好操作系統與磁盤交互也是以4KB為基本單位,即讀取8個扇區,既然4KB為單位,4GB有很多個4KB,勢必也要進行管理吧,這里簡單一點當成數組進行管理,實際是伙伴系統/slab....機制。

4GB / 4KB = 1,039,386個4KB,忽略其他字段:頁框的使用情況...等。

也就是說數組大小為100w,假設地址從 0 ~ 4GB 編制,第0~1023字節,也就是對應的第0號下標,1024?~ 2*4KB,對應第二個下標,取模,余數丟掉,所以只要拿著任意的地址都能索引到這個數組的任意下標,反向也能轉回到頁框的起始地址,當然,這個數組肯定也要在內存中開辟空間,100w * 4 = 400w 字節 -> 4k,每個下標存放頁框的起始地址,這個不考慮。

2. 下面來談談虛擬地址如何轉換到物理地址:

32位平臺下:

虛擬地址主要是通過頁表轉換到物理地址,虛擬地址是 0 ~ 4G,如果按一對一進行映射,頁表存放虛擬地址和物理地址的指針,一共4G,也就是4G * 8 = 32G的內存大小,顯然是不現實的。

上面是把虛擬地址整體使用了,下面來看看另一個方案。

指針大小也就是 0 ~ 2^32次方,那能不能從這個虛擬地址的bit位入手?

實際上不僅僅只有一個頁表,會有一個頁目錄,和頁表。

頁目錄:存放指針高位前10bit位,也就是 2^10次方,1024,頁目錄一共1024個項,里面每一項存放的是頁表的起始地址。

頁表:頁目錄能索引到頁表,頁表大小是多少呢?也是1024項,取指針中間的10個bit位,每一項存放的是頁框的起始地址,所以頁表主要是用來建立頁框的起始地址,也就是映射。

還有12bit位干嘛的?

頁框是4KB,2^12次方剛好也是4KB,所以后面剩余的12bit是用來在頁框中偏移的,頁表以及存放的是頁框的起始地址了,在進行頁內偏移,最終拿到頁框中某一個字節。

所以上述方案是利用了指針大小的bit位來進行轉換劃分的,而不是當整塊使用暴力映射。

不同的進程虛擬地址完全一樣,索引路徑也一樣,但最終頁表存放的物理地址不一樣,也側面證明了進程是相互獨立的,父子進程除外。

最后再來算一算頁表和頁目錄占用內存的大小:

頁目錄:1024項 + 存放頁表的地址:1024 * 4 = 4KB

頁表:1024個頁目錄 + 每個頁目錄對應的頁表也是1024項 + 頁表每一項和物理地址的映射也就是存放頁框的起始地址 = 1024 * 1024 * 4 = 4M

最終占總大小:4M + 4KB,這是最壞的情況,所有的虛擬地址全用上了,實際可能只會用一點點。

3. 補充字段:

1. 誰拿頁表進行尋址呢?

OS?不是,CPU內部集成了一個硬件MMU,作用是用來進行頁表轉換的,怎么拿到頁表?CPU內又有一個寄存器CR3,記錄頁表的起始地址在交給MMU,自此從MMU出來的就是實際的物理地址。

2. 如果在程序某個地方打了個死循環,MMU每次都要查相同的虛擬地址,是不是沒必要啊?所以在CPU內部還有個寄存器TLB,主要用來緩存MMU之前查過的虛擬地址,以便后續省了查表的過程,變相提高了虛擬到物理的轉換了。

3. 頁表下標存放頁框的地址,也就是指針4字節整數(2^32),直接用來索引頁框嗎?上面說的頁框有100w個,2^20次方就是100w,剩下的12位浪費了嗎?不是,頁表不僅僅只有映射,還有比如該地址對應的對象的讀寫權限位,用戶/內核態標記等字段,所以也就利用了這些剩余的bit位來標記比如虛擬地址是否合法,是否命中物理內存(否則缺頁中斷)等標記位。

二 Linux中的線程

1. 先來說說進程:

當創建一個進程,加載可執行文件代碼和數據,創建內核數據結構:PCB,mm_struct,文件描述符表....等對象,都需要在內存中申請空間,被CPU調度,切換保護進程上下文數據,重新填充pc指針,MMU,TLB,CR3,等一系列的寄存器,每個進程新創建/被切換,帶來的開銷勢必是很大的,這也就是為什么進程是資源分配的基本單位,要什么資源直接給進程分配物理內存。

2. 線程:

上面說的進程,不管是創建,調度等策略,線程是否也需要構建和進程一樣的策略呢?如果采用,編碼方面肯定復雜,其次比如調度和進程不一樣,CPU是不是還要識別是進程還是線程?

所以在Linux中,線程沒有單獨制定個進程類似的策略,直接共享進程大部分屬性,比如:調度算法,CPU一視同仁,不過線程也要有自己的一些其他字段。

既然線程能共享進程內的大部分資源,那么如何理解線程是CPU調度的基本單位?

進程也能被調度,線程也能:

進程調度,當時間片到了切換到下一個進程時,保存上下文更新,CR2指向的頁表,TLB緩存內容,全部都失效重新加載新的進程,重新進行TLB緩存預熱。

不僅僅是TLB緩存虛擬地址和物理地址的映射,CPU內部還有cache緩存,緩存代碼塊和數據,比如:訪問第10行代碼,把第10行代碼周邊的數據按4KB為基本單位緩存到cache緩存中,下次也能直接讀取,不用間接尋址,遵循局部性原理規則,雖然不一定訪問到,但極大概率訪問到。

最重要的就是TLB,cache緩存,TLB存放高頻訪問的虛擬地址直接失效,cache緩存存放高頻的數據塊和代碼塊,進程會更新導致失效并重新進行尋址加載,而線程共享這些屬性,無需更改,直接查,效率要高得多。

在Linux中沒有真正的線程,只有輕量級進程(LWP),不管是單進程里面的一個執行流,也是輕量級進程,創建多個線程也是輕量級進程,而輕量級進程就是模擬進程的策略而誕生出來的。

3. 線程相比較于進程的優缺點:

優點:

  • 線程占用的資源比進程少,共享進程大部分資源,進程需要重新分配資源
  • 線程創建成本小,共享進程大部分資源
  • 線程共享進程虛擬地址空間,切換無需更改,進程則需要
  • 進程切換會更新TLB快表,cache緩存,導致熱數據直接失效,重新訪問內存填充
  • 線程共享數據容易,進程需要通信機制:fork(),管道,system v,posix通信機制提供的系統調用

缺點:

  • 線程共享大部分資源,會導致資源競爭導致數據不一致,靜態條件等問題
  • 線程創建越多不會導致效率更高,主要以CPU的個數 * CPU的核心數來創建線程對象
  • 進程獨立不會影響另一個進程,某一個線程異常,其他同級線程也會異常,線程異常代表進程異常,因為線程共享進程大部分屬性,OS直接把這個線程有關聯的數據全部釋放,其他線程也就沒意義了
4. 線程獨有的字段:

線程ID:多個線程也要有ID區分輕量級進程,總不能這些線程沒有編號吧

優先級:調度優先級肯定也會不一樣,如果一樣先調度誰?

棧:線程執行函數,調用函數就會建立棧幀,如果共享,線程是并發執行的,入棧,彈棧順? ? ? ? ?序就亂了

寄存器:不同的線程被切換也要將該線程當前的上下文數據保存起來,下次進行恢復

信號block表:線程共享handler表,block可以自行屏蔽,比如給進程發信號,所有的線程都要執行這個信號,某個線程可以單獨屏蔽他不執行。

5. pthread庫:

上面說Linux中沒有真正的線程,只有LWP,即輕量級進程,所以為了保證操作系統學科的線程的概念,向上封裝了一層軟件層,pthread庫,也就是對輕量級進程接口進行了封裝,屬于第三方庫,使用必須 -lpthread 指定庫名,具體pthread庫如何管理這些線程,請看下章。

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

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

相關文章

阿里云為何,一個郵箱綁定了兩個賬號

阿里云“幽靈賬號”之謎:同一個郵箱注銷后仍有兩個賬號?深度揭秘成因與終極解決方案! 你是否曾在阿里云上使用同一個郵箱注冊過多個賬號,明明已經**“徹底”注銷了其中一個**,卻驚愕地發現系統里依然**“幽靈般”掛著…

動態規劃-數位DP

今天開始做關于數位DP的問題,首先對于數位DP來說,這類問題難度較大,比較難理解,所以博主也會盡量講的更加詳細一些,來幫助大家更好地理解這里的相關知識。 前置知識: 1.首先對于數位DP來說,主…

總覽四級考試

別被“四級”這個龐然大物嚇到!我們一起拆解它:?? 📍 ??核心認知:四級是一場策略性考試!?? 它不考智商,考的是??基礎英語能力 考試技巧 時間管理??。基礎可以通過努力補,技巧可以…

BSRR對比BRR對比ODR

? 三種操作方式的本質區別 寄存器功能原子操作特點BSRR同時支持置位(1)和復位(0)?? 是單指令完成任意位操作,無競爭風險ODR直接讀寫輸出狀態? 否需"讀-改-寫",多線程/中斷中需關中斷保護BRR只能復位(0)?? 是僅清零功能,無置…

職坐標精選嵌入式AI物聯網開源項目

隨著嵌入式、AI與物聯網技術的深度融合,開源生態已成為開發者構建智能硬件解決方案的核心驅動力。本文將從嵌入式實時操作系統、多模態AI數據集及物聯網接入平臺三大維度切入,系統性梳理技術選型要點與實踐路徑。在嵌入式領域,重點解析低功耗…

Ubuntu系統 | 本地部署ollama+deepseek

1、Ollama介紹 Ollama是由Llama開發團隊推出的開源項目,旨在為用戶提供高效、靈活的本地化大型語言模型(LLM)運行環境。作為Llama系列模型的重要配套工具,Ollama解決了傳統云服務對計算資源和網絡連接的依賴問題,讓用戶能夠在個人電腦或私有服務器上部署和運行如Llama 3等…

【數據庫】關系數據庫標準語言-SQL(金倉)下

4、數據查詢 語法&#xff1a; SELECT [ALL | DISTINCT] <目標列表達式> [,<目標列表達式>] … FROM <表名或視圖名>[, <表名或視圖名> ] … [ WHERE <條件表達式> ] [ GROUP BY <列名1> [ HAVING <條件表達式> ] ] [ ORDER BY <…

基于YOLO-NAS-Pose的無人機象群姿態估計:群體行為分析的突破

【導讀】 應對氣候變化對非洲象的生存威脅&#xff0c;本研究創新采用無人機航拍結合AI姿態分析技術&#xff0c;突破傳統觀測局限。團隊在肯尼亞桑布魯保護區對比測試DeepLabCut與YOLO-NAS-Pose兩種模型&#xff0c;首次將后者引入野生動物研究。通過檢測象群頭部、脊柱等關鍵…

8.RV1126-OPENCV 視頻中添加LOGO

一.視頻中添加 LOGO 圖像大體流程 首先初始化VI,VENC模塊并使能&#xff0c;然后創建兩個線程&#xff1a;1.把LOGO灰度化&#xff0c;然后獲取VI原始數據&#xff0c;其次把VI數據Mat化并創建一個感興趣區域&#xff0c;最后把LOGO放感興趣區域里并把數據發送給VENC。2.專門獲…

AI+3D 視覺重塑塑料袋拆垛新范式:遷移科技解鎖工業自動化新高度

在工業自動化浪潮席卷全球的當下&#xff0c;倉儲物流環節的效率與精準度成為企業降本增效的關鍵戰場。其中&#xff0c;塑料袋拆垛作為高頻、高重復性的作業場景&#xff0c;傳統人工或機械臂操作面臨著諸多挑戰。遷移科技&#xff0c;作為行業領先的 3D 工業相機和 3D 視覺系…

MATLAB實戰:視覺伺服控制實現方案

以下是一個基于MATLAB的視覺伺服控制項目實現方案&#xff0c;結合實時圖像處理、目標跟蹤和控制系統設計。我們將使用模擬環境進行演示&#xff0c;但代碼結構可直接應用于真實硬件。 系統架構 圖像采集 → 目標檢測 → 誤差計算 → PID控制器 → 執行器控制 完整代碼實現 …

RequestRateLimiterGatewayFilterFactory

一、功能說明 RequestRateLimiterGatewayFilterFactory 是 Spring Cloud Gateway 的流量控制組件&#xff0c;用于實現 API 請求速率限制&#xff0c;核心功能包括&#xff1a; 限制單位時間內的請求數量&#xff08;如每秒10次&#xff09;防止服務被突發流量擊垮&#xff0…

鴻蒙倉頡語言開發實戰教程:購物車頁面

大家上午好&#xff0c;倉頡語言商城應用的開發進程已經過半&#xff0c;不知道大家通過這一系列的教程對倉頡開發是否有了進一步的了解。今天要分享的購物車頁面&#xff1a; 看到這個頁面&#xff0c;我們首先要對它簡單的分析一下。這個頁面一共分為三部分&#xff0c;分別是…

AXURE安裝+漢化-Windows

安裝網站&#xff1a;https://www.axure.com/release-history/rp9 Axure中文漢化包下載地址 鏈接:https://pan.baidu.com/s/1U62Azk8lkRPBqWAcrJMFew?pwd5418 提取碼:5418 下載完成之后&#xff0c;crtlc lang文件夾 到下載的Axure路徑下 雙擊點進這個目錄里面。ctrlv把lan…

【Oracle】視圖

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;Oracle 文章目錄 1. 視圖基礎概述1.1 視圖的概念與特點1.2 視圖的工作原理1.3 視圖的分類 2. 簡單視圖2.1 創建簡單視圖2.1.1 基本簡單視圖2.1.2 帶計算列的簡單視圖 2.2 簡單視圖的DML操作2.2.1 通過視圖進行INSERT操作2.2.2 通…

Lua和JS的垃圾回收機制

Lua 和 JavaScript 都采用了 自動垃圾回收機制&#xff08;GC&#xff09; 來管理內存&#xff0c;開發者無需手動釋放內存&#xff0c;但它們的 實現機制和行為策略不同。下面我們從原理、策略、優缺點等方面來詳細對比&#xff1a; &#x1f536; 1. 基本原理對比 特性LuaJa…

Kafka 的優勢是什么?

Kafka 作為分布式流處理平臺的核心組件&#xff0c;其設計哲學圍繞高吞吐、低延遲、高可擴展性展開&#xff0c;在實時數據管道和大數據生態中具有不可替代的地位。 一、超高吞吐量與低延遲 1. 磁盤順序 I/O 優化 突破磁盤瓶頸&#xff1a;Kafka 將消息持久化到磁盤&#xff…

車載診斷架構 --- DTC消抖參數(Trip Counter DTCConfirmLimit )

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

【C++】類的析構函數

類的析構函數 1. 作用&#xff1a;1.1 當對象的地址空間釋放的時候&#xff0c;會自動調用析構函數(對象可以主動調用析構函數)1.2 實際應用&#xff1a;往往用來做收尾工作 2. 語法規則&#xff1a;示例代碼&#xff1a;析構函數使用 1. 作用&#xff1a; 1.1 當對象的地址空…

重拾Scrapy框架

基于Scrapy框架實現 舔狗語錄百度翻譯 輸出結果到txt文檔 爬蟲腳本 from typing import Iterable, Any, AsyncIteratorimport scrapy import json from post.items import PostItemclass BaidufanyiSpider(scrapy.Spider):name "baidufanyi"allowed_domains [&quo…