Ⅰ linux 內核的內存管理 - 概念
Concepts overview — The Linux Kernel documentation
Linux中的內存管理是一個復雜的系統,經過多年的發展,它包含越來越多的功能,以支持從 MMU-less microcontrollers 到 supercomputers 的各種系統。
沒有MMU內存管理的系統被稱為 nommu ,它值得寫一份專門的文檔進行描述。
盡管有些概念是相同的,這里我們假設MMU可用,CPU可以將虛擬地址轉換為物理地址。
計算機系統中的物理內存是有限資源,即便支持內存熱插拔,其可以安裝的內存也有限的。物理內存不一定必須是連續的;它可以作為一組不同的地址范圍被訪問。此外,不同的CPU架構,甚至同架構的不同實現對如何定義這些地址范圍都是不同的。
這使得直接處理物理內存異常復雜,為了避免這種復雜性,開發了 虛擬內存 (virtual memory) 的概念。
虛擬內存從應用軟體中抽象出物理內存的細節,只允許在物理內存中保留需要的信息 (demand paging) ,並提供一種機制來保護和控制進程之間的數據共享。
通過虛擬內存,每次內存訪問都訪問一個 虛擬地址 。當CPU對從系統內存讀取(或寫入)的指令進行解碼時,它將該指令中編碼的虛擬地址轉換為內存控制器可以理解的物理地址。
物理內存被切分為 頁幀 page frames 或 頁 pages 。頁的大小是基於架構的。一些架構允許從幾個支持的值中選擇頁大小;此選擇在內核編譯時設置到內核配置。
每個物理內存頁都可以映射為一個或多個 虛擬頁(virtual pages) 。映射關系描述在 頁表(page tables) 中,頁表將程序使用的虛擬地址轉換為物理內存地址。頁表以層次結構組織。
最底層的表包含軟體使用的實際內存頁的物理地址。較高層的表包含較低層表頁的物理地址。頂層表的指針駐留在寄存器中。
當CPU進行地址轉換的時候,它使用寄存器訪問頂級頁表。
虛擬地址的高位,用於頂級頁表的條目索引。然後,通過該條目訪問下級,下級的虛擬地址位又作為其下下級頁表的索引。虛擬地址的最低位定義實際頁內的偏移量。
地址轉換需要多次內存訪問,而內存訪問相對於CPU速度來說比較慢。為了避免在地址轉換上花費寶貴的處理器周期,CPU維護著一個稱為 TLB (Translation Lookaside Buffer)的用於地址轉換緩存(cache)。通常TLB是非常稀缺的資源,需要大內存工作應用程序會因為TLB未命中而影響性能。
很多現代CPU架構允許頁表的高層直接映射到內存頁。例如,x86架構,可以通過二級、三級頁表的條目映射2M甚至1G內存頁。在Linux中,這些內存頁稱為 大頁 (Huge) 。大頁的使用顯著降低了TLB的壓力,提高了TLB命中率,從而提高了系統的整體性能。
Linux提供兩種機制開啟使用大頁映射物理內存。
第一個是 HugeTLB 文件系統,即 hugetlbfs 。它是一個偽文件系統,使用RAM作為其存儲。在此文件系統中創建的文件,數據駐留在內存中,並使用大頁進行映射。
關於 HugeTLB Pages
另一個被稱為 THP (Transparent HugePages) ,後出的開啟大頁映射物理內存的機制。
與 hugetlbfs 不同,hugetlbfs要求用戶和/或系統管理員配置系統內存的哪些部分應該並可以被大頁映射;THP透明地管理這些映射並獲取名稱。
關於 Transparent Hugepage Support
通常,硬體對不同物理內存范圍的訪問方式有所限制。某些情況下,設備不能對所有可定址內存執行DMA。在其他情況下,物理內存的大小超過虛擬內存的最大可定址大小,需要採取特殊措施來訪問部分內存。還有些情況,物理內存的尺寸超過了虛擬內存的最大可定址尺寸,需要採取特殊措施來訪問部分內存。
Linux根據內存頁的使用情況,將其組合為多個 zones 。比如, ZONE_DMA 包含設備用於DMA的內存, ZONE_HIGHMEM 包含未永久映射到內核地址空間的內存, ZONE_NORMAL 包含正常定址內存頁。
內存zones的實際層次架構取決於硬體,因為並非所有架構都定義了所有的zones,不同平台對DMA的要求也不同。
多處理器機器很多基於 NUMA (Non-Uniform Memory Access system - 非統一內存訪問系統 )架構。 在這樣的系統中,根據與處理器的「距離」,內存被安排成具有不同訪問延遲的 banks 。每個 bank 被稱為一個 node ,Linux為每個 node 構造一個獨立的內存管理子系統。 Node 有自己的zones集合、free&used頁面列表,以及各種統計計數器。
What is NUMA?
NUMA Memory Policy
物理內存易失,將數據放入內存的常見情況是讀取文件。讀取文件時,數據會放入 頁面緩存(page cache) ,可以在再次讀取時避免耗時的磁碟訪問。同樣,寫文件時,數據也會被放入 頁面緩存 ,並最終進入存儲設備。被寫入的頁被標記為 臟頁(dirty page) ,當Linux決定將其重用時,它會將更新的數據同步到設備上的文件。
匿名內存 anonymous memory 或 匿名映射 anonymous mappings 表示沒有後置文件系統的內存。這些映射是為程序的stack和heap隱式創建的,或調用mmap(2)顯式創建的。通常,匿名映射只定義允許程序訪問的虛擬內存區域。讀,會創建一個頁表條目,該條目引用一個填充有零的特殊物理頁。寫,則分配一個常規物理頁來保存寫入數據。該頁將被標記為臟頁,如果內核決定重用該頁,則臟頁將被交換出去 swapped out 。
縱貫整個系統生命周期,物理頁可用於存儲不同類型的數據。它可以是內核內部數據結構、設備驅動DMA緩沖區、讀取自文件系統的數據、用戶空間進程分配的內存等。
根據內存頁使用情況,Linux內存管理會區別處理。可以隨時釋放的頁面稱為 可回收(reclaimable) 頁面,因為它們把數據緩存到了其他地方(比如,硬碟),或者被swap out到硬碟上。
可回收頁最值得注意的是 頁面緩存 和 匿名頁面 。
在大多數情況下,存放內部內核數據的頁,和用作DMA緩沖區的頁無法重用,它們將保持現狀直到用戶釋放。這樣的被稱為 不可回收頁(unreclaimable) 。
然而,在特定情況下,即便是內核數據結構佔用的頁面也會被回收。
例如,文件系統元數據的緩存(in-memory)可以從存儲設備中重新讀取,因此,當系統存在內存壓力時,可以從主內存中丟棄它們。
釋放可回收物理內存頁並重新調整其用途的過程稱為 (surprise!) reclaim 。
Linux支持非同步或同步回收頁,取決於系統的狀態。
當系統負載不高時,大部分內存是空閑的,可以立即從空閑頁得到分配。
當系統負載提升後,空閑頁減少,當達到某個閾值( low watermark )時,內存分配請求將喚醒 kswapd 守護進程。它將以非同步的方式掃描內存頁。如果內存頁中的數據在其他地方也有,則釋放這些內存頁;或者退出內存到後置存儲設備(關聯 臟頁 )。
隨著內存使用量進一步增加,並達到另一個閾值- min watermark -將觸發回收。這種情況下,分配將暫停,直到回收到足夠的內存頁。
當系統運行時,任務分配並釋放內存,內存變得碎片化。
雖然使用虛擬內存可以將分散的物理頁表示為虛擬連續范圍,但有時需要分配大的連續的物理內存。這種需求可能會提升。例如,當設備驅動需要一個大的DMA緩沖區時,或當THP分配一個大頁時。
內存地址壓縮(compaction ) 解決了碎片問題。
該機制將佔用的頁從內存zone的下部移動到上部的空閑頁。壓縮掃描完成後,zone開始處的空閑頁就並在一起了,分配較大的連續物理內存就可行了。
與 reclaim 類似, compaction 可以在 kcompactd守護進程中非同步進行,也可以作為內存分配請求的結果同步進行。
在存在負載的機器上,內存可能會耗盡,內核無法回收到足夠的內存以繼續運行。
為了保障系統的其餘部分,引入了 OOM killer 。
OOM killer 選擇犧牲一個任務來保障系統的總體健康。選定的任務被killed,以期望在它退出後釋放足夠的內存以繼續正常的操作。
Ⅱ 如何查看linux系統中空閑內存/物理內存使用/剩餘內存
Linux將物理抄內存按固定大小的頁面(一般為4K)劃分內存,在內核初始化時,會建立一個全局struct page結構數組mem_map[ ]。如系統中有76G物理內存,則物理內存頁面數為76*1024*1024k/4K= 19922944個頁面,mem_map[ ]數組大小19922944,即為數組中每個元素和物理內存頁面一一對應,整個數組就代表著系統中的全部物理頁面。 在伺服器中,存在NUMA架構(如Nehalem、Romly等),Linux將NUMA中內存訪問速度一致(如按照內存通道劃分)的部分稱為一個節點(Node),用struct pglist_data數據結構表示,通常使用時用它的typedef定義pg_data_t。系統中的每個結點都通過pgdat_list鏈表pg_data_t->node_next連接起來,該鏈接以NULL為結束標志。每個結點又進一步分為許多塊,稱為區域(zones)。區域表示內存中的一塊范圍。區域用struct zone_struct數據結構表示,它的typedef定義為zone_t。更多詳細的解答可以查看《Linux就該這么學》。
Ⅲ linux下如何查看伺服器物理內存狀況
查看內存使用情況,可以使用命令free敗鬧-m
其結果大致如下:
Mem:32108306811426012321165
-/+buffers/cache:939222715
Swap:34287126233025
在第一部分Mem行中有如下參數:
*total:內存總數,即32108MB
*used:已經使用的內存數,即30681MB
*free:空閑的內存數:即1426MB
*shared:當前已廢棄不用,總是0
*buffersBuffer:緩存內存數,即舉枯汪123MB
*cachedPage:緩存內存數,即421MB
其中,內存總數與已經使用內存數和空閑內存數的關系是:
total(32108)=used(30681)+free(1426)
在第二部分內容(-/+buffers/cache)中個參數如下所示:
(-buffers/cache):真正使用的內存數,即9392M,他指的是第一部分的used-buffers-cached
(+buffers/cache):可用的內存數,即22715M,他指的是第一部分的free+buffers+cached
其含義可以理解為:-buffers/cached反映的是被程序實實在在正仔用掉的內存,而+buffers/cached反映的是可以被使用(或者說挪用)的內存總數。
Ⅳ linux中查看物理內存和配置空間的命令是什麼
linux中查看物理內存的命令是:dmidecode -t memory | grep Size。
查看內存總數命令如下:#cat /proc/meminfo | grep MemTotal
MemTotal: 32941268 kB //內存32G
另外linux下在終端環境下可以使用free命令看到系統實際使用內存的情況,一般用free -m方式查看內存佔用情況(兆為單位)。
查看CPU方法指令如下:
1、 查看CPU個數
# cat /proc/cpuinfo | grep "physical id" | uniq | wc -l
2 **uniq命令運或:刪除重復行;wc _l命令:統計行數**
2、查看CPU核數
# cat /proc/cpuinfo | grep "cpu cores" | uniq
cpu cores : 4
3、查看CPU型號
# cat /proc/cpuinfo | grep 'model name' |uniq
model name : Intel(R) Xeon(R) CPU E5630 @ 2.53GHz
Linux已經成為工作、娛樂和個人生活等多個領域的支柱,人們已經越來越離不哪悄叢開它。在Linux的幫助下,技術的變革速度超出了人們的想像,Linux開發的速度也以指數規模增長。
因此,越來越多的開發者也不斷地加入開源和學習Linux開發地潮流當中。在這個過程之中,合適的工具是必不可少的,可喜的是,隨著Linux的發展,大量適用於Linux的開發工具也不斷成熟。
參李櫻考資料來源:網路—linux
Ⅳ linux中物理內存和虛擬內存
vmstat是Virtual Meomory Statistics(虛擬內存統計)的縮寫,可對操作系統的虛擬內存、進程、CPU活動進行監控。他是對系統的整體情況進行統計,不足之處是無法對某個進程進行深入分析。vmstat 工具提供了一種低開銷的系統性能觀察方式。因為 vmstat 本身就是低開銷工具,在非常高負荷的伺服器上,你需要查看並監控系統的健康情況,在控制窗口還是能夠使用vmstat 輸出結果。在學習vmstat命令前,我們先了解一下Linux系統中關於物理內存和虛擬內存相關信息。
物理內存和虛擬內存區別:
我們知道,直接從物理內存讀寫數據要比從硬碟讀寫數據要快的多,因此,我們希望所有數據的讀取和寫入都在內存完成,而內存是有限的,這樣就引出了物理內存與虛擬內存的概念。
物理內存就是系統硬體提供的內存大小,是真正的內存,相對於物理內存,在linux下還有一個虛擬內存的概念,虛擬內存就是為了滿足物理內存的不足而提出的策略,它是利用磁碟空間虛擬出的一塊邏輯內存,用作虛擬內存的磁碟空間被稱為交換空間(Swap Space)。
作為物理內存的擴展,linux會在物理內存不足時,使用交換分區的虛擬內存,更詳細的說,就是內核會將暫時不用的內存塊信息寫到交換空間,這樣以來,物理內存得到了釋放,這塊內存就可以用於其它目的,當需要用到原始的內容時,這些信息會被重新從交換空間讀入物理內存。
linux的內存管理採取的是分頁存取機制,為了保證物理內存能得到充分的利用,內核會在適當的時候將物理內存中不經常使用的數據塊自動交換到虛擬內存中,而將經常使用的信息保留到物理內存。
要深入了解linux內存運行機制,需要知道下面提到的幾個方面:
首先,Linux系統會不時的進行頁面交換操作,以保持盡可能多的空閑物理內存,即使並沒有什麼事情需要內存,Linux也會交換出暫時不用的內存頁面。這可以避免等待交換所需的時間。
其次,linux進行頁面交換是有條件的,不是所有頁面在不用時都交換到虛擬內存,linux內核根據」最近最經常使用「演算法,僅僅將一些不經常使用的頁面文件交換到虛擬內存,有時我們會看到這么一個現象:linux物理內存還有很多,但是交換空間也使用了很多。其實,這並不奇怪,例如,一個佔用很大內存的進程運行時,需要耗費很多內存資源,此時就會有一些不常用頁面文件被交換到虛擬內存中,但後來這個佔用很多內存資源的進程結束並釋放了很多內存時,剛才被交換出去的頁面文件並不會自動的交換進物理內存,除非有這個必要,那麼此刻系統物理內存就會空閑很多,同時交換空間也在被使用,就出現了剛才所說的現象了。關於這點,不用擔心什麼,只要知道是怎麼一回事就可以了。
最後,交換空間的頁面在使用時會首先被交換到物理內存,如果此時沒有足夠的物理內存來容納這些頁面,它們又會被馬上交換出去,如此以來,虛擬內存中可能沒有足夠空間來存儲這些交換頁面,最終會導致linux出現假死機、服務異常等問題,linux雖然可以在一段時間內自行恢復,但是恢復後的系統已經基本不可用了。
因此,合理規劃和設計linux內存的使用,是非常重要的。
虛擬內存原理:
在系統中運行的每個進程都需要使用到內存,但不是每個進程都需要每時每刻使用系統分配的內存空間。當系統運行所需內存超過實際的物理內存,內核會釋放某些進程所佔用但未使用的部分或所有物理內存,將這部分資料存儲在磁碟上直到進程下一次調用,並將釋放出的內存提供給有需要的進程使用。
在Linux內存管理中,主要是通過「調頁Paging」和「交換Swapping」來完成上述的內存調度。調頁演算法是將內存中最近不常使用的頁面換到磁碟上,把活動頁面保留在內存中供進程使用。交換技術是將整個進程,而不是部分頁面,全部交換到磁碟上。
分頁(Page)寫入磁碟的過程被稱作Page-Out,分頁(Page)從磁碟重新回到內存的過程被稱作Page-In。當內核需要一個分頁時,但發現此分頁不在物理內存中(因為已經被Page-Out了),此時就發生了分頁錯誤(Page Fault)。
當系統內核發現可運行內存變少時,就會通過Page-Out來釋放一部分物理內存。經管Page-Out不是經常發生,但是如果Page-out頻繁不斷的發生,直到當內核管理分頁的時間超過運行程式的時間時,系統效能會急劇下降。這時的系統已經運行非常慢或進入暫停狀態,這種狀態亦被稱作thrashing(顛簸)。
總結:物理內存就是硬體提供的真實的內存,比如我們電腦內存不夠了,就會加一個內存條
虛擬內存就是從磁碟上虛擬出來的一塊邏輯內存,用做虛擬內存的磁碟空間被稱為交換空間(Swap Space
經常使用的文件會優先放在物理內存,不經常使用的文件會放到虛擬內存裡面。
Ⅵ linux查看cpu核數和內存大小
linux查看cpu核數和內存大小命令分別為:
1、查看CPU個數*核心數:
cat /proc/cpuinfo |grep「physical id」 | uniq | wc -l
96 #一共96核
2、查看內存總數
#cat /proc/meminfo | grep MemTotal
MemTotal: 230993600 kB
Linux下查看CPU型號,內存大小,硬碟空間的命令:
1、查看CPU核數
cat /proc/cpuinfo | grep 「cpu cores」 | uniq
cpu cores : 12 #12是單顆CPU的核心數
2、查看CPU型號
cat /proc/cpuinfo | grep 『model name』 |uniq
model name : Intel® Xeon® CPU E7-4830 v3 @ 2.10GHz
3、查看linux物理內存數量及大小
dmidecode -t memory | grep Size: | grep -v 「No Mole Installed」
Ⅶ linux下如何查看伺服器物理內存狀況
$ free -mx0dx0a total used free shared buffers cachedx0dx0a Mem: 1002 769 232 0 62 421x0dx0a -/+ buffers/cache: 286 715x0dx0a Swap: 1153 0 1153x0dx0a 第一部分Mem行:x0dx0a total 內存總數: 1002Mx0dx0a used 已經使用的內存數: 769Mx0dx0a free 空閑的內存數: 232Mx0dx0a shared 當前已經廢棄不用,總是0x0dx0a buffers Buffer 緩存內存數: 62Mx0dx0a cached Page 緩存內存數:421Mx0dx0a 關系:total(1002M) = used(769M) + free(232M)x0dx0a 第二部分(-/+ buffers/cache):x0dx0a (-buffers/cache) used內存數:286M (指的第一部分Mem行中的used - buffers - cached)x0dx0a (+buffers/cache) free內存數: 715M (指的第一部分Mem行中的free + buffers + cached)x0dx0a 可見-buffers/cache反映的是被程序實實在在吃掉的內存,而+buffers/cache反映的是可以挪用的內存總數。x0dx0a 第三部分是指交換分區, 我想不講大家都明白.x0dx0a 我想大家看了上面,還是很暈.第一部分(Mem)與第二部分(-/+ buffers/cache)的結果中有關used和free為什麼這么奇怪.x0dx0a 其實我們可以從二個方面來如賀解釋.x0dx0a 對操作系虧毀統來講是Mem的參數.buffers/cached 都是屬於被使用,所以它認為free只有232.x0dx0a 對應用程序來講是(-/+ buffers/cach).buffers/cached 是等同可用的,因為buffer/cached是為了提高程序執行的性能,當程序使用內存時,buffer/cached會很快地被使用。x0dx0a 所以,以應用來看看,以(-/+ buffers/cache)的free和used為主.所以我們看這個就好了.另外告訴大家一些常識.Linux為了提高磁碟和內存渣空派存取效率, Linux做了很多精心的設計, 除了對dentry進行緩存(用於VFS,加速文件路 徑名到inode的轉換), 還採取了兩種主要Cache方式:Buffer Cache和Page Cache。前者針對磁碟塊的讀寫,後者針對文件inode的讀寫。這些Cache能有效縮短了 I/O系統調用(比如read,write,getdents)的時間。x0dx0a 記住內存是拿來用的,不是拿來看的.不象windows, 無論你的真實物理內存有多少,他都要拿硬碟交換文件來讀.這也就是windows為什麼常常提示虛擬空間不足的原因.你們想想,多無聊,在內存還有大部分 的時候,拿出一部分硬碟空間來充當內存.硬碟怎麼會快過內存.所以我們看linux,只要不用swap的交換空間,就不用擔心自己的內存太少.如果常常 swap用很多,可能你就要考慮加物理內存了.這也是linux看內存是否夠用的標准哦.
Ⅷ linux查看內存使用情況
linux查看內存使用情況的方法是使用free命令。
free命令是Linux系統中最常用的查看內存使用情況的命令之一。它可以顯示系統中的總內存、已使用內存、可用內存、緩存和交換空間等信息。實際上,個人認為,用戶無論使用哪種方法,都可以快速了解系統中的內存使用情況,從而更好地管理和優化系統資源。
Linux系統是一種開源的操作系統,它被廣泛應用於伺服器和嵌入式設備中。由於Linux系統的高度可定製性和靈活性,它成為了許多開發人員和系統管理員的首選操作系統。在Linux系統中,了解內存使用情況是非常重要的,因為內存是系統中最重要的資源之一。
Linux系統查看內存的注意事爛皮凱項
在進行內存查看之前,我們需要了握悔解一些基本的飢喚內存概念。內存是計算機中存儲數據的一種硬體設備,也是計算機系統的重要組成部分。
內存可以被分為物理內存和虛擬內存兩種類型。物理內存是計算機中實際存在的內存,而虛擬內存是操作系統為了滿足程序運行需要而使用的一種技術。
在Linux系統中,我們可以通過命令free來查看系統的內存使用情況。free命令會顯示系統的物理內存和虛擬內存的使用情況,包括總內存量、已使用內存量、空閑內存量和緩沖區和緩存的內存量等信息。了解這些概念可以幫助我們更好地理解系統的內存使用情況。
Ⅸ linux查看物理內存
linux怎麼查看物理內存呢,下面就讓我們來看看吧。Ⅹ Linux內存系統
維基網路——虛擬內存定義
All about Linux swap space
Linux將物理RAM (Random Access Memory) 劃分為稱為頁面的內存塊。交換是將一頁內存復制到硬碟上的預配置空間(稱為交換空間)以釋放改內存頁面上的過程。物理內存和交換空間的組合就是可用的虛擬內存量。
虛擬內存的那點事兒
進程是與其他進程共享CPU和內存資源的。為了有效的管理內存並減少出錯,現代操作系統提供了一種對主存的抽象概念,即:虛擬內存( Virtual Memory )。 虛擬內存為每個進程提供一個一致的,私有的地址空間,每個進程擁有一片連續完整的內存空間。
正如 維基網路 所說,虛擬內存不只是「使用硬碟空間來擴展內存」的技術。 虛擬內存的重要意義是它定義了一個連續的虛擬地址空間, 使得程序編寫難度降低。並且, 把內存擴展到硬碟空間只是使用虛擬內存的必然結果,虛擬內存空間會存在硬碟中,並且會被全部放入內存中緩沖(按需),有的操作系統還會在內存不夠的情況下,將一進程的內存全部放入硬碟空間中,並在切換到進程時再從硬碟讀取 (這也是Windows會經常假死的原因...)。
虛擬內存主要提供了如下三個重要的能力:
內存通常被組織為一個由M個連續的位元組大小的單元組成的數組。每個位元組都有一個唯一的物理地址 (Physical Address PA) ,作為到數組的索引。
CPU訪問內存最簡單直接的方法就是使用物理地址,這種定址方式稱為 物理定址 。
現代計算機使用的是一種被稱為虛擬定址 (Virtual Addressing) 的定址方式。 使用虛擬定址,CPU需要將虛擬地址翻譯成物理地址,這樣才能訪問到真實的物理內存。
虛擬定址需要硬體與操作系統之間相互合作。 CPU中含有一個被稱為內存管理單元 (Memory Management Unit,MMU) 的硬體,它的功能是將虛擬地址轉換稱為物理地址,MMU需要藉助存放在內存中的 頁表 來動態翻譯虛擬地址,該頁表由操作系統管理。
分頁表是一種數據結構,它用於計算機操作系統中虛擬內存系統,其存儲了虛擬地址到物理地址之間的映射。虛擬地址在訪問進程中是唯一的,而物理地址在硬體(比如內存)中是唯一的。
在操作系統中使用 虛擬內存 ,每個進程會認為使用一塊大的連續的內存,事實上,每個進程的內存散布在 物理內存 的不同區域。或者可能被調出到備份存儲中(一般是硬碟)。當一個進程請求自己的內存,操作系統負責把程序生成的虛擬地址,映射到實際存儲的物理內存上。操作系統在 分頁表 中存儲虛擬地址到物理地址的映射。每個映射被稱為 分頁表項(page table entry ,PTE) 。
在一個簡單的地址空間方案中,由虛擬地址定址的頁與物理內存中的幀之間的關系。物理內存可以包含屬於許多進程的頁。如果不經常使用,或者物理內存已滿,可以將頁面分頁到磁碟。在上圖中,並非所有頁面都在物理內存中。
虛擬地址到物理地址的轉換(即虛擬內存的管理)、內存保護、CPU高速緩存的控制。
現代的內存管理單元是以 頁 的方式,分割虛擬地址空間(處理器使用的地址范圍)的;頁的大小是2的n次方,通常為幾KB(位元組)。地址尾部的n位(頁大小的2的次方數)作為頁內的偏移量保持不變。其餘的地址位(address)為(虛擬)頁號。
內存管理單元通常藉助一種叫做轉譯旁觀緩沖器(Translation Lookaside Buffer,TLB)和相聯高速緩存來將虛擬頁號轉換為物理頁號。當後備緩沖器中沒有轉換記錄時,則使用一種較慢的機制,其中包括專用硬體的數據結構或軟體輔助手段。這個數據結構稱為 分頁表 ,頁表中的數據叫做 分頁表項 (page table entry PTE)。物理頁號結合頁偏移量便提供了完整的物理地址。
頁表 或 轉換後備緩沖器數據項應該包括的信息有:
有時候,TLB和PTE會 禁止對虛擬頁訪問 ,這可能是因為沒有RAM與虛擬頁相關聯。如果是這種情況,MMU將向CPU發出頁錯誤的信號,操作系統將進行處理,也許會尋找RAM的空白幀,同時建立一個新的PTE將之映射到所請求的虛擬地址。如果沒有空閑的RAM,可能必須關閉一個已經存在的頁面,使用一些替換演算法,將之保存到磁碟中(這被稱為頁面調度)。
當需要將虛擬地址轉換為物理地址時,首先搜索TLB,如果找到匹配(TLB)命中,則返回物理地址並繼續存儲器訪問。然而,如果沒有匹配(稱為TLB未命中),則MMU或操作系統TLB未命中處理器通常會查找 頁表 中的地址映射以查看是否存在映射(頁面遍歷),如果存在,則將其寫回TLB(這必須完成,因為硬體通過虛擬存儲器系統中的TLB訪問存儲器),並且重啟錯誤指令(這也可以並行發生)。此後續轉換找到TLB命中,並且內存訪問將繼續。
虛擬地址到物理地址的轉換過程,如果虛擬內存不存在與TLB,轉換會被重置並通過分頁表和硬體尋找。
通常情況下,用於處理此中斷的程序是操作系統的一部分。如果操作系統判斷此次訪問有效,那麼 操作系統會嘗試將相關的分頁從硬碟上的虛擬內存文件調入內存。 而如果訪問是不被允許的,那麼操作系統通常會結束相關的進程。
雖然叫做「頁缺失」錯誤,但實際上這並不一定是一種錯誤。而且這一機制是利用虛擬內存來增加程序可用內存空間。
發生這種情況的可能性:
當原程序再次需要該頁內的數據時,如果這一頁確實沒有被分配出去,那麼系統只需要重新為該頁在MMU內注冊映射即可。
操作系統需要:
硬性頁缺失導致的性能損失是很大的。
另外,有些操作系統會將程序的一部分延遲到需要使用的時候再載入入內存執行,以此提升性能。這一特性也是通過捕獲硬性頁缺失達到的。
當硬性頁缺失過於頻繁發生時,稱發生 系統顛簸。
具體動作與所使用的操作系統有關,比如Windows會使用異常機制向程序報告,而類Unix系統則使用信號機制。
盡管在整個運行過程中,程序引用不同的頁面總數(也就是虛擬內存大小)可能超出了物理存儲器(DRAM)總大小,但是程序常常在較小的活動頁面上活動,這個集合叫做工作集或者常駐集。在工作集被緩存後,對它的反復調用會使程序命中提高,從而提高性能。
大部分的程序都可以在存儲器獲取數據和讀取中達到穩定的狀態,當程序達到穩定狀態時,存儲器的使用量通常都不會太大。虛擬內存雖然可以有效率控制存儲器的使用, 但是大量的頁缺失還是造成了系統遲緩的主要因素。 當工作集的大小超過物理存儲器大小,程序將會發生一種不幸的情況,這種情況稱為 「顛簸」 ,頁面將不停的寫入、釋放、讀取,由於大量的丟失(而非命中)而損失極大性能。用戶可以增加隨機存取存儲器的大小或是減少同時在系統里運行程序的數量來降低系統顛簸的記錄。
推薦閱讀:
操作系統--分頁(一)
操作系統實現(二):分頁和物理內存管理