Linux內核進程管理子系統有什么第三十三回 —— 進程主結構詳解(29)

接前一篇文章:Linux內核進程管理子系統有什么第三十二回 —— 進程主結構詳解(28)

本文內容參考:

Linux內核進程管理專題報告_linux rseq-CSDN博客

《趣談Linux操作系統 核心原理篇:第三部分 進程管理》—— 劉超

《圖解Linux內核?基于6.x》 —— 姜亞華 機械工業出版社

特此致謝!

進程管理核心結構 —— task_struct

5. 進程定位相關成員

上一回開始解析struct task_struct中進程的定位相關成員,包括以下字段:

	/* PID/PID hash table linkage. */struct pid			*thread_pid;struct hlist_node		pid_links[PIDTYPE_MAX]

這幾個字段的描述如下:

字段類型描述
thread_pidstruct pid *進程對應的pid
pid_linkshlist_node[PIDTYPE_MAX]link

上一回給出了struct pid的定義,再來回顧一下,在include/linux/pid.h中,如下:

struct pid
{refcount_t count;unsigned int level;spinlock_t lock;/* lists of tasks that use this pid */struct hlist_head tasks[PIDTYPE_MAX];struct hlist_head inodes;/* wait queue for pidfd notifications */wait_queue_head_t wait_pidfd;struct rcu_head rcu;struct upid numbers[1];
};

struct pid的主要字段見下表:

字段類型描述
countrefcount_t引用計數
levelunsigned intpid的層級
tasksstruct hlist_head[PIDTYPE_MAX]鏈表數組
numbersstruct upid[]每個層級的upid信息

struct upid的定義也在include/linux/pid.h中(就在struct pid定義的上邊),如下:

/** struct upid is used to get the id of the struct pid, as it is* seen in particular namespace. Later the struct pid is found with* find_pid_ns() using the int nr and struct pid_namespace *ns.*/struct upid {int nr;struct pid_namespace *ns;
};

struct upid用于獲取struct pid的id,正如在特定名稱空間中看到的那樣。稍后,使用int nr和struct pid_namespace *ns,通過find_pid_ns()找到struct pid。

struct upid的主要字段見下表:

字段類型描述
nrintid
nsstruct pid_namespace *命名空間

進程的id是有空間的,不同的空間中相同的id也能表示不同的進程。幸運的是,多數情況下進程都在一個level等于0的命名空間(pid_namespace)中。

假設需要查找的進程就在該命名空間中,那么struct pid的level字段就等于命名空間的層級,也等于0。

struct upid numbers[1]字段是struct upid數組,數組元素的個數為level+1,也就是1。

struct upid的int nr字段的值等于進程的id。pid_namespace結構中定義了類型為struct idr的idr字段,有其維護id和pid之間一對一的關系。struct pid_namespace的定義在include/linux/pid_namespace.h中,如下:

struct pid_namespace {struct idr idr;struct rcu_head rcu;unsigned int pid_allocated;struct task_struct *child_reaper;struct kmem_cache *pid_cachep;unsigned int level;struct pid_namespace *parent;
#ifdef CONFIG_BSD_PROCESS_ACCTstruct fs_pin *bacct;
#endifstruct user_namespace *user_ns;struct ucounts *ucounts;int reboot;	/* group exit code if this pidns was rebooted */struct ns_common ns;
} __randomize_layout;

這樣,使用id在struct pid_namespace(對象)內查找,即可得到struct upid(對象)。再通過uipd即可找到pid(利用container_of宏)。這就是上邊struct upid的注釋中講到的:

find_pid_ns函數在kernel/pid.c中,代碼如下:

struct pid *find_pid_ns(int nr, struct pid_namespace *ns)
{return idr_find(&ns->idr, nr);
}
EXPORT_SYMBOL_GPL(find_pid_ns);

idr_find函數實際上在筆者的《DRM專欄》中曾經講到過,當時是用在了Linux圖形子系統中,而這里則是用在了進程管理中。idr_find函數在lib/idr.c中,代碼如下:

/*** idr_find() - Return pointer for given ID.* @idr: IDR handle.* @id: Pointer ID.** Looks up the pointer associated with this ID.  A %NULL pointer may* indicate that @id is not allocated or that the %NULL pointer was* associated with this ID.** This function can be called under rcu_read_lock(), given that the leaf* pointers lifetimes are correctly managed.** Return: The pointer associated with this ID.*/
void *idr_find(const struct idr *idr, unsigned long id)
{return radix_tree_lookup(&idr->idr_rt, id - idr->idr_base);
}
EXPORT_SYMBOL_GPL(idr_find);

這樣,從id到struct pid的路就打通了。再來回顧一下這條路徑:

進程id <---> struct upid中的int nr字段 ---> level等于0的命名空間(struct upid numbers[0]的struct pid_namespace *ns)---> struct upid ---> struct pid

下一回解析從struct pid到strucr task_struct。

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

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

相關文章

從代碼學習深度強化學習 - 目標導向的強化學習-HER算法 PyTorch版

文章目錄 1. 前言:當一個任務有多個目標 2. 目標導向的強化學習 (GoRL) 簡介 3. HER算法:化失敗為成功的智慧 4. 代碼實踐:用PyTorch實現HER+DDPG 4.1 自定義環境 (WorldEnv) 4.2 智能體與算法 (DDPG) 4.3 HER的核心:軌跡經驗回放 4.4 主流程與訓練 5. 訓練結果與分析 6. 總…

前端 H5分片上傳 vue實現大文件

用uniapp開發APP上傳視頻文件&#xff0c;大文件可以上傳成功&#xff0c;但是一旦打包為H5的代碼&#xff0c;就會一提示鏈接超時&#xff0c;我的代碼中是實現的上傳到阿里云 如果需要看全文的私信我 官方開發文檔地址 前端&#xff1a;使用分片上傳的方式上傳大文件_對象…

Linux服務器Systemctl命令詳細使用指南

目錄 1. 基本語法 2. 基礎命令速查表 3. 常用示例 3.1 部署新服務后&#xff0c;設置開機自啟并啟動 3.2 檢查系統中所有失敗的服務并嘗試修復 3.3 查看系統中所有開機自啟的服務 4. 總結 以下是 systemctl 使用指南&#xff0c;涵蓋服務管理、單元操作、運行級別控制、…

【JVM內存結構系列】二、線程私有區域詳解:程序計數器、虛擬機棧、本地方法棧——搞懂棧溢出與線程隔離

上一篇文章我們搭建了JVM內存結構的整體框架,知道程序計數器、虛擬機棧、本地方法棧屬于“線程私有區域”——每個線程啟動時會單獨分配內存,線程結束后內存直接釋放,無需GC參與。這三個區域看似“小眾”,卻是理解線程執行邏輯、排查棧溢出異常的關鍵,也是面試中高頻被問的…

紅帽認證升級華為openEuler證書活動!

如果您有紅帽證書&#xff0c;可以升級以下相應的證書&#xff1a;&#x1f447; 有RHCSA證書&#xff0c;可以99元升級openEuler HCIA 有RHCE證書&#xff0c;可以99元升級openEuler HCIP 有RHCA證書&#xff0c;可以2100元升級openEuler HCIE 現金激勵&#xff1a;&#x1f4…

迭代器模式與幾個經典的C++實現

迭代器模式詳解1. 定義與意圖迭代器模式&#xff08;Iterator Pattern&#xff09; 是一種行為設計模式&#xff0c;它提供一種方法順序訪問一個聚合對象中的各個元素&#xff0c;而又不暴露該對象的內部表示。主要意圖&#xff1a;為不同的聚合結構提供統一的遍歷接口。將遍歷…

epoll 陷阱:隧道中的高級負擔

上周提到了 tun/tap 轉發框架的數據通道結構和優化 tun/tap 轉發性能優化&#xff0c;涉及 RingBuffer&#xff0c;packetization 等核心話題。我也給出了一定的數據結構以及處理邏輯&#xff0c;但竟然沒有高尚的 epoll&#xff0c;本文說說它&#xff0c;因為它不適合。 epo…

微前端架構常見框架

1. iframe 這里指的是每個微應用獨立開發部署,通過 iframe 的方式將這些應用嵌入到父應用系統中,幾乎所有微前端的框架最開始都考慮過 iframe,但最后都放棄,或者使用部分功能,原因主要有: url 不同步。瀏覽器刷新 iframe url 狀態丟失、后退前進按鈕無法使用。 UI 不同…

SQL Server更改日志模式:操作指南與最佳實踐!

全文目錄&#xff1a;開篇語**前言****摘要****概述&#xff1a;SQL Server 的日志模式****日志模式的作用****三種日志模式**1. **簡單恢復模式&#xff08;Simple&#xff09;**2. **完整恢復模式&#xff08;Full&#xff09;**3. **大容量日志恢復模式&#xff08;Bulk-Log…

git的工作使用中實際經驗

老輸入煩人的密碼 每次我git pull的時候都要叫我輸入三次煩人的密碼&#xff0c;問了deepseek也沒有嘗試成功 出現 enter passphrase for key ‘~/.ssh/id_rsa’ 的原因: 在生成key的時候,沒有注意,不小心設置了密碼, 導致每次提交的時候都會提示要輸入密碼, 也就是上面的提示…

科技賦能,寧夏農業繪就塞上新“豐”景

在賀蘭山的巍峨身影下&#xff0c;在黃河水的溫柔滋養中&#xff0c;寧夏這片古老而神奇的土地&#xff0c;正借助農業科技的磅礴力量&#xff0c;實現從傳統農耕到智慧農業的華麗轉身&#xff0c;奏響一曲科技與自然和諧共生的壯麗樂章。一、數字農業&#xff1a;開啟智慧種植…

imx6ull-驅動開發篇36——Linux 自帶的 LED 燈驅動實驗

在之前的文章里&#xff0c;我們掌握了無設備樹和有設備樹這兩種 platform 驅動的開發方式。但實際上有現成的&#xff0c;Linux 內核的 LED 燈驅動采用 platform 框架&#xff0c;我們只需要按照要求在設備樹文件中添加相應的 LED 節點即可。本講內容&#xff0c;我們就來學習…

深度學習中主流激活函數的數學原理與PyTorch實現綜述

1. 定義與作用什么是激活函數&#xff1f;激活函數有什么用&#xff1f;答&#xff1a;激活函數&#xff08;Activation Function&#xff09;是一種添加到人工神經網絡中的函數&#xff0c;旨在幫助網絡學習數據中的復雜模式。類似于人類大腦中基于神經元的模型&#xff0c;激…

Linux高效備份:rsync + inotify實時同步

一、rsync 簡介 rsync&#xff08;Remote Sync&#xff09;是 Linux 系統下的數據鏡像備份工具&#xff0c;支持本地復制、遠程同步&#xff08;通過 SSH 或 rsync 協議&#xff09;&#xff0c;是一個快速、安全、高效的增量備份工具。二、rsync 特性 支持鏡像保存整個目錄樹和…

一種通過模板輸出Docx的方法

起因在2個群里都有網友討論這個問題&#xff0c;俺就寫了一個最簡單的例子。其實&#xff0c;我們經常遇到一些Docx的輸出的需求&#xff0c;“用模板文件進行處理”是最簡單的一個方法&#xff0c;如果想預覽也簡單 DevExpress 、Teleric 都可以&#xff0c;而且也支持 Web 、…

探索 List 的奧秘:自己動手寫一個 STL List?

&#x1f4d6;引言大家好&#xff01;今天我們要一起來揭開 C 中 list 容器的神秘面紗——不是直接用 STL&#xff0c;而是親手實現一個簡化版的 list&#xff01;&#x1f389;你是不是曾經好奇過&#xff1a;list 是怎么做到高效插入和刪除的&#xff1f;&#x1f50d;迭代器…

mysql占用高內存排查與解決

mysql占用高內存排查-- 查看當前全局內存使用情況&#xff08;需要啟用 performance_schema&#xff09; SELECT * FROM sys.memory_global_total; -- 查看總內存使用 SELECT * FROM sys.memory_global_by_current_bytes LIMIT 10; -- 按模塊分類查看內存使用排行memory/perfor…

構建真正自動化知識工作的AI代理

引言&#xff1a;新一代生產力范式的黎明 自動化知識工作的人工智能代理&#xff08;AI Agent&#xff09;&#xff0c;或稱“智能體”&#xff0c;正迅速從理論構想演變為重塑各行各業生產力的核心引擎。這些AI代理被定義為能夠感知環境、進行自主決策、動態規劃、調用工具并持…

青少年機器人技術(四級)等級考試試卷-實操題(2021年12月)

更多內容和歷年真題請查看網站&#xff1a;【試卷中心 -----> 電子學會 ----> 機器人技術 ----> 四級】 網站鏈接 青少年軟件編程歷年真題模擬題實時更新 青少年機器人技術&#xff08;四級&#xff09;等級考試試卷-實操題&#xff08;2021年12月&#xff09; …

最新短網址源碼,防封。支持直連、跳轉。 會員無廣

最新短網址源碼&#xff0c;防封。支持直連、跳轉。 會員無廣告1.可將長網址自動縮短為短網址&#xff0c;方便記憶和使用。2.短網址默認為臨時有效&#xff0c;可付費升級為永久有效&#xff0c;接入支付后可自動完成&#xff0c;無需人工操作。3.系統支持設置圖片/文字/跳轉頁…