最近在重新回顧基礎知識,上一篇文章寫了ECF到系統調用,這一篇主要寫下分頁有關的內容。
前言
先提一個問題,在我們現有計算機中,4Gb內存已經是標準配置(最低)了,那么問題來了,我們在學習操作系統的時候學習了進程的概念,對于Linux來說,32位地址空間代表可以訪問0-4G的內存,在該進程地址空間中,存在著內核,用戶棧,堆等等數據,每個進程的地址空間都是獨立的,我們的物理內存只有4G,而Linux系統進程數都是按照百來計數,這樣算下來肯定是不夠用的,操作系統是如何解決的呢?
介紹 :
分頁,是將一個進程的地址空間分割成固定大小的單元,每一個單元被稱為一頁。
這樣說比較抽象,下面我們直接上圖。
圖一:虛擬存儲器到物理存儲器
我們首先要有虛擬存儲器的概念,它是現代計算機系統為了更好地管理存儲器提出的一種抽象概念分頁文件大小是什么,虛擬存儲器是硬件異常、硬件地址翻譯、主存、磁盤文件和內核軟件的完美交互。
它為每個進程提供了一個大的、一致的和私有的地址空間。通過一個很清晰的機制,虛擬存儲器提供了三個重要的能力:
它將主存看成是1個存儲在磁盤上的地址空間的高速緩存,在主存中只保存活動區域。并根據需要在磁盤和主存之間來回傳送數據,通過這種方式,它高效地使用了主存。它為每個進程提供了一致的地址空間,從而簡化了存儲器管理。它保護了每個進程的地址空間不被其他進程破壞。
虛擬存儲器(VM),被組織為一個由存放在磁盤上的N個連續的字節大小的單元組成的數組。每字節都有一個唯一的虛擬地址,這個唯一的虛擬地址是作為到數組的索引的,磁盤上數組的內容被緩存在主存中。和存儲器層次結構中其他緩存一樣,磁盤(較低層)上的數據被分割成塊,這些塊作為磁盤和主存(較高層)之間的傳輸單元。VM 系統通過將虛擬存儲器分割為稱為虛擬頁( Page, VP)的大小固定的塊來處理這個問題。每個虛擬頁的大小為P宇節。類似地,物理存儲器被分割為物理頁( Page, PP),大小也為P宇節,物理頁也稱為頁幀 (page frame)。
VP分類:
然后讓我們看下上面圖一,任何時刻虛擬頁面都分為三個部分,這三個部分不相交:
第一個部分是未分配的,它沒有任何數據和它關聯,不占用物理存儲器空間。(這部分未在圖中表示出來)
第二個部分是緩存的,緩存在物理存儲器的已分配頁面。
第三個部分是未緩存的,沒有緩存在物理存儲器的已分配頁。
圖中進程m的VP0,VP1,VP2,進程n的VP0,VP1均已分配,且分別對應物理存儲器的PP1,PP4,PP5,PP3,PP6,這個PP就是指我們前面所說的頁幀(page frame).
為了記錄虛擬頁和物理頁的關聯關系,操作系統為每個進程維護了一種數據結構,頁表(Page Table),主要作用是為地址空間的每一個虛擬頁面保存地址轉換,從而讓我們知道每個頁在物理存儲器的位置,簡單來說,VP->PP。
好了,分頁的簡單概念就是這樣了,我們在文章前言里的問題是不是得到解決了呢?
接下來,有幾個簡單的思考題目,感興趣的小伙伴可以看看:
1.假如對一個32位機,每頁的大小為4Kb,那么我們要對虛擬地址進行尋址,則既需要頁號分頁文件大小是什么,又需要頁內偏移,這個地址我們怎么確定呢?
2.如果每頁的大小為4Kb,一個32位機,每個進程的頁表條目數大概有多少呢?
3.如果尋址的時候,VP對應的PP沒有緩存,VM會怎么處理?
4.VM如何實現不同進程之間存儲隔離的?