搜尋
首頁系統教程Linux深入理解 Linux 核心:虛擬位址空間與實體記憶體的映射關係

顯存映射

化學顯存合稱為尋址,動態隨機存取顯存(DRAM)。只有核心才可以直接存取數學顯存。

Linux核心為每位行程提供了一個獨立的虛擬位址空間,但是這個位址空間是連續的。這樣,進程就可以很方便地存取顯存,更精確地說是存取虛擬顯存。虛擬位址空間的內部又被分成核心空間和使用者空間兩份。

linux 用户分配空间_linux磁盘分配空间_linux分配用户权限

#進程在用戶態時,只能存取用戶空間顯存;只有步入內核態後,才可以存取內核空間顯存。其實每位行程的位址空間都包含了核心空間,但這種核心空間,雖然關聯的都是相同的化學顯存,也就是共享動態連結函式庫、共享顯存等。當行程切換到核心態後,就可以很方便地存取核心空間顯存。

並不是所有的虛擬顯存就會分配化學顯存,只有這些實際使用的虛擬顯存才分配化學顯存,但是分配後的化學顯存,是透過顯存映射來管理的。顯存映射,雖然就是將虛擬顯存位址映射到化學顯存位址。為了完成顯存映射,核心為每位進程都維護了一張頁表,記錄虛擬位址與化學位址的映射關係。

linux磁盘分配空间_linux分配用户权限_linux 用户分配空间

#頁表實際上儲存在CPU的顯存管理單元MMU中,這樣,正常情況下,處理器就可以直接通過硬件,找出要存取的顯存。而當進程存取的虛擬位址在頁表中查不到時,系統會形成一個缺頁異常,步入內核空間分配化學顯存、更新進程頁表,最後再返回用戶空間,恢復進程的運作。

CPU上下文切換中的TLB(TranslationLookasideBuffer,轉譯後備緩衝器)是MMU中頁表的快取。因為進程的虛擬位址空間是獨立的linux是什麼系統,而TLB的存取速率又比MMU快得多,所以,透過降低進程的上下文切換,降低TLB的刷新次數,就可以提升TLB快取的使用率,從而提升CPU的顯存存取效能。

MMU規定了一個顯存映射的最小單位,也就是頁,一般是4KB大小。這樣,每一次顯存映射,都必須關聯4KB或則4KB整數倍的顯存空間。

4KB大小的頁,會造成整個頁表會顯得十分大,例如32位元系統4GB/4KB=100多萬個頁表項。為了解決頁表項過多的問題,Linux提供了兩種機制,也就是多層頁表和大頁(HugePage)。

linux分配用户权限_linux 用户分配空间_linux磁盘分配空间

#多層頁表就是把顯存分成區塊來管理,將原先的映射關係改成區塊索引和區塊內的偏斜。因為虛擬顯存空間一般只用了極少一部分,這麼,多級頁表就只保存那些使用中的區塊,這樣就可以大大地減低頁表的項數。 Linux以四級頁表管理顯存頁,虛擬位址分為5個部份,前4個表項用於選擇頁,而最後一個索引表示頁內偏斜。

linux 用户分配空间_linux磁盘分配空间_linux分配用户权限

#

大頁,就是比普通頁更大的顯存區塊,常見的大小有2MB和1GB。大頁一般用在使用大量顯存的程序上,例如Oracle、DPDK等。

透過這個機制,在頁表的對應下,流程就可以透過虛擬位址來存取數學顯存了。

虛擬顯存空間分佈

最上方的是核心空間,下方的是用戶空間顯存,用戶空間又被分成多個不同的段

linux磁盘分配空间_linux分配用户权限_linux 用户分配空间

#使用者空間顯存,從低到高分別是5種不同的顯存段

1、唯讀段,包括程式碼和常數等

linux磁盘分配空间_linux 用户分配空间_linux分配用户权限

#2、資料段,包括全景變數等

3、堆,包含動態分配的顯存,從低位址開始向下下降

#4、檔案映射段,包括動態函式庫,共享顯存等,從高位址開始向上下降

5、棧,包括局部變數和函數呼叫的上下文等,堆疊的大小是固定的,通常是8M

這5個顯存段中,堆和檔案對映的顯存是動態分配的,例如使用C標準函式庫的malloc或mmap(),就可以分別在堆和文件映射段動態分配顯存。 64位元系統的顯存分佈也是類似的,只是顯存空間要大的多

顯存分配與回收

malloc()是C標準函式庫提供的顯存分配函數,對應到系統呼叫上,有兩種實作方法,即brk()和mmap()。

linux磁盘分配空间_linux 用户分配空间_linux分配用户权限

#對小塊顯存(大於128K),C標準函式庫使用brk()來分配,也就是透過聯通堆頂的位置來分配顯存。這種顯存釋放後並不會立即歸還系統,而是被快取上去,這樣就可以重複使用。

linux磁盘分配空间_linux分配用户权限_linux 用户分配空间

#對大塊顯存(小於128K),則直接使用顯存映射mmap()來分配,也就是在檔案映射段找一塊空閒顯存分配出去。

這兩種方法的異同點:

brk()方法的緩存,可降低缺頁異常的發生,提升顯存存取效率。不過,因為這種顯存沒有歸還系統,在顯存工作忙碌時,頻繁的顯存分配和釋放會導致顯存碎片。

mmap()方法分配的顯存,會在釋放時直接歸還系統,所以每次mmap就會發生缺頁異常。在顯存工作忙碌時,頻繁的顯存分配會造成大量的缺頁異常,使核心的管理負擔減少。這也是malloc只對大塊顯存使用mmap的誘因。

須要注意的是:當這兩種呼叫發生後,雖然並沒有真正分配顯存。這種顯存,都只在首次存取時才分配,也就是透過缺頁異常步入核心中,再由核心來分配顯存。

整體來說,Linux使用夥伴系統來管理記憶體分配。上面我們談到過,這種顯存在MMU中以頁為單位進行管理,夥伴系統也一樣linux漏洞掃描,以頁為單位來管理顯存,而且會透過相鄰頁的合併,降低顯存碎片化(例如brk法導致的顯存碎片)。

但在實際系統運作中,會有大量比頁還小的對象,如不到1K,倘若為它們也分配單獨的頁,會浪費大量的顯存,那該如何分配顯存呢?

在使用者空間linux 使用者分配空間,malloc透過brk()分配的顯存,在釋放時並非立刻歸還系統,而是快取上去重複借助。

在核心空間,Linux則透過slab分配器來管理小顯存。你可以把slab看成建立在夥伴系統上的一個緩存,主要作用就是分配並釋放核心中的小物件。

linux 用户分配空间_linux磁盘分配空间_linux分配用户权限

#顯存回收:對顯存來說,假如只分配而不釋放,還會導致顯存洩露,甚至會用盡系統顯存。所以,在應用程式用完顯存後,還必須呼叫free()或unmap(),來釋放那些不用的顯存。其實,系統也不會任由某個行程用完所有顯存。在發覺顯存緊張時,系統也會透過一系列機制回收顯存,例如下邊這三​​種形式:

(1)回收緩存,例如使用LRU(LeastRecentlyUsed)演算法,回收近來使用最少的顯存頁面。

(2)回收不常存取的顯存,把不常用的顯存透過交換分區(Swap)直接講到c盤中。 Swap雖然就是把一塊c盤空間當作顯存來用。它可以把進程暫時不用的資料儲存到c盤中(這個過程稱為換出),當進程存取那些顯存時,再從c盤讀取這種資料到顯存中(這個過程稱為換入)。 Swap把系統的可用顯存變大了,但一般只在顯存不足時,就會發生Swap交換,而且因為c盤讀寫的速率遠比顯存慢,Swap會造成嚴重的顯存效能問題。

(3)殺害進程,顯存緊張時系統就會通過OOM(OutofMemory,核心的一種保護機制),直接殺掉佔用大量顯存的進程。 OOM監控進程的顯存使用情況,但使用oom_score為每位行程的顯示使用情況進行評分:

一個行程消耗的顯存越大,oom_score就越大;

一個行程運行佔用的CPU越多,oom_score就越小。

這樣,進程的oom_score越大,代表消耗的顯存越多,就越容易被OOM殺害,進而可以更好地保護系統。

其實,為了實際工作的須要,管理員可以通過/proc檔案系統,自動設定進程的oom_adj,因而調整進程的oom_score。 oom_adj的範圍是[-17,15],數值越大,表示進程越容易被OOM殺害;數值越小,表示進程越不容易被OOM殺害,其中-17表示嚴禁OOM。如用下邊的命令,你就可以把sshd進程的oom_adj調小為-16,這樣,sshd進程就不容易被OOM殺害。

echo-16>/proc/$(pidofsshd)/oom_adj

linux磁盘分配空间_linux 用户分配空间_linux分配用户权限

linux磁盘分配空间_linux 用户分配空间_linux分配用户权限

##buffer和cache

free指令中buffer和cache都表示緩存,但用途不一樣

1、Buffer,是核心緩衝區用到的顯存,對應的是/proc/meminfo中的Buffer值

2、Cache,是核心頁快取和Slab用到的顯存,對應的是/proc/meminfo中的Cache和SReclaimable總和

簡單來說,Buffer是對c碟資料的緩存,而Cache是​​檔案資料的緩存,它們既會用在讀取懇求中,也會用在寫懇求中。

cache(快取)從CPU角度考慮,是為了提升cpu和顯存之間的資料交換速率而設計的,例如平常看到的一級快取、二級快取、三級快取。 cpu在執行程式所使用的指令和讀取資料都是針對顯存的,也就是從顯存中取得的。因為顯存讀寫速率慢,為了提升cpu與顯存之間資料交換的速率,在cpu與顯存之間降低了cache,它的速率比顯存快linux 使用者分配空間,而且造價高,又因為在cpu內不能整合太多積體電路,所以通常cache比較小,之後intel等公司為了進一步提升速率,又降低了二級cache,甚至五級cache,它是按照程式的局部性原理而設計的,就是cpu執行的指令和存取的資料常常在集中的某一塊,所以把這塊內容裝入cache後,cpu就不用在存取顯存了,這就提升了存取速率。其實若cache中沒有cpu所須要的內容,還是要存取顯存的。

從顯存讀取與c盤讀取角度考慮,cache可以理解為作業系統為了更高的讀取效率,更多的使用顯存來快取可能被再度存取的資料。

緩衝(buffers)是為了提升顯存和硬盤(或其他I/O裝置)之間的資料交換的速率而設計的。把分散的寫入操作集中進行,降低c盤碎片和硬盤的重複尋道,因而提升系統效能。 linux有一個守護程式定期清空緩衝內容(即寫入c碟),也可以透過sync指令自動清空緩衝。

簡單來說,buffer是即即將被寫入c盤的,而cache是​​被從c盤中讀下來的。 buffer是由各類別進程分配的,被用在如輸入佇列等方面。一個簡單的反例如某個進程要求有多個數組讀入,在所有數組被讀入完整之前,進程把原本讀入的數組置於buffer中保存。

cache常常被用在c盤的I/O懇求上,假如有多個進程都要訪問某個文件,於是該文件便被弄成cache以便捷上次被訪問,這樣可提升系統性能。

以上是深入理解 Linux 核心:虛擬位址空間與實體記憶體的映射關係的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Linux和Windows處理設備驅動程序的區別有什麼區別?Linux和Windows處理設備驅動程序的區別有什麼區別?Apr 25, 2025 am 12:13 AM

Linux和Windows在處理設備驅動程序上的差異主要體現在驅動管理的靈活性和開發環境上。 1.Linux採用模塊化設計,驅動可以動態加載和卸載,開發者需深入理解內核機制。 2.Windows依賴微軟生態,驅動需通過WDK開發並簽名認證,開發相對複雜但保證了系統的穩定性和安全性。

比較和對比Linux和Windows的安全模型。比較和對比Linux和Windows的安全模型。Apr 24, 2025 am 12:03 AM

Linux和Windows的安全模型各有優勢。 Linux提供靈活性和可定制性,通過用戶權限、文件系統權限和SELinux/AppArmor實現安全。 Windows則注重用戶友好性,依賴WindowsDefender、UAC、防火牆和BitLocker保障安全。

Linux和Windows之間的硬件兼容性有何不同?Linux和Windows之間的硬件兼容性有何不同?Apr 23, 2025 am 12:15 AM

Linux和Windows在硬件兼容性上不同:Windows有廣泛的驅動程序支持,Linux依賴社區和廠商。解決Linux兼容性問題可通過手動編譯驅動,如克隆RTL8188EU驅動倉庫、編譯和安裝;Windows用戶需管理驅動程序以優化性能。

Linux和Windows之間虛擬化支持有哪些差異?Linux和Windows之間虛擬化支持有哪些差異?Apr 22, 2025 pm 06:09 PM

Linux和Windows在虛擬化支持上的主要區別在於:1)Linux提供KVM和Xen,性能和靈活性突出,適合高定制環境;2)Windows通過Hyper-V支持虛擬化,界面友好,與Microsoft生態系統緊密集成,適合依賴Microsoft軟件的企業。

Linux系統管理員的主要任務是什麼?Linux系統管理員的主要任務是什麼?Apr 19, 2025 am 12:23 AM

Linux系統管理員的主要任務包括系統監控與性能調優、用戶管理、軟件包管理、安全管理與備份、故障排查與解決、性能優化與最佳實踐。 1.使用top、htop等工具監控系統性能,並進行調優。 2.通過useradd等命令管理用戶賬戶和權限。 3.利用apt、yum管理軟件包,確保系統更新和安全。 4.配置防火牆、監控日誌、進行數據備份以確保系統安全。 5.通過日誌分析和工具使用進行故障排查和解決。 6.優化內核參數和應用配置,遵循最佳實踐提升系統性能和穩定性。

很難學習Linux嗎?很難學習Linux嗎?Apr 18, 2025 am 12:23 AM

學習Linux並不難。 1.Linux是一個開源操作系統,基於Unix,廣泛應用於服務器、嵌入式系統和個人電腦。 2.理解文件系統和權限管理是關鍵,文件系統是層次化的,權限包括讀、寫和執行。 3.包管理系統如apt和dnf使得軟件管理方便。 4.進程管理通過ps和top命令實現。 5.從基本命令如mkdir、cd、touch和nano開始學習,再嘗試高級用法如shell腳本和文本處理。 6.常見錯誤如權限問題可以通過sudo和chmod解決。 7.性能優化建議包括使用htop監控資源、清理不必要文件和使用sy

Linux管理員的薪水是多少?Linux管理員的薪水是多少?Apr 17, 2025 am 12:24 AM

Linux管理員的平均年薪在美國為75,000至95,000美元,歐洲為40,000至60,000歐元。提升薪資可以通過:1.持續學習新技術,如雲計算和容器技術;2.積累項目經驗並建立Portfolio;3.建立職業網絡,拓展人脈。

Linux的主要目的是什麼?Linux的主要目的是什麼?Apr 16, 2025 am 12:19 AM

Linux的主要用途包括:1.服務器操作系統,2.嵌入式系統,3.桌面操作系統,4.開發和測試環境。 Linux在這些領域表現出色,提供了穩定性、安全性和高效的開發工具。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。