首页
/
每日頭條
/
生活
/
虛拟内存是什麼怎麼實現
虛拟内存是什麼怎麼實現
更新时间:2024-11-18 06:11:08

前言:存為了更加高效并且少出錯,現代操作系統提供了一種對主存的抽象概念,叫做虛拟内存。虛拟内存是硬件異常,硬件地址翻譯,主存,磁盤文件和内核軟件的完美交互,他為每個進程提供了一個大的,一緻和私有的地址空間,虛拟内存提供三個能力:它将主存看成是一個存儲在磁盤上的地址空間的高速緩存,在主存中隻保存活動區域,并根據需要在主存和磁盤之間來回傳送數據,通過這種方式高效使用了主存他為每個進程提供了一緻的地址空間,從而簡化了内存管理它保護了每個進程的地址空間不被其他進程破壞。

物理和虛拟尋址

計算機主存被組織成一個由M個連續的字節大小的單元組成的數組。每字節都有一個唯一的物理地址,每一個字節的地址為0,接下來的字節地址為1,在下一個為2,以此類推,給定這種簡單的結構,CPU訪問内存的最自然的方式就是使用物理地址,我們把這種方式稱為物理尋址。

現在操作系統都是用虛拟尋址的尋址形式。CPU通過生成一個虛拟地址來訪問内存,這個虛拟地址在送到内存之前會被轉換成适當的物理地址,将虛拟地址轉換成物理地址這一過程成為地址翻譯。需要硬件系統個操作系統之間的緊密配合,CPU芯片上的叫做内存管理單元的專用硬件,利用存放在主存中的查詢表來動态翻譯虛拟地址,該表的内容由操作系統管理。

地址空間:地址空間是一個由非負整數組成的有序集合。一個地址空間大小是由表示最大地址所需要的位數描述的,例如一個包含N=2^n個地址的虛拟地址空間就叫做一個n位地址空間。現在操作系統通常支持32位或者64位尋地址空間。

地址空間區分了數據對象和他們的屬性,一旦認識到這種區别,我們就可以将其推廣,允許每個數據對象有多個獨立的地址空間,其中每個地址都選自不同的地址空間,這是虛拟内存的基本思想。主存中的每個字節都以一個選自虛拟地址空間和一個選自物理地址空間的物理地址。

虛拟内存作為緩存的工具:

虛拟内存被組織成一個有存放在磁盤上的N個連續的字節大小的單元組成的數組,每字節都有唯一的虛拟地址,作為數組的索引,磁盤上的内容被緩存在主存中,和存儲器層次結構中的其他緩存一樣,磁盤上的數據被分割成塊,這些塊被分割成磁盤和主存之間的傳輸單元,VM系統通過将虛拟内存分割成稱為虛拟頁的大小固定的塊來處理這個問題,每個虛拟頁的大小為P=2^p字節,類似的,物理内存被分割成物理頁,大小為p字節。被稱為頁幀。

在任意時刻,虛拟頁面都分為三個不相交的子集:

  1. 未分配的:VM系統還未分配的頁,未分配的塊沒有任何數據和他們相關聯,因此,也就不占用任何磁盤空間。
  2. 緩存的:當前已經緩存在物理内存中的已經分配的頁
  3. 為緩存的:未緩存到物理内存中已分配的頁

DRAM緩存的組織結構:

SRAM為CPU和主存之間的L1,L2,L3高速緩存DRAM表示虛拟内存系統的緩存,他在主存中緩存虛拟頁DRAM要比SRAM慢10倍,而磁盤要比DRAM慢大約100000倍,因此DRAM不命中比起SRAM不命中要昂貴的多。因為DRAM緩存不命中是由磁盤來服務的。

在習慣說法中,DRAM緩存不命中,我們稱為缺頁。

一次缺頁的處理過程:

虛拟内存是什麼怎麼實現(什麼是虛拟内存呢)1

如上圖所示:CPU引用了vp3一個字,vp3并未緩存在内存中(DRAM)中,地址翻譯硬件會從内存中讀取PTE3,從有效位推斷vp3未被緩存,并觸發一個缺頁異常,缺頁異常調用内核中的缺頁異常處理程序,該程序會選擇一個犧牲頁,在此例中就是vp4,如果vp4被修改了,那麼内核就會将其複制回磁盤,無論哪種情況,内核都會修改vp4的頁表條目PTE4,反應vp4不再緩存在主存中這一事實。

接下來,内核從磁盤複制vp3到内存中的原來vp4的位置,更新PTE3,随後返回,當異常處理程序返回時,他會重新啟動導緻缺頁的指令,該指令會将導緻缺頁的虛拟地址發送給地址翻譯硬件,現在vp3已經被緩存到主存中了,那麼頁命中也能由地址翻譯硬件處理了。

下面是完成卻也異常處理的示意圖:

虛拟内存是什麼怎麼實現(什麼是虛拟内存呢)2

在虛拟内存的說法中,塊被稱為頁,在磁盤和内存之間傳送頁的活動叫做頁面調度。頁從磁盤換入DRAM和從DRAM換出磁盤,一直到最後時刻,也就是當不命中發生時,才換入頁面的這種策略,稱為按需頁面調度。調用malloc會使磁盤新的頁面在磁盤上産生。

局部性

盡管在整個運行期間程序引用的不同頁面的總數可能超出物理内存總大小,但是局部性原則保證了在任意時刻,程序趨向在一個較小活動頁面上工作,這個集合叫做工作集,或者常駐集合,在初始開銷,将工作集頁面調度到主存之後,接下來對這個工作集的引用将導緻命中,而不會産生額外開銷。隻要程序有好的時間局部性,虛拟内存系統就能工作相當好,如果工作集的大小超出了物理内存的大小,程序将産生一種不幸的狀态,叫做抖動,這個時候頁面會被不停的換進與換出。使得程序性能下降。

按需頁面調度和獨立的虛拟地址空間的結合,對系統中内存的使用和管理造成了深遠的影響,VM簡化了連接與加載,代碼和數據共享,以及應用程序的内存分配。

簡化鍊接:獨立的地址空間允許每個進程的内存映像使用相同的基本格式,而不管代碼和數據實際存放在物理内存何處。

簡化加載:虛拟内存還使得容易向内存中加載可執行文件和共享對象文件。

将一組連續的虛拟頁映射到任意一個文件中的任意位置表示法稱為内存映射。

簡化共享:獨立的地址空間為操作系統提供了一個管理用戶進程和操作系統的自身之間共享的一緻機制。一般而言,每個進程都有自己私有的代碼、數據、堆以及棧區,是不和其他進程共享的,在這種情況下,操作系統創建頁表,将相應的虛拟頁映射到不連續的物理頁面。

在一些情況下,還是需要進程來共享數據和代碼,比如每個進程必須調用相同的操作系統内核代碼,而每個C程序都會調用C标準庫中的程序,操作系統通過将不同進程中适當的頁面映射到相同的物理頁面,從而安排多個進程共享這部分代碼的副本,而不是每個進程單獨擁有内核或者C标準庫。

簡化内存分配:虛拟内存為用戶提供了簡化内存分配的機制,當一個運行在用戶進程中的程序要求分配額外的堆空間的話,操作系統分配相應适當的數字個連續個虛拟内存頁面,并且将它們映射到物理内存中任意位置的k個任意的物理頁面,由于頁表的工作方式,沒必要分配連續的物理頁面,而是随機分散在物理内存中。

虛拟内存作為内存保護的工具:

現代計算機系統必須為操作系統提供手段來控制對内存系統的訪問,不應該允許一個進程修改他的隻讀代碼段,而且也不用改允許他讀或者修改任何内核中的代碼或者數據結構。不應該允許他讀或者寫其他進程的私有内存,并且不允許他修改與其他進程共享的虛拟頁面,除非共享者都顯式地允許他這麼做。

每次CPU生成一個地址時,地址翻譯硬件都會讀一個PTE,所以通過在PTE上添加一些額外的許可位來控制對一個虛拟頁面的訪問十分簡單。

虛拟内存是什麼怎麼實現(什麼是虛拟内存呢)3

虛拟内存是什麼怎麼實現(什麼是虛拟内存呢)4

更多LINUX内核免費文檔 面試資料教程視頻資料關注 私信1自行領取

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
Copyright 2023-2024 - www.tftnews.com All Rights Reserved