【Linux內核系列】:進程板塊與文件板塊的綜合

🔥 本文專欄:Linux
🌸作者主頁:努力努力再努力wz

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

💪 今日博客勵志語錄人生中成功只是一時的,失敗卻是人生的主旋律,但是如何面對失敗卻把人分成了不同的樣子,有的人會被失敗擊垮,有的人會爬起來繼續向前,所以你會選擇成為什么樣的人呢?

那么在此前的一系列的文章,我主要圍繞展開講解了Linux的進程板塊與文件系統板塊,學習完了這兩個板塊的知識點之后,那么這兩個板塊的內容其實并不是獨立隔離開的而是有聯系的,那么有了文件系統板塊的知識點之后,其實我們進程板塊的很多知識點就可以在進一步的完善,那么本篇文章的核心就是關聯其我們進程板塊與我們的文件板塊,那么廢話不多說,就進入正文的學習

★★★ 本文前置知識:

文件系統收尾

文件系統

緩沖區

進程的替換

進程地址空間


引入:內存管理

想必進程的創建想必大家一定非常熟悉,那么在進程創建之前,我們需要將該進程對應的可執行文件給加載到內存中,那么我們知道內存和外部設備磁盤一樣,是一個物理結構,那么必然也要經過操作系統的管理,那么操作系統管理一個事物的方式是首先得為該事物建立一個邏輯映射來描述該事物,比如磁盤,那么操作系統便用一個一維的線性數組來描述磁盤這個物理結構,那么其中該一維的線性數組的每一個元素便是扇區,同理操作系統要描述內存,必然也得為內存建立一個邏輯結構

那么我們知道CPU在運行進程的代碼的時候,那么會從內存中獲取該進程的相關數據,而CPU要獲取該進程的相關數據,必然得告訴內存目標數據在內存中的物理位置,從而內存能夠定位到該數據然后交給CPU,而CPU與內存之間通過地址線相連,那么以32為機器為例,那么CPU與內存的地址線就是32根,那么每一根地址線的高低電頻信號用來表示二進制的0和1,那么內存就能夠獲取到這32根地址線組合得到一個二進制序列,那么該二進制序列便是地址,那么32根地址線總共就能夠表示出2的32次方個不停的地址,也就是從0000 0000到FFFF FFFF連續的大小為4GB的地址空間,那么該地址空間就可以用一個一維的數組來表示,其中該數組的每一個元素就是一個邏輯地址,那么每一個進程都有各自的獨立的一份虛擬地址空間,那么該虛擬地址空間就是內存的一個邏輯映射

那么這些地址是邏輯上的地址,就如同我們磁盤上一維線性數組中的邏輯塊的LAB地址一樣,那么他們就需要經過轉化映射得到實際的物理內存地址,所以便有了頁表這個數據結構,那么其中頁表就記錄的是虛擬地址到內存的物理地址的一個映射,那么CPU拿著虛擬地址經過其MMU也就是CPU的內存管理單元,然后MMU通過頁表就能實現虛擬地址到物理地址的一個轉化,從而交給內存定位到目標數據
在這里插入圖片描述

而對于物理內存來說,我們操作系統將連續的物理內存空間其中按照4KB的數據為一個集合來劃分,其中這每一個集合就是一個頁框,那么為了管理整個物理內存就轉換為了管理這劃分的一個一個的頁框,那么管理的方式就是我們最為熟悉的先描述,再組織了,也就是說操作系統會為每一個頁框定義一個page結構體,那么該結構體存儲了該頁框的各種屬性,其中最關鍵的便是一個整形的flag作為標志位,那么該整形flag變量的每一個二進制位都有特定的含義,那么其中就包括了該頁框是否被使用等,那么其中page結構體還包括一個變量count也就是引用計數,記錄該頁框被多少進程所共享,那么在進程的視角下,物理內存是4GB,而頁框的大小是4KB,那么也就是說總共大概會有1048576個頁框

  struct page {unsigned long flags;        // 標志位(如PG_locked、PG_dirty)atomic_t _count;            // 引用計數(共享次數)atomic_t _mapcount;         // 頁表映射計數struct address_space *mapping;  // 關聯的地址空間(文件映射時使用)pgoff_t index;              // 頁框在文件或內存中的偏移struct list_head lru;       // LRU鏈表(用于頁面置換算法)// 其他字段(如內核slab分配器相關)};

那么為了管理這么多的頁框,那么操作系統的內核中會維護一個全局的變量mem_map本質上也就是一個struct page數組,那么該數組的每一個元素就對應一個page實例,那么我們可以通過內存的邏輯地址也就是地址空間的虛擬地址來根據其頁表來映射轉換得到內存的物理地址,而虛擬地址的二進制序列是由頁目錄索引、頁表索引、頁內偏移所構成。

以虛擬地址 0x08048000為例: 0x08048000 → 分解為:頁目錄索引(0x20)、頁表索引(0x48)、頁內偏移(0x000)。

然后MMU通過頁目錄索引以及頁表索引在頁表中逐級查找得到頁框號PFN再結合頁內偏移最后在將兩者轉化得到物理內存地址

而物理地址的前12位便是該物理地址所對應的頁框的page結構體在mem_map的一個偏移量也就是PFN,那么我們就可以根據偏移量來定位到其對應的page結構體,這樣就完成了一個虛擬地址到物理地址再到對應的page結構體的一個映射

虛擬地址空間 (進程視角)

└── 頁表 (Page Table)

└── 物理地址 (硬件層)

└── 物理頁框 (4KB)

└── struct page (元數據)

└── mem_map[PFN] (全局管理)

而我們發現如果是對于EXT4文件系統來說,那么該文件系統下的邏輯塊的大小是4KB,而頁框的大小也為4kb,那么必然我們的內存與磁盤的邏輯塊就能夠達成一個1:1的映射關系,那么至于映射規則以及過程是什么的,那么又是說來話長,本文肯定是講不完的,所以便不再闡述了,讀者感興趣可以下去自己了解

完善進程的創建的全過程

那么我們現在我們要結合我們之前所學的進程板塊與文件板塊來完善進程創建的一個完整的過程的話,那么這個過程的起點就應該從系統調用說起,

我們知道了我們在Linux上創建的各種進程,本質上都是我們命令行解釋器也就是shell外殼程序的子進程,那么shell外殼程序會調用fork系統調用接口來創建一個子進程,那么此時就會復制拷貝一份父進程的task_struct結構體然后修改其中部分屬性比如PID以及PPID等得到子進程自己獨立的一份task_struct結構體,至于數據層面上,那么子進程是共享父進程的物理內存頁面的,但是為了進程的獨立性,操作系統會采取了寫時拷貝機制,也就是一旦進程對共享的數據進行寫入操作的時候,那么便會觸發寫時拷貝機制,那么此時操作系統會為寫入的數據在內存中為其開辟一份副本從而做到父子進程的數據的獨立,那么fork調用結束后,下一個環節便是進程的替換,那么此時會調用exec族函數,那么它會獲取到替換的目標進程的對應的可執行文件的文件名以及路徑,那么沒錯,現在這部分過程就開始與文件板塊串聯起來了,獲取文件名以及路徑是目的是要從該文件所處的目錄文件中的目錄項中獲取對應的文件名和其inode編號的映射關系從而獲取該可執行文件的inode編號,那么有了該文件的inode編號之后,那么便可以轉化為磁盤中的物理內存地址從而進行定位,而inode塊中有其關聯的保存文件內容的數據塊的索引,那么意味著此時我們便能同時定位到該可執行文件的inode塊以及對應的數據塊,從而將其加載到內存中,然后接著又切換到我們的進程板塊
在這里插入圖片描述
一旦該進程對應的可執行文件加載到內存中之后,那么那么進程的替換不會為替換的新的進程創建一個task_struct結構體,而是修改該進程的頁表也就是映射關系,從而將該子進程的上下文替換為目標進程的上下文,那么子進程運行結束退出后接著父進程會利用waitpid接口獲取子進程的退出情況也就是退出碼,那么這就是結合了文件板塊之后,我們完善我們對于進程的創建的全過程的一個理解

完善用戶緩沖區寫入

那么我們有了文件系統以及進程的概念之后,我們便能夠理解以及完善用戶緩沖區寫入的一個全過程

那么我們知道當我們調用c語言提供的fwrite庫函數向目標文件做寫入時,那么寫入的數據不會直接到內核中而是先保存在c語言提供的一個用戶層面上的緩沖區,然后再根據特定的刷新策略比如行緩沖或者全緩沖調用write接口刷新到內核中去

而我們向目標文件寫入的數據前提肯定是該目標文件被打開了,那么既然該文件被打開,那么必然要調用fopen函數或者open接口,那么open系統接口會獲取該打開的目標文件的文件名以及所處路徑,然后會根據該路徑解析得到該目標文件所處的目錄,然后掃描其目錄項得到映射關系從而獲取該文件的inode編號從而定位到磁盤中的相應位置將該文件的inode塊以及其關聯的數據塊加載到內存當中,并且為其創建一個內核層面上的file結構體,以及定義一個inode結構體保存inode塊的數據,那么file結構體內部就有inode結構體的間接引用,而進程內部會有一個指針數組記錄其打開的文件,那么每一個元素指向一個該進程打開的文件的file結構體,那么創建完file結構體之后,就會從數組開始線性掃描該指針數組尋找空余位置然后指向該file結構體并返回該數組位置的下標

那么此時有了數組下標之后,我們便能獲取該文件的file結構體,那么其中file結構體中有一個address space字段,其中保存了一個指向基數樹的數據結構的指針,那么我們該打開的文件一定保存在特定位置的內存的頁框中,所以得通過基數樹來尋找定位到其page結構體然后寫入到頁緩存中去,最后再由操作系統刷新到磁盤中去,這也就是為什么要有用戶緩沖區的意義,因為每次寫入頁緩沖,那么其在基數樹的定位都需要時間開銷
在這里插入圖片描述

結語

那么這就是本篇文章的全部內容,那么大家在學習Linux的各個板塊的時候,比如進程與文件系統,它們之間不是獨立沒有聯系的,而是可以結合這兩個板塊的知識,去完善我們很多過程,加深這兩個板塊之間的理解,這就是本文想要傳達的,那么我的下一篇文章是動靜態庫,那么我會持續更新,希望你能多多關注,如果本文有幫組到你的話,還請多多三連加關注哦,你的支持就是我創作的最大動力!
在這里插入圖片描述

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

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

相關文章

CellOracle|基因擾動研究基因功能|基因調控網絡+虛擬干預

在gzh“生信小鵬”同步文章 論文來源: 發表期刊:Nature發表時間:2023年2月23日論文題目:Dissecting cell identity via network inference and in silico gene perturbation研究團隊:Kenji Kamimoto 等,華盛頓大學醫學院1. 研究背景與問題提出 細胞身份(Cell Identit…

專線、云 和 物聯網(IoT)

專線、云 和 物聯網(IoT) 是現代信息與通信技術(ICT)領域的三大重要組成部分,它們在企業和個人的數字化轉型中扮演著關鍵角色。以下是對這三者的詳細介紹及其相互關系: 1. 專線(Leased Line&…

[Lc14_priority_queue] 最后一塊石頭重量 | 數據流中的第 K 大元素 | 前K個高頻單詞 | 數據流的中位數

目錄 1.最后一塊石頭的重量 題解 2.數據流中的第 K 大元素 題解 3.前K個高頻單詞 題解 代碼 ?4.數據流的中位數 題解 在C中,使用標準庫中的priority_queue,默認情況下它是一個最大堆(即大堆排序),這意味著最…

XSS漏洞靶場---(復現)

XSS漏洞靶場—(復現) 反射型 XSS 的特點是攻擊者誘導用戶點擊包含惡意腳本的 URL,服務器接收到請求后將惡意腳本反射回響應頁面,瀏覽器執行該腳本從而造成攻擊,惡意腳本不會在服務器端存儲。 Level 1(反射型XSS) 此漏…

2025/3.17 郭院安排會議與南京銀行參訪

目錄 *郭院會議:服務外包*1.會遇到的問題以及解決方案2.考慮行業目前會碰到的瓶頸3.后端應該呈現處理圖像的過程4.記得做報告、文檔說明和視頻等工作 *南京銀行(鑫合易家)參訪記錄*1. 風險評分業務流程筆記![在這里插入圖片描述](https://i-b…

Cloud Ace 宣布成為 Langfuse 亞太地區首個代理商,提供 LLM 全鏈路解決方案

Cloud Ace 宣布正式代理 Langfuse 產品,是 Langfuse 在亞太地區唯一的官方授權經銷商,全面負責其商用許可證的銷售、部署與技術支持服務。通過此次合作,Cloud Ace 將充分發揮 Langfuse 的先進技術能力與行業專業知識,為企業級客戶…

Helm 的倉庫管理與 Chart 搜索

在使用 Helm 管理 Kubernetes 應用的過程中,倉庫管理與 Chart 搜索是兩個核心功能。通過 Helm 倉庫,用戶可以方便地存儲、分享和獲取 Helm Chart,而搜索功能則幫助用戶快速找到所需的 Chart。本文將詳細介紹 Helm 倉庫的概念、管理方法以及如…

Matlab 汽車振動多自由度非線性懸掛系統和參數研究

1、內容簡介 略 Matlab 169-汽車振動多自由度非線性懸掛系統和參數研究 可以交流、咨詢、答疑 2、內容說明 略 第二章 汽車模型建立 2.1 汽車懸架系統概述 2.1.1 懸架系統的結構和功能 2.1.2 懸架分類 2.2 四分之一車輛模型 對于車輛動力學,一般都是研究其懸…

免訓練指標(Zero-Cost Proxies)

1. 什么是免訓練指標(Zero-Cost Proxies,ZC proxies)? 免訓練指標是一類 無需完整訓練模型即可評估其性能的度量方法,主要用于提高 神經架構搜索(NAS) 的效率。 傳統 NAS 需要訓練候選架構來評…

C語言 —— 此去經年夢浪蕩魂音 - 深入理解指針(卷二)

目錄 1. 數組名與地址 2. 指針訪問數組 3.一維數組傳參本質 4.二級指針 5. 指針數組 6. 指針數組模擬二維數組 1. 數組名與地址 我們先看下面這個代碼: int arr[10] { 1,2,3,4,5,6,7,8,9,10 };int* p &arr[0]; 這里我們使用 &arr[0] 的方式拿到了數…

基于Python pyscard庫采集ACS ACR122U NFC讀卡器數據的詳細操作步驟

步驟1:安裝驅動 1. 下載驅動: - 訪問ACS官網的驅動下載頁面:[ACR122U驅動下載](https://www.acs.com.hk/en/drivers/6/acr122u-nfc-reader/)。 - 選擇適用于Windows的驅動(如 ACR122U Driver (Windows) V3.05.02.zip)…

深度學習 Deep Learning 第1章 深度學習簡介

第1章 深度學習簡介 概述 本章介紹人工智能(AI)和深度學習領域,討論其歷史發展、關鍵概念和應用。解釋深度學習如何從早期的AI和機器學習方法演變而來,以及如何有效解決之前方法無法應對的挑戰。 關鍵概念 1. 人工智能的演變 …

python實現簡單的圖片去水印工具

python實現簡單的圖片去水印工具 使用說明: 點擊"打開圖片"選擇需要處理的圖片 在圖片上拖拽鼠標選擇水印區域(紅色矩形框) 點擊"去除水印"執行處理 點擊"保存結果"保存處理后的圖片 運行效果 先簡要說明…

軟件功能性測試有哪些步驟和挑戰?軟件測評服務機構分享

軟件功能性測試是對軟件系統進行驗證的一種基本方法。其主要目標是確保軟件系統能夠按照預期的要求和功能進行操作。從用戶的角度看,功能性測試旨在檢查軟件是否實現了所有要求的功能,保證用戶體驗的順暢與滿意。 一、軟件功能性測試的測試步驟   1、…

《C#上位機開發從門外到門內》3-4:基于TCP/IP的遠程監控系統設計與實現

文章目錄 一、項目概述二、系統架構設計三、通信協議設計四、功能模塊實現五、系統安全性與穩定性六、性能優化與測試七、實際應用案例八、結論 隨著信息技術的飛速發展,遠程監控系統在工業自動化、智能家居、環境監測等領域的應用日益廣泛。基于TCP/IP協議的遠程監…

在react當中利用IntersectionObserve實現下拉加載數據

目錄 一、傳統的下拉加載方案 二、存在問題 1.性能較差 2.不夠精確 三、IntersectionObserve版本下拉加載 1、callback 2、options 四、IntersectionObserver實例 1、Intersection的優勢 2、實現思路 3、代碼實現 在進行前端開發的過程中,常常會碰到下拉…

深入理解C++編程:從內存管理到多態與算法實現

C 是一門功能強大的編程語言,廣泛應用于系統編程、游戲開發和高性能計算等領域。本文將通過一系列經典問題,深入探討 C 的核心知識點,包括內存管理、多態(結合函數重載與覆蓋)、多線程、TCP/IP 模型、軟鏈接與硬鏈接的…

相對論之光速

然而,基礎物理學的進步很少全部由實驗取得。為了解實驗結果背后的機制,法拉第問道,既然磁鐵沒有接觸導線,導線中怎么會產生電流?一股電流又怎么能使指南針指針發生偏轉?有某種作用因素必然在磁鐵、導線和指南針之間的空隙中傳遞…

文本檢測-文本內容審核-文本過濾接口如何用PHP調用?

一、什么是文本檢測接口呢? 文本內容審核過濾,提供對敏感事件、違規詞語及監管要求封禁詞語的識別審核能力,包含海量歷史數據,有效過濾違禁違規、惡意推廣、低俗辱罵、低質灌水、廣告法審核,該接口應用場景廣泛&#…

突破極限:獵板PCB在HDI盲埋孔樹脂塞孔工藝中的創新與挑戰

在高端電子制造領域,HDI(高密度互連)技術憑借其高精度、高可靠性的特點,已成為5G通信、航空航天、智能汽車等領域的核心技術支撐。作為HDI板制造的核心環節,盲埋孔樹脂塞孔工藝直接決定了電路板的信號完整性、散熱性能…