Linux中的进程页表
是什么
進(jìn)程頁(yè)表是用于管理進(jìn)程虛擬地址空間和物理內(nèi)存之間映射關(guān)系的數(shù)據(jù)結(jié)構(gòu)。它記錄了進(jìn)程中每個(gè)虛擬頁(yè)對(duì)應(yīng)的物理頁(yè)的信息。
什么作用
進(jìn)程使用進(jìn)程頁(yè)表的方式是通過(guò)虛擬地址訪問(wèn)內(nèi)存。當(dāng)進(jìn)程訪問(wèn)一個(gè)虛擬地址時(shí),操作系統(tǒng)會(huì)根據(jù)進(jìn)程頁(yè)表中的映射關(guān)系,將虛擬地址轉(zhuǎn)換為物理地址,然后進(jìn)行內(nèi)存訪問(wèn)操作。
誰(shuí)維護(hù)
內(nèi)核。進(jìn)程頁(yè)表的創(chuàng)建、更新和銷(xiāo)毀等操作都由內(nèi)核負(fù)責(zé)。
什么結(jié)構(gòu)
通常是一個(gè)多級(jí)頁(yè)表,由多個(gè)頁(yè)表項(xiàng)組成。每個(gè)頁(yè)表項(xiàng)記錄了虛擬頁(yè)和物理頁(yè)的映射關(guān)系,包括虛擬頁(yè)號(hào)、物理頁(yè)號(hào)、權(quán)限位等信息。多級(jí)頁(yè)表的結(jié)構(gòu)可以有效地管理大型的虛擬地址空間。
什么時(shí)間創(chuàng)建
進(jìn)程頁(yè)表在進(jìn)程創(chuàng)建時(shí)被創(chuàng)建。當(dāng)一個(gè)新的進(jìn)程被創(chuàng)建時(shí),操作系統(tǒng)會(huì)為該進(jìn)程分配一個(gè)獨(dú)立的虛擬地址空間,并為其創(chuàng)建一個(gè)新的頁(yè)表。頁(yè)表的創(chuàng)建過(guò)程包括分配頁(yè)表所需的內(nèi)存空間,并建立虛擬頁(yè)和物理頁(yè)的映射關(guān)系。
CPU切換進(jìn)程時(shí)
操作系統(tǒng)會(huì)切換進(jìn)程的頁(yè)表。具體操作包括將新進(jìn)程的頁(yè)表加載到MMU(內(nèi)存管理單元)中,以更新虛擬地址空間和物理內(nèi)存的映射關(guān)系。這樣,當(dāng)新進(jìn)程執(zhí)行時(shí),它的虛擬地址訪問(wèn)將會(huì)映射到正確的物理內(nèi)存位置。
進(jìn)程從用戶態(tài)切換內(nèi)核態(tài)時(shí)
會(huì)發(fā)生一次上下文切換;在這個(gè)過(guò)程中,進(jìn)程的頁(yè)表也會(huì)發(fā)生切換:當(dāng)進(jìn)程發(fā)起系統(tǒng)調(diào)用或觸發(fā)異常時(shí),CPU會(huì)自動(dòng)切換到內(nèi)核態(tài),并將當(dāng)前進(jìn)程的頁(yè)表切換為內(nèi)核頁(yè)表。內(nèi)核頁(yè)表是內(nèi)核專用的頁(yè)表,用于管理內(nèi)核地址空間和物理內(nèi)存之間的映射關(guān)系。
與內(nèi)核頁(yè)表的區(qū)別
進(jìn)程頁(yè)表和內(nèi)核頁(yè)表是兩個(gè)獨(dú)立的數(shù)據(jù)結(jié)構(gòu),用于管理不同的地址空間。進(jìn)程頁(yè)表用于管理進(jìn)程的用戶態(tài)地址空間,而內(nèi)核頁(yè)表用于管理內(nèi)核的地址空間。進(jìn)程頁(yè)表和內(nèi)核頁(yè)表之間沒(méi)有直接的映射關(guān)系,它們是獨(dú)立的。
當(dāng)進(jìn)程從用戶態(tài)進(jìn)入到內(nèi)核態(tài)時(shí),內(nèi)核頁(yè)表會(huì)被加載到MMU中,以便進(jìn)程可以訪問(wèn)內(nèi)核地址空間中的代碼和數(shù)據(jù)。當(dāng)進(jìn)程從內(nèi)核態(tài)返回到用戶態(tài)時(shí),內(nèi)核頁(yè)表會(huì)被切換回進(jìn)程頁(yè)表,以恢復(fù)進(jìn)程的用戶態(tài)地址空間。
什么是缺頁(yè)異常
指當(dāng)進(jìn)程訪問(wèn)一個(gè)尚未映射到物理內(nèi)存的虛擬頁(yè)時(shí),操作系統(tǒng)會(huì)產(chǎn)生一個(gè)缺頁(yè)異常。這種設(shè)計(jì)是為了實(shí)現(xiàn)虛擬內(nèi)存的概念,即將進(jìn)程的虛擬地址空間擴(kuò)展到比物理內(nèi)存更大的范圍。當(dāng)發(fā)生缺頁(yè)異常時(shí),操作系統(tǒng)會(huì)根據(jù)頁(yè)表的映射關(guān)系,將相應(yīng)的物理頁(yè)加載到內(nèi)存中,并更新頁(yè)表的映射關(guān)系,以便進(jìn)程繼續(xù)訪問(wèn)該虛擬頁(yè)。
附錄
Linux系統(tǒng)文件頁(yè)表目錄和頁(yè)表結(jié)構(gòu)(圖文詳解)
參考:Linux系統(tǒng)文件頁(yè)表目錄和頁(yè)表結(jié)構(gòu)(圖文詳解)
linux查看某一進(jìn)程詳細(xì)信息
cat /proc/進(jìn)程號(hào)/status
VmSize(KB) 任務(wù)虛擬地址空間的大小 (total_vm-reserved_vm),其中total_vm為進(jìn)程的地址空間的大小,reserved_vm:進(jìn)程在預(yù)留或特殊的內(nèi)存間的物理頁(yè)
VmLck(KB) 任務(wù)已經(jīng)鎖住的物理內(nèi)存的大小。鎖住的物理內(nèi)存不能交換到硬盤(pán) (locked_vm)
VmRSS(KB) 應(yīng)用程序正在使用的物理內(nèi)存的大小,就是用ps命令的參數(shù)rss的值 (rss)
VmData(KB) 程序數(shù)據(jù)段的大小(所占虛擬內(nèi)存的大小),存放初始化了的數(shù)據(jù); (total_vm-shared_vm-stack_vm)
VmStk(KB) 任務(wù)在用戶態(tài)的棧的大小 (stack_vm)
VmExe(KB) 程序所擁有的可執(zhí)行虛擬內(nèi)存的大小,代碼段,不包括任務(wù)使用的庫(kù) (end_code-start_code)
VmLib(KB) 被映像到任務(wù)的虛擬內(nèi)存空間的庫(kù)的大小 (exec_lib)
VmPTE 該進(jìn)程的所有頁(yè)表的大小,單位:kb
Threads 共享使用該信號(hào)描述符的任務(wù)的個(gè)數(shù),在POSIX多線程序應(yīng)用程序中,線程組中的所有線程使用同一個(gè)信號(hào)描述符
進(jìn)程個(gè)各個(gè)數(shù)據(jù)段的虛擬地址是在什么時(shí)候確定的
在Linux中,進(jìn)程的各個(gè)數(shù)據(jù)段的虛擬地址是在進(jìn)程創(chuàng)建時(shí)確定的。具體來(lái)說(shuō),當(dāng)進(jìn)程被創(chuàng)建時(shí),內(nèi)核會(huì)為其分配一塊虛擬地址空間,其中包括代碼段、數(shù)據(jù)段、堆和棧等。這些虛擬地址是由內(nèi)核根據(jù)進(jìn)程的需求和系統(tǒng)的配置來(lái)確定的。
進(jìn)程各個(gè)數(shù)據(jù)段的作用
進(jìn)程的虛擬地址空間中,代碼段用于存放可執(zhí)行代碼,數(shù)據(jù)段用于存放全局變量和靜態(tài)變量,堆用于存放動(dòng)態(tài)分配的內(nèi)存,棧用于存放函數(shù)調(diào)用的局部變量和函數(shù)調(diào)用的上下文信息。
哪些數(shù)據(jù)段會(huì)一直駐留內(nèi)存
在Linux中,代碼段和數(shù)據(jù)段通常會(huì)一直駐留在內(nèi)存中,因?yàn)樗鼈兪沁M(jìn)程的靜態(tài)數(shù)據(jù)。而堆和棧是動(dòng)態(tài)分配的,它們的大小和位置會(huì)隨著進(jìn)程的運(yùn)行而變化。當(dāng)堆和棧的空間不足時(shí),進(jìn)程會(huì)觸發(fā)內(nèi)存分配和釋放操作,這時(shí)才會(huì)將相應(yīng)的內(nèi)存頁(yè)寫(xiě)入或從內(nèi)存中釋放。
swap的作用
當(dāng)系統(tǒng)的物理內(nèi)存不足時(shí),操作系統(tǒng)會(huì)將一些不常用的內(nèi)存頁(yè)換出到swap分區(qū)中,以釋放物理內(nèi)存供其他進(jìn)程使用。具體來(lái)說(shuō),當(dāng)發(fā)生缺頁(yè)中斷時(shí),如果內(nèi)存中沒(méi)有空閑的物理頁(yè),操作系統(tǒng)會(huì)選擇一個(gè)不常用的內(nèi)存頁(yè),將其寫(xiě)入swap分區(qū),并更新進(jìn)程頁(yè)表中的映射關(guān)系。這樣,物理內(nèi)存就可以為新的內(nèi)存頁(yè)騰出空間。當(dāng)進(jìn)程再次訪問(wèn)被換出的內(nèi)存頁(yè)時(shí),會(huì)觸發(fā)缺頁(yè)中斷,操作系統(tǒng)會(huì)將其從swap分區(qū)中讀入內(nèi)存,并更新進(jìn)程頁(yè)表中的映射關(guān)系。
總結(jié)
以上是生活随笔為你收集整理的Linux中的进程页表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

- 上一篇: 2021-3-13 xml的增删改查
- 下一篇: JNI编程之java层和native层的