【Linux線程篇】探索Linux多線程:并行編程的入門指南

W...Y的主頁 😊

代碼倉庫分享💕?

?Linux線程概念

什么是線程

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

在Linux系統下,線程與進程的最終目的都是一樣的,都是想要讓程序并發執行,所以我們可以將代碼進行分塊執行,所以就要創建自己的tcb結構體來維護自己的上下文、優先級等等。但是Linux設計者認為pcb與tcb具有極度的相似性沒必要設計單獨設計數據結構和算法,直接復用既可,所以Linux中的線程也被稱為“輕量化進程”!!!

所以進程是一個或多個執行流加頁表加地址空間加代碼和數據。進程在內核角度為承擔分配系統資源的實體!!!

那多個執行流是怎么劃分代碼呢?
我們經常說申請內存和釋放內存,所以我們應該對內存做管理,其實物理內存也會被劃分為4kb(大部分劃分規則)的數據塊,而磁盤中的數據塊也是4kb的,他們被我們稱為頁框或頁幀。當我們內存與數據塊的交互時就是以數據塊為單位的交互。操作系統要管理內存,肯定要先描述再組織,所以內存有屬于自己的結構體struct page,其結構體的內容也應該是記錄一個數據塊的狀態,使用者是誰,是否被使用,是否可以交換等等。假如我們物理內存為4GB,其就有1048576個4kb數據塊,我們就可以創建一個是結構體數組進行存儲結構體內容。

其源碼一部分:

所以我們的頁表也不可能是所謂的kv關系,因為kv分別代表一個指針,再加上其對應權限可能有10個字節,但是如果是一一對應的關系其頁表可能會有40GB大小,所以頁表是怎么映射的呢?虛擬地址是32位二進制,劃分為三個部分10位10位12位,其第一個10位被稱為頁目錄,需要創建2^10個格子,第二個10位被稱為頁表,頁目錄保存的是二級頁表的地址,所以頁表應該有1024個,每個頁表中有1024個頁表項,每一個頁表項中存放的是4kb內存塊的起始地址(也就是頁框的物理地址)。而我們的后12位的大小為4kb,所以我們又知道其對應的起始地址,所以我們對應的起始物理地址+后12位偏移量就是最終所訪問的數據。所以我們的后12位被稱為頁內偏移。

我們也可以再頁表中加上標志位,讓CPU與頁表中的標志位進行比對,如果相同就可以訪問物理內存的內容。?

所以給不同的線程分配不同的區域,本質就是讓不同的線程各自看到全部頁表的子集。

那是怎么才能看到不同的頁表呢?這里我們得轉到應用層面來看,所以讓我們先了解一些系統調用函數:

第一個參數線程id,第二個參數線程屬性,第三個參數是返回值void*參數也是void*的函數指針,第四個參數是我們給第三個函數指針所指向的函數所傳遞的參數。

一般情況下我們的第二個參數可以寫nullptr。

注意:在我們使用pthread庫中函數時,在編譯時必須鏈接上pthread庫!!!

這樣我們就可以簡短寫一個代碼:

#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>void *newthreadrun(void *args)
{while (true){std::cout << "I am new thread, pid: " << getpid() << std::endl;sleep(1);}
}int main()
{pthread_t tid;pthread_create(&tid, nullptr, newthreadrun, nullptr);while (true){std::cout << "I am main thread, pid: " << getpid() << std::endl;sleep(1);}
}

這時我們的代碼就有兩個執行流,我們從main函數開始運行,當走到pthread_create函數時新線程創建成功會進入newthreadrun函數中去,主線程繼續往下執行即可。

?在這里我們只能看到一個進程,我們可以使用ps -aL查看輕量級進程就可以看到兩個進程了。

主線程的PID==LWP,但是其線程所有的PID都是相同的。所以我們在回歸到上述問題上每一句代碼都有其對應的虛擬地址,主線程擁有的是主函數的虛擬地址其余線程得到的是其他函數的虛擬地址,對應其頁表就可以訪問到不同的數據。?

所謂的Linux就根本沒有線程這個說法,只有輕量化進程,所以對應的Linux內核就沒有對線程的系統調用只有對輕量化進程的系統調用。而用戶只知道線程不知道輕量化進程,所以設計者在用戶和內核之間設計一個軟件層pthread庫——原生線程庫。這個庫的作用就是將Linux的輕量級進程系統調用進行封裝,轉化成線程相關接口提供給用戶。

輕量級進程也有直接的系統調用,但是太復雜一般沒有人想用!!!?


以上就是本次全部內容,感謝大家觀看!?

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

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

相關文章

【國產開源可視化引擎Meta2d.js】數據

數據 Meta2d.js是由數據驅動顯示的。圖紙和圖元支持任意數據。 內置屬性 基于“約定優于配置”原則&#xff0c;Meta2d.js引擎會有一些內置屬性名&#xff0c;例如id表示唯一標識、name表示圖元名稱、text表示文本、color表示顏色等。 內置屬性有固定含義&#xff0c;影響顯…

揭秘:離心風機風量背后的科學原理

在工業生產和建筑環境中&#xff0c;離心風機如同一位不倦的呼吸管家&#xff0c;默默地維持著空氣流動與品質。 你是否好奇過&#xff0c;究竟是什么因素在背后操縱著這位“呼吸管家”的風量表現呢&#xff1f;今天&#xff0c;就讓我們一探究竟。 舉個例子&#xff1a;你在吹…

『大模型筆記』GraphRAG:利用復雜信息進行發現的新方法!

GraphRAG:利用復雜信息進行發現的新方法! 文章目錄 一. GraphRAG:利用復雜信息進行發現的新方法!1. 將RAG應用于私人數據集2. 整個數據集的推理3. 創建LLM生成的知識圖譜4. 結果指標5. 下一步二. 參考文獻微軟官方推文:https://www.microsoft.com/en-us/research/blog/gra…

LeetCode題練習與總結:反轉字符串中的單詞--151

一、題目描述 給你一個字符串 s &#xff0c;請你反轉字符串中 單詞 的順序。 單詞 是由非空格字符組成的字符串。s 中使用至少一個空格將字符串中的 單詞 分隔開。 返回 單詞 順序顛倒且 單詞 之間用單個空格連接的結果字符串。 注意&#xff1a;輸入字符串 s中可能會存在…

速盾:好的cdn服務器

CDN&#xff08;Content Delivery Network&#xff09;是指內容分發網絡&#xff0c;是一種將網站的靜態內容&#xff08;如圖片、音頻、視頻&#xff09;緩存在分布式的服務器節點上&#xff0c;通過就近訪問用戶的請求&#xff0c;提供快速可靠的內容傳輸服務的技術。 好的C…

HTML5文本標簽、圖像標簽、超鏈接

一、文本樣式標簽 字體樣式標簽&#xff1a; 加粗&#xff1a;<strong>…</strong> 斜體&#xff1a; < em >…</ em> eg&#xff1a; <h3>徐志摩人物簡介</h3> <p> <strong>1910</strong>年入杭州學堂<br/> &l…

微信小程序 - 本地存儲 增加有效期

小程序的本地存儲API提供了wx.setStorageSync和wx.setStorage來存儲數據&#xff0c;注意的是&#xff0c;小程序的本地存儲并沒有明確的有效期設置&#xff0c;存儲的數據在不超過限制的情況下&#xff0c;會一直保留。 一、小程序本地存儲API 小程序的本地存儲API提供了設置…

WEB06JavaScriptAjax

基礎語法 引入方式 引入方式 內部腳本&#xff1a;將JS代碼定義在HTML頁面中 JavaScript代碼必須位于<script></script>標簽之間 在HTML文檔中&#xff0c;可以在任意地方&#xff0c;放置任意數量的<script> 一般會把腳本置于<body>元素的底部&a…

常見的氣體流量計有哪些?

1.氣體渦輪流量計 適用場合&#xff1a;流量變化小&#xff0c;脈動流頻率小&#xff0c;中低壓潔凈天然氣優點 1.精度高&#xff0c;重復性好 2.測量范圍廣&#xff0c;壓損小&#xff0c;安裝維修方便 3.具有較高的抗電磁干擾和抗震動能力缺點&#xff1a;分辨率低&#xff…

活動:不要卷模型,要卷應用

如何理解李彥宏說的“不要卷模型&#xff0c;要卷應用” 1. 現狀 現如今&#xff0c;是否具備獨立的 AI 技術似乎已經成為衡量一個互聯網企業是否成功的標志。各家都在竭盡全力卷模型、卷數據、卷訓練效果&#xff0c;市面上僅是語言類 AI 就多達十幾種&#xff0c;但從一名消…

瀏覽器中js外掛腳本的執行方式

1、開發工具控制臺交互執行 網頁中按F12打開開發者工具&#xff0c;選擇“控制臺”&#xff0c;鍵入js腳本命令回車執行&#xff0c;適用于臨時使用腳本邏輯簡單的場景&#xff0c;實例如下&#xff1a; // 獲取網頁元素的文本腳本 var elem document.getElementById("…

2-添加庫

本節將學習如何在項目中創建和使用庫&#xff0c;還將看到如何使庫的使用成為可選的。 本節中使用的示例代碼下載見step1-簡單開始cmake實踐-CSDN博客。 練習1 -創建一個庫 要在CMake中添加一個庫&#xff0c;使用add_library()命令并指定哪些源文件應該組成該庫。 我們可…

接入應用內支付服務,提高商業變現效率

在當今競爭激烈的移動應用市場中&#xff0c;開發者們面臨著提升應用商業變現能力的挑戰。用戶體驗的流暢性和支付的安全性至關重要。 HarmonyOS SDK應用內支付服務&#xff08;IAP Kit&#xff09;為開發者提供了一站式的解決方案&#xff0c;簡化了應用內支付的接入流程&…

C嘎嘎:類和對象(一)

目錄 面向過程和面向對象的初步認識 類的引入 類的定義 類的訪問限定符及封裝 訪問限定符 封裝 類的作用域 類的實例化 類對象模型 如何計算類對象大小 結構體內存對齊規則 this指針 this指針的引出 this指針的特性 類的6個默認成員函數 構造函數 概念 特性 …

喜訊丨美格智能通過國際EcoVadis平臺認證企業社會責任并榮獲承諾獎章,彰顯可持續發展實力

作為全球領先的無線通信模組及解決方案提供商&#xff0c;美格智能在社會責任領域再創新高。近日&#xff0c;美格智能憑借在企業社會責任和可持續性采購發展方面的卓越表現&#xff0c;通過國際在線權威評價機構EcoVadis對公司環境、勞工與人權、商業道德、可持續采購等方面審…

根據空格、制表符、回車符等分割字符串re.split

【小白從小學Python、C、Java】 【考研初試復試畢業設計】 【Python基礎AI數據分析】 根據空格、制表符、 回車符等分割字符串 re.split [太陽]選擇題 根據給定的Python代碼&#xff0c;哪個選項是正確的&#xff1f; import re pattern r\s print(f"【顯示】pattern{…

高清圖片壓縮無水印小程序源碼系統 前后端分離 帶完整的安裝代碼包以及搭建教程

系統概述 在當今的數字化時代&#xff0c;圖片作為信息傳播的重要載體&#xff0c;其質量和傳輸效率直接影響到用戶體驗。然而&#xff0c;高清圖片往往伴隨著較大的文件體積&#xff0c;這不僅會占用大量存儲空間&#xff0c;還會拖慢網頁或應用的加載速度。因此&#xff0c;…

熱烈祝賀!全視通多家客戶上榜全球自然指數TOP100!

2024年6月18日&#xff0c;全球醫療機構自然指數TOP100榜單發布&#xff0c;中國醫療機構在其中的表現尤為引人注目。 根據《自然》雜志網站發布的數據&#xff0c;此次公布的排名是基于&#xff08;2023年3月1日至2024年2月29日&#xff09;的統計數據&#xff0c;全球醫療機構…

Python在網絡爬蟲和數據抓取中的應用

Python在網絡爬蟲和數據抓取中的應用 引言 在數字化時代&#xff0c;數據的價值日益凸顯。無論是市場趨勢分析&#xff0c;還是個人偏好預測&#xff0c;數據都扮演著至關重要的角色。Python&#xff0c;作為一種功能強大、語法簡潔的編程語言&#xff0c;為數據的獲取、處理…

旗晟機器人AI智能算法有哪些?

在當今迅猛發展的工業4.0時代&#xff0c;智能制造和自動化運維已然成為工業發展至關重要的核心驅動力。伴隨技術的持續進步&#xff0c;工業場景中的運維巡檢已不再單純地依賴于傳統的人工運維方式&#xff0c;而是愈發多地融入了智能化的元素&#xff0c;其中智能巡檢運維系統…