虛擬存儲系統是指什么 虛擬存儲

虛擬存儲(虛擬存儲系統是什么意思)
摘要我們都知道,一個進程與其他進程共享CPU和內存資源 。為此,操作系統需要一套完善的內存管理機制來防止進程間的內存泄漏 。
為了更有效地管理內存,減少錯誤,現代操作系統提供了一個抽象的主存概念,即虛擬內存 。虛擬內存為每個進程提供了一個一致且私有的地址空空間,讓每個進程產生一種自己在享用主存的錯覺(每個進程都有一個連續完整的內存空空間) 。
沒有深入了解的人會認為虛擬內存只是一種“利用硬盤空”擴充內存的技術,這是錯誤的 。虛擬內存的意義在于定義了一個連續的虛擬地址空,降低了編程的難度 。而且將內存擴展到硬盤空只是使用虛擬內存的必然結果 。虛擬內存空將存在于硬盤中,并由內存進行緩存(根據需要) 。有些操作系統在切換到進程時會把某個進程的內存全部放到硬盤空里 。
虛擬內存主要提供以下三個重要功能:
它把主存當成存儲在硬盤上的虛擬地址空之間的緩存,只緩存主存中的活動區域(按需緩存) 。
它為每個進程提供了一致的地址空,從而降低了程序員管理內存的復雜度 。
同時也保護了每個進程的地址空不被其他進程破壞 。
在介紹了虛擬內存的基本概念之后,接下來的內容將從虛擬內存如何在硬件中工作逐漸過渡到它在Linux中的實現 。
CPU尋址
內存通常由m個連續字節大小的單元組成,每個字節都有一個唯一的物理地址PA作為數組的索引 。CPU訪問內存最簡單直接的方式就是使用物理地址,也就是所謂的物理尋址 。
現代處理器使用一種稱為虛擬尋址的尋址方法 。使用虛擬尋址,CPU需要將虛擬地址轉換成物理地址,以便訪問真實的物理內存 。

虛編址
虛擬尋址需要硬件和操作系統之間的合作 。CPU包含一個稱為內存管理單元(MMU)的硬件,其功能是將虛擬地址轉換為物理地址 。MMU需要通過存儲在內存中的頁表來動態轉換虛擬地址,該頁表由操作系統管理 。
頁面表虛擬內存空被組織成一個由m個連續字節大小的單元組成的數組,存儲在硬盤上,每個字節都有一個唯一的虛擬地址作為數組的索引(這實際上與物理內存相同) 。
操作系統將虛擬內存劃分為固定大小的塊,作為硬盤和內存之間的傳輸單位 。這個塊叫做虛擬頁,VP),每個虛擬頁的大小為p = 2 p字節 。物理內存也是這樣劃分成物理頁(PP)的,大小也是P字節 。
CPU獲得虛擬地址后,需要通過MMU將虛擬地址翻譯成物理地址 。在翻譯的過程中,還需要頁表 。所謂頁表,就是存儲在物理內存中的數據結構,記錄了虛擬頁和物理頁的映射關系 。
頁是頁表條目(PTE)的集合,并且每個虛擬頁在頁表中的固定偏移量處都有一個PTE 。下面是PTE的頁表結構,只有一個有效的位標記,表示這個虛擬頁是否緩存在物理內存中 。

虛擬頁面VP 0、VP 4、VP 6、VP 7緩存在物理內存中,虛擬頁面VP 2、VP 5分配在頁表中,但不緩存在物理內存中,虛擬頁面VP 1、VP 3還沒有分配 。
在動態內存分配過程中,比如malloc()函數或者其他高級語言中的new關鍵字,操作系統會在硬盤中創建或者申請一個虛擬內存空,并更新到頁表中(分配一個PTE指向硬盤上新創建的虛擬頁) 。
由于CPU每次進行地址翻譯都需要經過PTE,所以如果想要控制內存系統的訪問,可以增加一些額外的權限位(比如讀寫權限、內核權限等 。)在PTE上,這樣如果有任何指令違反了這些權限條件,CPU就會觸發一般的保護錯誤,將控制權交給內核中的異常處理程序 。一般將這種異常稱為“分段故障” 。
【文章福利】:邊肖整理了一些我認為比較好的學習書籍和視頻,分享到群檔里 。如果有需要,可以自己添加!跳躍(需要振作起來)

這里推薦大家看一下Linux C/C++高級開發架構的【免費】課程:
C/C++Linux服務器開發/Backoffice架構師【零音教育】-學習視頻教程-騰訊課堂如果課程內容對比騰訊C++后臺開發的T8 rank技術棧,將圍繞數據結構與算法、數據庫、網絡、操作系統、網絡編程、分布式架構等進行全面提升 。值得學一波~
頁面點擊
頁面點擊
如上圖所示,MMU根據虛擬地址對頁表中的PTE 4進行尋址,PTE的有效位為1,表示虛擬頁已經緩存在物理內存中 。最后MMU得到PTE中的物理內存地址(指向PP 1) 。
缺失的一頁
缺失的一頁
如上圖所示,MMU根據虛擬地址在頁表中尋址PTE2,PTE 2的有效位為0,表示虛擬頁不緩存在物理內存中 。沒有緩存在物理內存中的虛擬頁面(緩存未命中)稱為缺失頁面 。

推薦閱讀