011 Linux_線程概念與創建

前言

本文將會向你介紹線程的概念,以及線程是怎么被創建的

線程概念

一、進程是承擔系統資源的基本實體,線程是cpu調度的基本單位

首先,地址空間在邏輯上相當于進程的資源窗口, 每個進程都有這樣一個資源窗口。通過地址空間+頁表獲取自身的代碼和數據
在這里插入圖片描述

那么有沒有可能創建一個“進程”只需要創建一個pcb進程控制塊即可?(以前創建進程,需要創建地址空間,頁表,建立映射關系等等)

只需要創建一個pcb和父進程指向同一個地址空間的起始位置 注定了每一個“進程”看到的是同一個資源窗口(包括主進程,再創建幾個進程,每個pcb都指向同一個地址空間,這意味著每個進程都能看到同一份“資源”),把代碼拆成幾個部分,把該共享的共享,不該共享的每個“進程”各一份,每個"進程"只會執行一部分代碼

在這里插入圖片描述
其實后續創建的每一個“進程”就是linux給出的線程的概念

每一個執行流占一份,每個執行流只需要占頁表的一部分,就可以看到每一個區域不同的資源塊
創建線程的量級明顯比創建進程的要低, 創建進程要從0創建,pcb地址空間構建各種映射關系,頁表,加載代碼和數據,動態庫也要加載,初始化各種代碼和數據等等
創建線程只需要創建個pcb,并沒有過多的資源申請,線程是參與資源分配的

LInux中線程的實現方案

操作系統只給線程是什么,特征是什么
具體一款os,無論底層怎么實現,只要符合給出的線程概念,就是線程,在教材里只給出線程的特征,但并不給出怎么實現線程,需要各個平臺去實現符合概念的線程
(就好比不管你讀的哪個大學,讀的清華,還是北大,都是大學生)

綜上所述:

1.線程創建更簡單,
2.線程在進程的地址空間中運行(在進程內部中運行) 主進程創建時,申請地址空間,頁表等等資源等到后續再創建線程時,就只需要創建一個pcb即可指向同一個地址空間,分配其中的資源,因此線程在進程的地址空間中運行

想必第一點你已經理解了,線程的創建更加地簡單
那么第二點該如何理解呢?
從前的進程:內部只有一個執行流(紅色框內的表示進程)
在這里插入圖片描述

現在的進程(進程=內核數據結構+代碼和數據):內部有多個執行流(整個紅色框內表示一個進程)
其中第一個線程表示的是主線程
因此回到開頭,進程(整個紅色框所包含的)是承擔系統資源的基本實體,而線程(一個個task_struct)是cpu調度的基本單位
在這里插入圖片描述
往后cpu看到一個pcb就執行該pcb的方法,方法只需要能在地址空間上被分配資源,cpu就執行進程代碼的一部分,訪問進程數據的一部分
因此真實在cpu上真實跑的執行流(輕量級進程—線程)就比傳統進程的量級要低一些

線程的創建

功能:創建一個新的線程
原型 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void * (start_routine)(void), void *arg);
參數:
thread:返回線程ID attr:設置線程的屬性
attr為NULL表示使用默認屬性
start_routine:是個函數地址,線程啟動后要執行的函數
arg:傳給線程啟動函數的參數 返回值:成功返回0;失敗返回錯誤碼

絕大多數函數的名字以“pthread_”打頭的函數
要使用這些函數庫,要通過引入頭文件<pthread.h> 鏈接這些線程函數庫時要使用編譯器命令的“-lpthread”選項

#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>
int gcnt = 100;
//新線程
void *ThreadRoutine(void *arg)
{const char *threadname = (const char *)arg;while(true){std::cout<<"I am a new thread:" << threadname << ",pid: "<< getpid() << "gcnt:" << gcnt << "," << &gcnt << std::endl;gcnt--;sleep(1);}
}
int main()
{pthread_t tid1;  //實際上pthread_t就是無符號長整形//創建線程1pthread_create(&tid1, NULL, ThreadRoutine, (void*)"thread 1");sleep(2);//主線程while(true){std::cout << "I am main thread" << std::endl;sleep(1);}return 0;
}

通過

ps -aL 命令來查看線程id

在這里插入圖片描述
現象:打印的pid是一樣的,說明兩個線程是屬于同一個進程里的線程,因此獲取的pid相同(理解:可以看看前文講的現在的進程是怎樣的)
LWP是用來區分線程的,全名是LIGHT WEIGHT PROCESSES輕量級進程(也就是線程)
在第一行中PID與LWP相同的就是主線程

#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>
int gcnt = 100;
void *ThreadRoutine(void *arg)
{const char *threadname = (const char *)arg;while(true){std::cout<<"I am a new thread:" << threadname << ",pid: "<< getpid() << "gcnt:" << gcnt << "," << &gcnt << std::endl;gcnt--;sleep(1);}
}
int main()
{pthread_t tid1;  //實際上pthread_t就是無符號長整形//創建線程1pthread_create(&tid1, NULL, ThreadRoutine, (void*)"thread 1");sleep(2);pthread_t tid2;//創建線程2pthread_create(&tid2, NULL, ThreadRoutine, (void*)"thread 2");sleep(2);pthread_t tid3;//創建線程3pthread_create(&tid3, NULL, ThreadRoutine, (void*)"thread 3");sleep(2);//主線程while(true){std::cout << "I am main thread" << std::endl;sleep(1);}return 0;
}

現象:所有線程共享同一份地址空間(共享同一份資源,觀察:每個線程上對gcnt變量的修改在全局上有效)
在這里插入圖片描述

小結

今日的分享就到這里啦,如果本文存在疏漏或錯誤的地方,還請您能夠指出!

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

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

相關文章

工控傳感器選型原則及舉例說明

工控傳感器選型原則及舉例說明 前言選型原則知識儲備光電傳感器接近開關和行程開關磁性開關模擬量傳感器類型及使用范圍數字量傳感器類型及使用范圍 選型舉例食品包裝箱運輸過程中的檢測有無倉庫提升伺服的極限位檢測產品高度檢測 前言 這里僅以數字量和模擬量信號的傳感器舉例…

Vue源碼系列講解——實例方法篇【二】(事件相關方法)

目錄 0.前言 1. vm.$on 1.1 用法回顧 1.2 內部原理 2. vm.$emit 2.1 用法回顧 2.2 內部原理 3. vm.$off 3.1 用法回顧 3.2 內部原理 4. vm.$once 4.1 用法回顧 4.2 內部原理 0.前言 與事件相關的實例方法有4個&#xff0c;分別是vm.$on、vm.$emit、vm.$off和vm.$o…

前端面試知識點合集

原型和原型鏈 任何函數都可以作為構造函數。當該函數通過 new 關鍵字調用的時候&#xff0c;就稱之為構造函數。 var Parent function(){}//定義一個函數&#xff0c;那它只是一個普通的函數&#xff0c;不能稱它為構造函數var instance new Parent(); //這時這個Parent就不…

C#理論 —— WPF 應用程序Console 控制臺應用

文章目錄 1. WPF 應用程序1.1 工程創建1.2 控件1.2.1 控件的公共屬性1.2.1 TextBox 文本框1.2.1 Button 按鈕 *. Console 控制臺應用1.1 工程創建 1. WPF 應用程序 1.1 工程創建 Visual Studio 中新建項目 - 選擇WPF 應用程序&#xff1b; 1.2 控件 1.2.1 控件的公共屬性 …

如何備份和恢復MySQL數據庫?有哪些常見的備份工具和策略?

如何備份和恢復MySQL數據庫&#xff1f;有哪些常見的備份工具和策略&#xff1f; 在數據庫管理中&#xff0c;備份和恢復是非常重要的環節&#xff0c;它們保障了數據的安全性和可恢復性。對于MySQL這樣的關系型數據庫管理系統&#xff0c;了解并實施有效的備份策略至關重要。…

Linux網絡編程——網絡基礎

Linux網絡編程——網絡基礎 1. 網絡結構模式1.1 C/S 結構1.2 B/S 結構 2. MAC 地址3. IP地址3.1 簡介3.2 IP 地址編址方式 4. 端口4.1 簡介4.2 端口類型 5. 網絡模型5.1 OSI 七層參考模型5.2 TCP/IP 四層模型 6. 協議6.1 簡介6.2 常見協議6.3 UDP 協議6.4 TCP 協議6.5 IP 協議6…

【兔子機器人】根據自身機器人參數修改simulink模型

關節電機 機體初始高度 &#xff01;&#xff01;&#xff01;接下來嘗試修改各腿的坐標朝向

LeetCode54題:螺旋矩陣(python3)

路徑的長度即為矩陣中的元素數量&#xff0c;當路徑的長度達到矩陣中的元素數量時即為完整路徑&#xff0c;將該路徑返回。 循環打印&#xff1a; “從左向右、從上向下、從右向左、從下向上” 四個方向循環打印。 class Solution:def spiralOrder(self, matrix: List[List[i…

怎么對App進行功能測試

測試人員常被看作是bug的尋找者&#xff0c;但你曾想過他們實際是如何開展測試的嗎&#xff1f;你是否好奇他們究竟都做些什么&#xff0c;以及他們如何在一個典型的技術項目中體現價值&#xff1f;本文將帶你經歷測試人員的思維過程&#xff0c;探討他們測試app時的各種考慮. …

Android和Linux的嵌入式開發差異

最近開始投入Android的懷抱。說來慚愧&#xff0c;08年就聽說這東西&#xff0c;當時也有同事投入去看&#xff0c;因為惡心Java&#xff0c;始終對這玩意無感&#xff0c;沒想到現在不會這個嵌入式都快要沒法搞了。為了不中年失業&#xff0c;所以只能回過頭又來學。 首先還是…

虛擬內存與mmap,brk

虛擬內存與mmap,brk 基本概念及相關術語 1.1 基本概念 虛擬內存使得應用程序認為它擁有連續的可用的內存&#xff08;一個連續完整的地址空間&#xff09;&#xff0c;而實際上&#xff0c;它通常是被分隔成多個物理內存碎片&#xff0c;還有部分暫時存儲在外部磁盤存儲器上&…

【C語言】linux內核generic_xdp_tx

一、中文注釋 /* 在執行通用XDP時&#xff0c;我們必須繞過qdisc層和網絡挖掘點&#xff0c;* 以匹配驅動內XDP的行為。*/ void generic_xdp_tx(struct sk_buff *skb, struct bpf_prog *xdp_prog) {struct net_device *dev skb->dev; // 獲取skb對應的網絡設備struct netd…

面試高頻率問答題目

索引&#xff1a; 主鍵索引&#xff1a;表的id &#xff08;唯一 且 不能為空&#xff09; 唯一索引&#xff1a;表User 假設有account 字段 &#xff0c;用戶名不重復 &#xff08;唯一 可以為空&#xff09; 復合索引&#xff1a;where() 的條件 用戶名&#xff0c;密碼 …

MySQL:函數

提醒&#xff1a; 設定下面的語句是在數據庫名為 db_book里執行的。 創建user_info表 注意&#xff1a;pwd為密碼字段&#xff0c;這里使用了VARCHAR(128)類型&#xff0c;為了后面方便對比&#xff0c;開發項目里一般使用char(32)&#xff0c;SQL語句里使用MD5加密函數 USE db…

【博圖TIA-Api】通過Excel自動新建文件夾和導入FB塊

【博圖TIA-Api】通過Excel自動新建文件夾和導入FB塊 說明思路準備獲取Excel表格內文件名和FB塊名等信息新建文件夾部分篩分獲取的文件夾數據&#xff0c;去掉重復內容創建文件夾 導入FB塊導出FB塊的xml文件查找需要放置的文件夾導入塊 說明 續上一篇文章&#xff0c;這次是根據…

多線程 --- [ 線程池、線程安全、其他常見的鎖 ]

目錄 1. 線程池 模塊一&#xff1a;線程的封裝 模塊二&#xff1a;線程池的封裝 模塊三&#xff1a;互斥量的封裝 (RAII風格) 模塊四&#xff1a;任務的封裝 模塊五&#xff1a;日志的封裝 模塊六&#xff1a;時間的封裝 模塊六&#xff1a;主函數 模塊七&#xff1a…

備戰藍橋杯---狀態壓縮DP進階題1

我們來看一看一道比較難的問題&#xff08;十分十分的巧妙&#xff09;&#xff1a; 顯然我們應該一行一行放&#xff0c;又豎的會對下一行產生影響&#xff0c;我們令橫著放為0&#xff0c;豎著放的上方為1. 對于下一行&#xff0c;前一行放1的下面為0&#xff0c;但是會出現…

【Redis | 第九篇】一篇文章看懂Redis持久化機制

文章目錄 9.一篇文章看懂Redis持久化機制9.1Redis的兩種持久化機制9.1.1為什么有持久化&#xff1f; 9.2RDB機制9.2.1介紹9.2.2觸發機制&#xff08;1&#xff09;save命令觸發&#xff08;2&#xff09;bgsave命令觸發&#xff08;3&#xff09;自動觸發 9.2.3執行流程9.2.4優…

C++知識點總結(22):模擬算法真題 ★★★★☆《卡牌游戲》《移動距離》

一、卡牌游戲 1. 審題 題目描述 A , B , C A,B,C A,B,C 三人在玩一個卡牌游戲&#xff0c;規則如下&#xff1a; 游戲開始時&#xff0c; 3 3 3 人分別會得到若干張手牌, 每張牌上寫著 a&#xff0c;b&#xff0c;c 中某一個字母。手牌的順序嚴格按照輸入順序排列&#xff0c…

前端【技術類】資源學習網站整理(那些年的小網站)

學習網站整理 值得分享的視頻博主&#xff1a;學習網站鏈接 百度首頁的資源收藏里的截圖&#xff08;排列順序沒有任何意義&#xff0c;隨性而已~&#xff09;&#xff0c;可根據我標注的關鍵詞百度搜索到這些網站呀&#xff0c;本篇末尾會一一列出來&#xff0c;供大家學習呀 …