毋庸置疑,虛擬內存絕對是操作系統中最重要的概念之一。我想主要是由于內存的重要”戰略地位”。CPU太快,但容量小且功能單一,其他 I/O 硬件支持各種花式功能,可是相對于 CPU,它們又太慢。于是它們之間就需要一種潤滑劑來(lái)作為緩沖,這就是內存大顯身手的地方。
上圖是虛擬內存最簡(jiǎn)單也是最直觀(guān)的解釋。
操作系統有一塊物理內存(中間的部分),有兩個(gè)進(jìn)程(實(shí)際會(huì )更多)P1 和 P2,操作系統偷偷地分別告訴 P1 和 P2,我的整個(gè)內存都是你的,隨便用,管夠??墒聦?shí)上呢,操作系統只是給它們畫(huà)了個(gè)大餅,這些內存說(shuō)是都給了 P1 和 P2,實(shí)際上只給了它們一個(gè)序號而已。只有當 P1 和 P2 真正開(kāi)始使用這些內存時(shí),系統才開(kāi)始使用輾轉挪移,拼湊出各個(gè)塊給進(jìn)程用,P2 以為自己在用 A 內存,實(shí)際上已經(jīng)被系統悄悄重定向到真正的 B 去了,甚至,當 P1 和 P2 共用了 C 內存,他們也不知道。
操作系統的這種欺騙進(jìn)程的手段,就是虛擬內存。對 P1 和 P2 等進(jìn)程來(lái)說(shuō),它們都以為自己占用了整個(gè)內存,而自己使用的物理內存的哪段地址,它們并不知道也無(wú)需關(guān)心。
虛擬內存是操作系統里的概念,對操作系統來(lái)說(shuō),虛擬內存就是一張張的對照表,P1 獲取 A 內存里的數據時(shí)應該去物理內存的 A 地址找,而找 B 內存里的數據應該去物理內存的 C 地址。
我們知道系統里的基本單位都是 Byte 字節,如果將每一個(gè)虛擬內存的 Byte 都對應到物理內存的地址,每個(gè)條目最少需要 8字節(32位虛擬地址->32位物理地址),在 4G 內存的情況下,就需要 32GB 的空間來(lái)存放對照表,那么這張表就大得真正的物理地址也放不下了,于是操作系統引入了頁(yè)(Page)的概念。
在系統啟動(dòng)時(shí),操作系統將整個(gè)物理內存以 4K 為單位,劃分為各個(gè)頁(yè)。之后進(jìn)行內存分配時(shí),都以頁(yè)為單位,那么虛擬內存頁(yè)對應物理內存頁(yè)的映射表就大大減小了,4G 內存,只需要 8M 的映射表即可,一些進(jìn)程沒(méi)有使用到的虛擬內存,也并不需要保存映射關(guān)系,而且Linux 還為大內存設計了多級頁(yè)表,可以進(jìn)一頁(yè)減少了內存消耗。操作系統虛擬內存到物理內存的映射表,就被稱(chēng)為頁(yè)表。
我們知道通過(guò)虛擬內存機制,每個(gè)進(jìn)程都以為自己占用了全部?jì)却?,進(jìn)程訪(fǎng)問(wèn)內存時(shí),操作系統都會(huì )把進(jìn)程提供的虛擬內存地址轉換為物理地址,再去對應的物理地址上獲取數據。CPU 中有一種硬件,內存管理單元 MMU(Memory Management Unit)專(zhuān)門(mén)用來(lái)將翻譯虛擬內存地址。CPU 還為頁(yè)表尋址設置了緩存策略,由于程序的局部性,其緩存命中率能達到 98%。
以上情況是頁(yè)表內存在虛擬地址到物理地址的映射,而如果進(jìn)程訪(fǎng)問(wèn)的物理地址還沒(méi)有被分配,系統則會(huì )產(chǎn)生一個(gè)缺頁(yè)中斷,在中斷處理時(shí),系統切到內核態(tài)為進(jìn)程虛擬地址分配物理地址。
虛擬內存不僅通過(guò)內存地址轉換解決了多個(gè)進(jìn)程訪(fǎng)問(wèn)內存沖突的問(wèn)題,還帶來(lái)更多的益處。
它有助于進(jìn)程進(jìn)行內存管理,主要體現在:
通過(guò)虛擬內存更容易實(shí)現內存和數據的共享。
在進(jìn)程加載系統庫時(shí),總是先分配一塊內存,將磁盤(pán)中的庫文件加載到這塊內存中,在直接使用物理內存時(shí),由于物理內存地址唯一,即使系統發(fā)現同一個(gè)庫在系統內加載了兩次,但每個(gè)進(jìn)程指定的加載內存不一樣,系統也無(wú)能為力。
而在使用虛擬內存時(shí),系統只需要將進(jìn)程的虛擬內存地址指向庫文件所在的物理內存地址即可。如上文圖中所示,進(jìn)程 P1 和 P2 的 B 地址都指向了物理地址 C。
而通過(guò)使用虛擬內存使用共享內存也很簡(jiǎn)單,系統只需要將各個(gè)進(jìn)程的虛擬內存地址指向系統分配的共享內存地址即可。
虛擬內存可以讓幫進(jìn)程”擴充”內存。
我們前文提到了虛擬內存通過(guò)缺頁(yè)中斷為進(jìn)程分配物理內存,內存總是有限的,如果所有的物理內存都被占用了怎么辦呢?
Linux 提出 SWAP 的概念,Linux 中可以使用 SWAP 分區,在分配物理內存,但可用內存不足時(shí),將暫時(shí)不用的內存數據先放到磁盤(pán)上,讓有需要的進(jìn)程先使用,等進(jìn)程再需要使用這些數據時(shí),再將這些數據加載到內存中,通過(guò)這種”交換”技術(shù),Linux 可以讓進(jìn)程使用更多的內存。
在了解虛擬內存時(shí),我也有過(guò)很多的問(wèn)題。
最常見(jiàn)的就是 32位和64位的問(wèn)題了。
CPU 通過(guò)物理總線(xiàn)訪(fǎng)問(wèn)內存,那么訪(fǎng)問(wèn)地址的范圍就受限于機器總線(xiàn)的數量,在32位機器上,有32條總線(xiàn),每條總線(xiàn)有高低兩種電位分別代表 bit 的 1 和 0,那么可訪(fǎng)問(wèn)的最大地址就是 2^32bit = 4GB,所以說(shuō) 32 位機器上插入大于 4G 的內存是無(wú)效的,CPU 訪(fǎng)問(wèn)不到多于 4G 的內存。
但 64位機器并沒(méi)有 64位總線(xiàn),而且其最大內存還要受限于操作系統,Linux 目前支持最大 256G 內存。
根據虛擬內存的概念,在 32 位系統上運行 64 位軟件也并無(wú)不可,但由于系統對虛擬內存地址的結構設計,64位的虛擬地址在32位系統內并不能使用。
操作系統使用了虛擬內存,我們想要直接操作內存該怎么辦呢?
Linux 會(huì )將各個(gè)設備都映射到/dev/目錄下的文件,我們可以通過(guò)這些設備文件直接操作硬件,內存也不例外。 在 Linux 中,內存設置被映射為/dev/mem,root 用戶(hù)通過(guò)對這個(gè)文件讀寫(xiě),可以直接操作內存。
使用 TOP 查看系統性能時(shí),我們會(huì )發(fā)現在 VIRT 這一列,Java 進(jìn)程會(huì )占用大量的虛擬內存。
導致這種問(wèn)題的原因是 Java 使用 Glibc 的 Arena 內存池分配了大量的虛擬內存并沒(méi)有使用。此外,Java 讀取的文件也會(huì )被映射為虛擬內存,在虛擬機默認配置下 Java 每個(gè)線(xiàn)程棧會(huì )占用 1M 的虛擬內存。具體可以查看為什么linux下多線(xiàn)程程序如此消耗虛擬內存。
而真實(shí)占用的物理內存要看RES(resident) 列,這一列的值才是真正被映射到物理內存的大小。
我們也可以自己來(lái)管理 Linux 的虛擬內存。
查看系統內存情況的方式有很多,free、vmstat等命令都可輸出當前系統的內存狀態(tài),需要注意的是可用內存并不只是 free 這一列,由于操作系統的 lazy 特性,大量的 buffer/cache 在進(jìn)程不再使用后,不會(huì )被立即清理,如果之前使用它們的進(jìn)程再次運行還可以繼續使用,它們在必要時(shí)也是可以被利用的。
此外,通過(guò)cat /proc/meminfo可以查看系統內存被使用的詳細情況,包括臟頁(yè)狀態(tài)等。詳情可參見(jiàn):/PROC/MEMINFO之謎。
如果想單獨查看某一進(jìn)程的虛擬內存分布情況,可以使用pmap pid命令,它會(huì )把虛擬內存各段的占用情況從低地址到高地址都列出來(lái)。
可以添加-XX參數來(lái)輸出更詳細的信息。
我們也可以修改 Linux 的系統配置,使用sysctl vm [-options] CONFIG或 直接讀寫(xiě)/proc/sys/vm/目錄下的文件來(lái)查看和修改配置。
虛擬內存的 SWAP 特性并不總是有益,放任進(jìn)程不停地將數據在內存與磁盤(pán)之間大量交換會(huì )極大地占用 CPU,降低系統運行效率,所以有時(shí)候我們并不希望使用 swap。
我們可以修改vm.swappiness=0來(lái)設置內存盡量少使用 swap,或者干脆使用swapoff命令禁用掉 SWAP。
虛擬內存的概念非常容易理解,但是它會(huì )衍生出來(lái)的一系列非常復雜的知識。本文只講了些基本原理,略過(guò)了很多細節,比如虛擬內存尋址中段寄存器的使用,操作系統使用虛擬內存增強緩存、緩沖區的應用等,有機會(huì )單獨拿出來(lái)說(shuō)。
以上就是淺談Linux的虛擬內存的詳細內容,更多關(guān)于Linux的虛擬內存的資料請關(guān)注腳本之家其它相關(guān)文章!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站