系統內存管理:虛擬內存、內存分段與分頁、頁表緩存TLB以及Linux內存管理
虛擬內存是一種操作系統提供的機制,用于將每個進程分配的獨立的虛擬地址空間映射到實際的物理內存地址空間上。通過使用虛擬內存,操作系統可以有效地解決多個應用程序直接操作物理內存可能引發的沖突問題。
在使用虛擬內存的情況下,每個進程都有自己的獨立的虛擬地址空間,它們不能直接訪問物理內存地址。當程序訪問虛擬內存地址時,操作系統會進行地址轉換,將虛擬地址映射到物理地址上,這樣不同的進程運行時,寫入的是不同的物理地址,避免了互相覆蓋指針的問題。
虛擬內存的使用使得每個進程都可以擁有相同的虛擬地址空間,而不用擔心與其他進程的地址沖突。操作系統負責管理虛擬地址和物理地址之間的映射關系,并在需要時進行地址轉換。這樣,進程可以以一種透明的方式訪問內存,無需關心內存的實際物理位置。
(資料圖片僅供參考)
通過虛擬內存機制,操作系統能夠更好地管理系統內存資源,提供更高的安全性和穩定性。它可以為每個進程提供獨立的地址空間,保護進程間的數據隔離,同時也可以有效地利用物理內存,將不常用的數據交換到磁盤上(交換區),以提供更大的可用內存空間。
內存分段在分段機制下,虛擬地址由兩部分組成:段選擇子和段內偏移量。段選擇子是一個索引,用于指定要訪問的段的起始地址和長度。段內偏移量則表示在該段內的具體位置。
操作系統會維護一個段表,其中包含了每個段的起始地址和長度信息。當程序訪問一個虛擬地址時,操作系統會通過段選擇子從段表中找到對應的段描述符,然后根據段描述符中的信息計算出物理地址。
具體的映射過程如下:
程序訪問虛擬地址,通過段選擇子找到對應的段描述符。根據段描述符中的基址和長度信息,計算出段的起始物理地址。將段的起始物理地址與段內偏移量相加,得到最終的物理地址。不過,需要注意的是,分段機制可能會導致內存碎片的問題,因為不同段的大小可能不同,導致一些碎片化的空間無法被利用。當不夠內存分配的時候,會選擇使用內存交換,先把一塊正在使用的內存移到磁盤中,然后再移回來把中間留的內存縫隙全用上,雖然解決了內存碎片的問題,但是這個交換操作很慢,效率低,看下圖示:
虛擬內存、分段和內存交換似乎解決了同時運行多個程序的問題,但仍存在性能瓶頸。由于硬盤訪問速度較慢,每次內存交換都需要將大段連續的內存數據寫入硬盤。因此,如果交換的是占用大量內存空間的程序,整個系統會變得卡頓。
為了解決內存分段的碎片和提高內存交換效率,引入了內存分頁機制。
內存分頁內存分頁是將整個虛擬和物理內存空間劃分為固定大小的連續內存塊,稱為頁(Page)。在Linux下,每一頁的大小通常為4KB。虛擬地址與物理地址之間通過頁表進行映射,頁表存儲在CPU的內存管理單元(MMU)中,從而CPU可以直接通過MMU找到實際訪問的物理內存地址。
虛擬地址與物理地址之間通過頁表來映射,如下圖:
由于內存空間事先劃分為固定大小的頁,不會像分段機制那樣產生碎片。當釋放內存時,以頁為單位進行釋放,避免了無法利用的小內存塊。
如果內存空間不足,操作系統會將其他正在運行的進程中的"最近未使用"的內存頁面暫時存儲到硬盤上,稱為換出(Swap Out)。當需要時,再將頁面加載回內存,稱為換入(Swap In)。因此,每次寫入硬盤的是少量的一頁或幾頁,不會花費太多時間,從而提高了內存交換的效率。
簡單分頁簡單分頁存在空間上的缺陷。在操作系統可以同時運行大量進程的情況下,頁表會變得非常龐大。在32位環境下,虛擬地址空間為4GB,假設頁的大小為4KB,就需要大約100萬個頁。每個頁表項需要4字節來存儲,所以整個4GB空間的映射需要4MB的內存來存儲頁表。
盡管4MB的頁表看起來并不算太大,但要注意每個進程都有自己的虛擬地址空間,也就是說每個進程都有自己的頁表。如果有100個進程,就需要400MB的內存來存儲頁表,這對于內存來說是相當大的開銷,更不用說64位環境下了。
多級頁表要解決上述問題,我們可以采用一種叫做多級頁表(Multi-Level Page Table)的解決方案。在之前我們已經了解到,在32位環境下,頁大小為4KB的情況下,一個進程的頁表需要存儲100多萬個頁表項,每個項占用4字節的空間,因此一個頁表需要4MB的內存空間。
為了節省內存空間,我們可以將單級頁表進行分頁,將一個頁表(一級頁表)分為1024個頁表(二級頁表),每個二級頁表包含1024個頁表項,形成二級分頁結構。這樣一級頁表覆蓋整個4GB的虛擬地址空間,而對于未使用的頁表項,不會創建對應的二級頁表,只在需要時才創建。如下圖所示:
換個角度來看,大多數程序未使用到整個4GB的虛擬地址空間,因此部分頁表項是空的,沒有分配實際的內存空間。在物理內存緊張的情況下,操作系統會將最近一段時間未訪問的頁表換出到硬盤,從而釋放物理內存。使用二級分頁,一級頁表只需要覆蓋整個4GB的虛擬地址空間,而未使用的頁表項不需要創建對應的二級頁表。假設只有20%的一級頁表項被使用,那么頁表占用的內存空間只有0.804MB,相比于單級頁表的4MB,內存節約非常巨大。
為什么不分級的頁表無法實現這樣的內存節約呢?從頁表的性質來看,頁表保存在內存中,其主要作用是將虛擬地址翻譯為物理地址。如果在頁表中找不到對應的頁表項,計算機系統將無法正常工作。因此,頁表必須覆蓋整個虛擬地址空間。而不分級的頁表需要100多萬個頁表項進行映射,而二級分頁只需要1024個頁表項(一級頁表覆蓋整個虛擬地址空間,二級頁表在需要時創建)。
頁表緩存TLB(Translation Lookaside Buffer)TLB(Translation Lookaside Buffer)是一個位于CPU芯片中的緩存,用于存儲程序中最常訪問的頁表項,以加快虛擬地址到物理地址的轉換速度。多級頁表雖然解決了空間上的問題,但是增加了轉換的工序,導致時間上的開銷。然而,由于程序的局部性原理,程序執行期間通常僅限于某一部分,訪問的存儲空間也局限于某個內存區域。因此,通過將最常訪問的頁表項存儲到TLB這個硬件緩存中,可以更快地進行地址轉換。
在CPU芯片中,內存管理單元(Memory Management Unit)芯片負責處理地址轉換和TLB的訪問與交互。當CPU進行尋址時,首先會查找TLB,如果找到了對應的頁表項,就可以直接進行物理地址的訪問,避免了繼續查找常規頁表的開銷。
由于TLB中存儲的是程序最常訪問的幾個頁表項,所以TLB的命中率通常是很高的。這是因為程序執行過程中,訪問的頁表項相對固定。通過利用TLB,可以大大提高地址轉換的速度,加快程序的執行效率。
Linux內存管理Linux內存管理涉及邏輯地址和線性地址的轉換。邏輯地址是程序使用的地址,而線性地址是通過段式內存管理映射的地址,也稱為虛擬地址。
Linux的虛擬地址空間分為內核空間和用戶空間兩部分。32位系統中,內核空間占用1G,剩下的3G是用戶空間;64位系統中,內核空間和用戶空間都是128T,分別占據內存空間的最高和最低處。如下所示:
進程在用戶態時只能訪問用戶空間內存,進入內核態后才能訪問內核空間內存。雖然每個進程都有獨立的虛擬內存,但虛擬內存中的內核地址關聯的是相同的物理內存,這樣進程切換到內核態后就可以方便地訪問內核空間內存。
總結虛擬內存是操作系統提供的一種機制,通過將每個進程分配的獨立的虛擬地址空間映射到實際的物理內存地址空間上,解決了多個應用程序直接操作物理內存可能引發的沖突問題。虛擬內存的使用使得每個進程都可以擁有相同的虛擬地址空間,而不用擔心與其他進程的地址沖突。通過虛擬內存機制,操作系統能夠更好地管理系統內存資源,提供更高的安全性和穩定性。虛擬內存的實現方式有分段和分頁,其中分頁機制更為常用,采用多級頁表的方式節約了內存空間。頁表緩存TLB能夠加快虛擬地址到物理地址的轉換速度。Linux的內存管理涉及邏輯地址和線性地址的轉換,將虛擬地址空間分為內核空間和用戶空間,方便進程訪問內核空間內存。
關鍵詞:
您可能也感興趣:
為您推薦
日本排放核污水 我們需要囤鹽嗎?
全市優化提升營商人文環境工作推進會第二次會議舉行 全面推動營商人文環境工作提質增效
菲薩約·德萊-巴什魯(關于菲薩約·德萊-巴什魯簡述)
排行
最近更新
- 系統內存管理:虛擬內存、內存分段與分頁、頁表緩存TLB以及Li...
- AI加持,讓高清時代年輕人愛上老電影
- 山東一市最新人事任免
- 好消息!長寧這些地方的“免費帶娃”服務,可以線上預約啦→
- 核污染概念股繼續走強,大湖股份3連板
- 第9號臺風“蘇拉”生成 路徑怪異對廣州有無影響?
- 藍月亮2023年中期業績發布 營收約22.2億港元 毛利率提升至55.2%
- 現代大廈(總部商務寫字樓)買房首付是多少成?現代大廈(總部商...
- 大公司動態:8家鋼廠漲價,安徽長江擬9月電爐停產
- 部分銀行下調存款利率 持續降低實體經濟融資成本
- 中非領導人對話會聯合聲明
- 文化周刊·讀書丨新書過眼
- 8月24日基金凈值:諾安先鋒混合A最新凈值2.5548,漲0.44%
- 8月24日基金凈值:建信新能源行業股票A最新凈值1.5905,漲1.28%
- 8月24日基金凈值:廣發制造業精選混合A最新凈值4.233,漲0.98%
- 到2025年新增污水處理能力1200萬立方米/日 污水處理在A股市...
- 山西汾酒(600809)Q2符合市場預期,看好汾酒中長期優質資產
- 洽洽食品(002557)公司事件點評報告:業績符合預期,成本有望改善
- 社保基金現身291只股前十大流通股東榜
- 282人!浙江省中小學教壇新秀候選人名單公示,有你認識的嗎
- 新能源車:油電反轉
- 研究發現人們對數千種人類蛋白質幾乎一無所知
- 通策醫療:種植牙集采對半年報毛利潤基本沒有影響
- 漯評|答好今年“后半程”發展考卷 ——深入貫徹落實市委八...
- 南陽市宛城區:產業振興促進移民村鄉村振興
- 奔赴淘寶,俞敏洪直播四處“趕集”
- 凈利潤大降!換帥后的興銀基金如何崛起?
- 貢茶哪個是正宗的 加盟奶茶店10大品牌加盟費多少錢
- 徐州村BA比賽時間是什么時候2023年? 徐州村鎮
- 商城縣醫保中心地址及電話 商城縣醫保中心地址及電話號碼