日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux中的进程页表

發布時間:2023/10/18 linux 528 如意码农
生活随笔 收集整理的這篇文章主要介紹了 Linux中的进程页表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

是什么

進程頁表是用于管理進程虛擬地址空間和物理內存之間映射關系的數據結構。它記錄了進程中每個虛擬頁對應的物理頁的信息。

什么作用

進程使用進程頁表的方式是通過虛擬地址訪問內存。當進程訪問一個虛擬地址時,操作系統會根據進程頁表中的映射關系,將虛擬地址轉換為物理地址,然后進行內存訪問操作。

誰維護

內核。進程頁表的創建、更新和銷毀等操作都由內核負責。

什么結構

通常是一個多級頁表,由多個頁表項組成。每個頁表項記錄了虛擬頁和物理頁的映射關系,包括虛擬頁號、物理頁號、權限位等信息。多級頁表的結構可以有效地管理大型的虛擬地址空間。

什么時間創建

進程頁表在進程創建時被創建。當一個新的進程被創建時,操作系統會為該進程分配一個獨立的虛擬地址空間,并為其創建一個新的頁表。頁表的創建過程包括分配頁表所需的內存空間,并建立虛擬頁和物理頁的映射關系。

CPU切換進程時

操作系統會切換進程的頁表。具體操作包括將新進程的頁表加載到MMU(內存管理單元)中,以更新虛擬地址空間和物理內存的映射關系。這樣,當新進程執行時,它的虛擬地址訪問將會映射到正確的物理內存位置。

進程從用戶態切換內核態時

會發生一次上下文切換;在這個過程中,進程的頁表也會發生切換:當進程發起系統調用或觸發異常時,CPU會自動切換到內核態,并將當前進程的頁表切換為內核頁表。內核頁表是內核專用的頁表,用于管理內核地址空間和物理內存之間的映射關系。

與內核頁表的區別

進程頁表和內核頁表是兩個獨立的數據結構,用于管理不同的地址空間。進程頁表用于管理進程的用戶態地址空間,而內核頁表用于管理內核的地址空間。進程頁表和內核頁表之間沒有直接的映射關系,它們是獨立的。

當進程從用戶態進入到內核態時,內核頁表會被加載到MMU中,以便進程可以訪問內核地址空間中的代碼和數據。當進程從內核態返回到用戶態時,內核頁表會被切換回進程頁表,以恢復進程的用戶態地址空間。

什么是缺頁異常

指當進程訪問一個尚未映射到物理內存的虛擬頁時,操作系統會產生一個缺頁異常。這種設計是為了實現虛擬內存的概念,即將進程的虛擬地址空間擴展到比物理內存更大的范圍。當發生缺頁異常時,操作系統會根據頁表的映射關系,將相應的物理頁加載到內存中,并更新頁表的映射關系,以便進程繼續訪問該虛擬頁。

附錄

Linux系統文件頁表目錄和頁表結構(圖文詳解)

參考:Linux系統文件頁表目錄和頁表結構(圖文詳解)

linux查看某一進程詳細信息

cat /proc/進程號/status

VmSize(KB) 任務虛擬地址空間的大小 (total_vm-reserved_vm),其中total_vm為進程的地址空間的大小,reserved_vm:進程在預留或特殊的內存間的物理頁
VmLck(KB) 任務已經鎖住的物理內存的大小。鎖住的物理內存不能交換到硬盤 (locked_vm)
VmRSS(KB) 應用程序正在使用的物理內存的大小,就是用ps命令的參數rss的值 (rss)
VmData(KB) 程序數據段的大小(所占虛擬內存的大小),存放初始化了的數據; (total_vm-shared_vm-stack_vm)
VmStk(KB) 任務在用戶態的棧的大小 (stack_vm)
VmExe(KB) 程序所擁有的可執行虛擬內存的大小,代碼段,不包括任務使用的庫 (end_code-start_code)
VmLib(KB) 被映像到任務的虛擬內存空間的庫的大小 (exec_lib)
VmPTE 該進程的所有頁表的大小,單位:kb
Threads 共享使用該信號描述符的任務的個數,在POSIX多線程序應用程序中,線程組中的所有線程使用同一個信號描述符

進程個各個數據段的虛擬地址是在什么時候確定的

在Linux中,進程的各個數據段的虛擬地址是在進程創建時確定的。具體來說,當進程被創建時,內核會為其分配一塊虛擬地址空間,其中包括代碼段、數據段、堆和棧等。這些虛擬地址是由內核根據進程的需求和系統的配置來確定的。

進程各個數據段的作用

進程的虛擬地址空間中,代碼段用于存放可執行代碼,數據段用于存放全局變量和靜態變量,堆用于存放動態分配的內存,棧用于存放函數調用的局部變量和函數調用的上下文信息。

哪些數據段會一直駐留內存

在Linux中,代碼段和數據段通常會一直駐留在內存中,因為它們是進程的靜態數據。而堆和棧是動態分配的,它們的大小和位置會隨著進程的運行而變化。當堆和棧的空間不足時,進程會觸發內存分配和釋放操作,這時才會將相應的內存頁寫入或從內存中釋放。

swap的作用

當系統的物理內存不足時,操作系統會將一些不常用的內存頁換出到swap分區中,以釋放物理內存供其他進程使用。具體來說,當發生缺頁中斷時,如果內存中沒有空閑的物理頁,操作系統會選擇一個不常用的內存頁,將其寫入swap分區,并更新進程頁表中的映射關系。這樣,物理內存就可以為新的內存頁騰出空間。當進程再次訪問被換出的內存頁時,會觸發缺頁中斷,操作系統會將其從swap分區中讀入內存,并更新進程頁表中的映射關系。

總結

以上是生活随笔為你收集整理的Linux中的进程页表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。