微吼云上線多路互動直播服務 加速多場景互動直播落地
791
2022-05-28
原文地址An introduction to virtual memory
計算機是用來執行簡單任務的復雜機器:比如 上網、文本編輯、網頁服務、視頻游戲……,還可以對數據進行操作,圖片 音樂 文本 數據庫……
當計算機不使用的時候,程序和數據都安靜地躺在磁盤里,即便你關機了數據也會在。運行一個應用就是讓處理器(CPU)讀取和執行程序代碼的機器指令處理數據。
磁盤可以保存大量的信息,但存取的時候都非常非常慢,比CPU慢得多,如果CPU直接從磁盤中讀取指令,顯然會成為整個系統的性能瓶頸。為此,主存/內存(RAM)就誕生了,內存是比磁盤小,但讀寫速度快得多的存儲設備。應用運行時其程序和數據首先拷貝到內存中,這樣處理器就可以在內存中讀寫數據,從而避免了大量的等待。
主存可以看作是一個很長的單元格列表,每個單元格包含一些二進制數據,并用一個稱為內存地址的數字進行標記。根據系統中可用的主存數量,內存地址的范圍從0到N。程序使用的地址范圍稱為地址空間。
早期計算機的內存使用
在早期的計算機中(現在也見于某些嵌入式系統),程序是可以訪問整個內存空間的,內存的管理也得由程序員自己實現。在這種類型的計算機上寫程序是一種挑戰,因為程序員得找到一種好的內存管理方式,以確保各程序之間內存不會覆蓋和干擾。
問題在多任務的時候更復雜,因為程序員必須面對更嚴峻的問題?
內存布局 —— 當第一個程序分配走特定數目的內存空間后,可用內存初始范圍將不再是0-n了,開發者得妥善處理內存偏移。
內存分段。當內存被不斷地分配回收之后,可用空間會逐漸變成越來越小的碎片,會越來越難以找到整塊的空間分配給新的程序或者數據。
安全性。 如果程序A不小心覆蓋了程序B的數據?或者有人故意從其他進程中讀取敏感數據,比如密碼和信用卡信息?
所以在1960年代初期,找到一種能自動管理內存方式尤為關鍵,這可以大幅度簡化代碼編寫,并修復潛在的內存問題。最終誕生了我們今天要說的虛擬內存。
虛擬內存簡介
在虛擬內存中程序并不直接訪問物理內存,而是和虛擬內存地址空間交互。操作系統和處理器將虛擬內存地址轉化為物理內存地址。
進程每次的內存的讀寫都是在虛擬內存地址之上的,虛擬地址并不執行特定的物理地址,所以每次內存訪問時程序并不知道硬件層面發生了什么。
虛擬內存的優點
在上圖中我們可以看到虛擬地址和物理地址之間的映射關系,這種映射關系帶來了兩個好處。
每個程序都可以有一個從0開始的虛擬內存地址空間,這大大簡化了程序猿的編碼,因為不需要再去手動維護內存地址的偏移了。
即便物理內存地址不連續但虛擬內存地址可以做到總是連續的,這樣操作系統算是間接完成了將內存碎片合并成一塊可用內存的艱巨工作。
虛擬內存機制也解決了內存有限的問題,因為操作系統可以給每個進程分配比實際內存大的多的虛擬內存空間。另外虛擬內存也可以保證安全性,程序A無法在不觸發操作系統錯誤的情況下讀取到程序B的數據,下文中我們將會介紹這一切是如何實現的。
分頁
虛擬內存機制需要一個地方來存儲虛擬地址和物理地址之間的映射關系,因為我們需要將虛擬地址X轉化為物理地址Y,當然你不能用1:1的映射,因為這樣的映射關系數據將和實際內存一樣大。
現代虛擬內存將多個固定大小的整塊物理內存合并成一個列表管理,解決了上述映射關系過大的問題,這種實現方式就叫做分頁。其中每一塊在虛擬內存中叫頁面在物理內存中叫頁框,每一個頁面和頁框是對應的。CPU的內存管理單元(MMU)以一種叫做頁表的特殊數據結果存儲這虛擬頁框到物理頁框的映射關系。頁表好比是有個數據庫,每一行都存儲這頁號+頁框對應的物理內存地址。每個進程在MMU中都會有自己的頁表,如下圖。
頁表到頁框的轉化
虛擬內存地址由兩部分組成
頁號(頁索引),標識這個虛擬內存地址屬于哪個頁面。
頁內偏移,標識這個地址在頁框中的具體位置。
這些信息足夠MMU將一個虛擬地址轉化為物理地址了。當一個進程讀寫一個虛擬地址時,它先喚醒MMU從虛擬地址中截取出頁號并根據頁表找到相應的頁框,當頁框根據頁內偏移計算出實際的物理地址,到這里轉化就完成了。這時候程序就有了一個實際可讀寫的物理內存地址。
虛擬內存的背后
當程序有了連續、整潔的虛擬內存空間后,操作系統和硬件在后臺對物理內存做一些很瘋狂的事了。
例如:操作系統的延時加載,數據并不是在程序開始運行前就加載數據,而是等到程序實際需要使用時才加載。所有你會發現有些時候可能某個程序的頁面對應一些不存在的頁框或者是還沒有分配的頁框。比如上圖中的最后兩個頁面就沒有指向任何頁框。
像這樣的取巧的手段對應用程序是完全透明的,它保持讀取和寫入自己的虛擬地址空間而不受背景噪音的影響。但是,程序遲早要訪問一個沒有映射到RAM的虛擬地址:該怎么辦
缺頁錯誤(中斷)
缺頁中斷發生于當程序嘗試去訪問一個沒有映射到物理頁框的虛擬地址時。更準確地講,缺頁中斷發生于程序訪問一個虛擬內存地址存在但在物理內存中沒有對應地址的情況。
當MMU檢測到缺頁中斷后會將中斷信息轉交給操作系統,操作系統會嘗試去找到虛擬地址到物理地址的映射,大多數情況下這個是一個很簡單的操作,除非物理內存已經耗盡。
分頁,當物理內存不足時如何實現?
分頁也帶來一個其他的好處。當物理內存不足時,操作系統可以把部分頁面寫入到磁盤中騰出空間。盡管不夠百分百準確,但這種方法有時也叫做swapping(交換),Swapping其實是把整個進程都挪到磁盤中,當然現在有些操作系統在必要的時候也會這么做。
分頁給了程序一種有無限可用內存的假象。操作系統樂觀地允許一個比物理內存更大的虛擬內存地址空間,因為在需要的情況下數據可以被換進和換出硬盤。有些系統(例如Windows)會使用一個稱為分頁文件的特殊文件來達到這個目的。其他操作系統(例如Linux)有一個專用的硬盤分區,稱為交換分區(由于歷史原因,現代Linux執行分頁而不是交換)。
抖動
當操作系統花更多的數據在執行分頁而不是應用程序的時候就會發生抖動,一般是由一系列的缺頁中斷導致的。這種情況極易發生在當你運行大量超過物理內存大小的程序時或者硬盤交換分區沒有做優化時。這時候操作系統會努力執行大量的缺頁中斷,持續把數據從硬盤中移動到物理內存中,最終可能讓系統卡住。解決方法是加大內存或者減少進程數量或者調整交換分區大小。
內存保護
虛擬內存也提供了跨進程的安全性。你的瀏覽器無法在不侵入操作系統的情況下窺探你文本編輯器里的內容,因為它無法訪問不屬于自己的內存空間。
內存保護機制是由MMU和其管理的頁表實現的,也許其他硬件有不同的實現策略。當程序試圖訪問不屬于它的虛擬內存時,會觸發invalid page 錯誤。MMU和操作系統捕捉到這個信號,并引發一個名為段錯誤(segmentation fault)(Unix)或無效訪問(access violation)(Windows),操作系統然后就會直接殺死這個進程。
段錯誤和無效訪問可能會程序錯誤而產生。能夠手動管理內存的編程語言允許你自己管理一部分內存用來存儲程序數據,操作系統會給你劃分出一段空閑內存(又名緩沖區),以便根據你的程序需要進行讀寫。但是,沒有什么可以阻止你在緩沖區邊界之外讀寫,訪問不屬于您的程序或根本不存在的內存時,操作系統就會報出非法訪問的信號。
更多內容
虛擬內存的技術為很多有趣的課題鋪平了道路,比如內存文件就顛覆了傳統的文件讀取方式,傳統的文件讀取方式是把文件拷貝到內存里,取而代之內存映射的方式是把整個文件都加載到內存后直接在內存里操作。在必要時,虛擬內存機制將像往常一樣負責將數據從硬盤驅動器移動到RAM。內存映射文件簡化了程序員的工作也加快文件訪問。更多信息參考這里。
虛擬內存也讓統計內存消耗變得更加困難。假設你的一個程序占用了300m的內存:它是虛擬的還是物理的?該空間的一部分是否分頁到磁盤?如果是,分頁操作是否足夠快?此外,如果您想使系統處于良好狀態,那么調優分頁文件/交換區域是一個重要的步驟。操作系統提供了許多度量和調整內存的工具:點擊這里查看。
參考資料
Computer Hope — Memory
Peter J. Denning — Before memory was virtual
Android Authority — What is virtual memory?
Kernel.org — Memory Management
Operating Systems: Three Easy Pieces — Chapter 18: Paging
Philippe’s Oppermann — Introduction to Paging
Computer Science from the Bottom Up — Chapter 6. Virtual Memory
Dr. John T. Bell — Operating systems, Virtual Memory
StackOverflow — Do modern OS’s use paging and segmentation?
StackOverflow — What is thrashing? Why does it occur?
Wikipedia — Memory address
Wikipedia — Paging
Wikipedia — Address space
Wikipedia — Virtual memory
Wikipedia — Virtual address space
Wikipedia — Thrashing
Wikipedia — Segmentation fault
ITPro Today — Paging Performance
Aleph One — Smashing The Stack For Fun And Profit
嵌入式 虛擬化
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。