1. 程式人生 > >虛擬存儲器和高速緩存總結

虛擬存儲器和高速緩存總結

一定的 sso 對象 內容 概述 fill 嘗試 虛擬地址 mta

http://blog.csdn.net/chen98765432101/article/details/54881652

概述

為了更加有效的管理存儲器並且少出錯,現代操作系統提供了一種對主存的抽象,叫做虛擬存儲器。虛擬存儲器是被應用程序所意識和使用的。也就是說,它是被抽象出來的,虛擬出來的主存。所以,從應用程序的層面,程序看到的和使用的虛擬地址都是屬於虛擬存儲器的。虛擬存儲器充當一種中間轉換的角色,把虛擬地址對應的主存轉換到真實的主存上面。

如圖:

技術分享

下圖便是一個虛擬存儲器的表示。

技術分享

虛擬存儲器是不存在的,是虛擬出來的,如程序文件段,它是對應在磁盤上程序文件所在位置的代碼段的,主存中可能存在著一部分或全部的緩存。運行時堆段對應著磁盤上的swap區,主存中可能存在著一部分或全部的緩存。所以,虛擬存儲器也可以說對程序段的組織,當需要訪問時,再到主存或者虛擬存儲器指向的真正位置去取。

虛擬存儲器的作用:
  • 它將主存看成是磁盤的一個高速緩存,在主存中只保留活動的區域,並根據需要在磁盤和主存之間傳送數據,進而高效的利用有限的主存。
  • 它為每個程序提供了一致的地址空間(虛擬地址空間),簡化了存儲器管理。例如,加載、鏈接和共享因虛擬存儲器而變的簡單。
  • 它保護每個進程的地址空間不被其他進程破壞。每個進程的地址空間是私有的,即使所有進程的地址空間範圍是一樣的,訪問的地址也可能相同,但虛擬存儲器管理著進程能訪問到的真實內存,假如程序訪問不存在或使用錯誤權限訪問都將返回錯誤。

虛擬尋址和物理尋址

程序使用虛擬尋址,物理內存使用物理尋址。

程序執行是產生一條虛擬地址,通過MMU(內存管理單元),轉換為物理地址,使用該物理地址訪問物理內存,取得數據。

地址空間

地址空間包括虛擬地址空間和物理地址空間。假如一個存儲器的容量是N=2n字節,那麽他有N個地址,n位的地址空間。

CPU產生的地址是虛擬地址,屬於虛擬地址空間。現代系統有32位和64位地址空間,這個地址空間就是虛擬地址空間。

物理地址空間是用來尋址物理內存的。

地址空間的概念很重要,它清楚的區分了數據對象(字節)和它們的屬性(地址)。那麽可以將其推廣,允許每個數據對象有多個獨立的地址,其中每個地址都選自一個不同的地址空間。這也是虛擬存儲器的基本思想。

虛擬存儲器架構

如圖: 技術分享

縮寫解釋:

VA:虛擬地址

VPN:虛擬頁號

PTE:頁表項

PTEA:頁表項地址

PA:物理地址

DATA:數據

MMU:內存管理單元

TLB:地址翻譯緩沖器

設置存儲器層次結構主要是為了緩存低速的存儲器。主存是對磁盤等設備的緩存,cache是對主存的緩存,tlb是對主存頁表的緩存。

尋址方式:

  • tlb是虛擬地址尋址的。
  • cache、主存是物理地址尋址的。
  • 磁盤是磁盤的方式地址尋址的。
圖解:
  • CPU產生一個虛擬地址,虛擬地址傳送到MMU中,MMU首先根據虛擬地址在tlb中找對應的項,對應的項中包含虛擬地址對應的物理地址,如果找到,就用得到的物理地址在cache中找物理地址對應的數據,如果找到,就把數據從cache中返回給CPU。上述的情況是最理想的情況,即tlb命中,cache也命中。
  • 如果tlb未命中,則MMU根據VA,應用一定的邏輯計算出PTE的物理地址(PTEA)。用PTEA在cache中找對應的數據(PTE),如果cache命中,把PTE返回給MMU,並填充到TLB中,下次再查找TLB時,TLB就會命中了。
  • 如果CACHE未命中,則用PA從主存中取數據,返回數據並填充CACHE對應部分,下次就可以從CACHE中命中。
  • 還有一種情況是,如果請求的數據未在主存中緩存,而是在磁盤中,例如頁表項(PTE)中對應的地址是磁盤的地址,主存未命中,稱為缺頁,則缺頁處理程序(操作系統)從主存中找到合適的位置,把磁盤中的內容填充到相應位置。

存儲器的相聯方式

存儲器的相聯方式有全相聯、組相聯、直接相聯。關於相聯方式,現在暫不更新,網上有很多討論了。有一點,我覺得可以提下,理解相聯方式,最後最好從2進制的位變化形式去理解,這樣對理解虛擬地址到物理地址的轉換很有好處。

主存對磁盤的緩存

主存和磁盤之間緩存的單位是頁。頁的大小默認是4k,也有大頁2M,甚至1G的,關於大頁的討論,以後再寫文章討論。也就是說,主存緩存磁盤內容是頁大小的整數倍,那麽頁的基地址的最後12位必然是全0的。

cache的訪問速度是主存的10倍,主存的訪問速度是磁盤(機械)的100000倍。所以,缺頁的代價是嚴重的,所以主存對磁盤的相聯方式采用全相聯的方式,即磁盤上的一頁可以放到主存的任意一頁中。並且因為訪問磁盤的時間很長,主存總是采用寫回的方式,而不是直寫。 因為主存的容量相對於磁盤的容量是很小的,所以當運行的程序多的時候,很可能發生沒有閑置的主存了,這時候會發生主存頁面換出(swap),頁面替換處理會找到一個最近最不可能用到的物理頁面換出到磁盤,然後把請求的頁面放到該物理頁面處。所以,系統中可分配的內存總量 = 物理內存的大小 + 交換設備的大小。交換設備可能是swap區和文件。

cache對主存的緩存

cache和主存之間緩存的單元是cache行,每個cache行是64字節。和主存對磁盤緩存不同的是,因為cache和主存的速度相差只有10倍,所以當cache miss時的開銷並沒有那麽大。於是cache與主存之間采用簡單、快速的組相聯方式。采用的尋址方式是物理地址尋址。

虛擬地址和物理地址的轉換

虛擬地址是屬於虛擬地址空間的,物理地址是屬於物理地址空間,但兩者都對應著同一個數據對象。除了這個兩個地址空間,其實還有一個磁盤地址空間。CPU為了取得數據,最終必須以物理地址的形式獲取。

頁表

頁表是虛擬地址和物理地址對應的表。在內存中的表現形式是數組。操作系統負責創建和維護,每個進程都有各自的頁表,都存放在主存中。頁表是常駐主存的,不被換出。一個虛擬地址對應的物理地址或者磁盤地址和標記(64位字節)叫做頁表項。頁表項相對頁表基地址(數組基地址)的偏移,是MMU根據虛擬地址和相聯方式計算出來的。一般頁表也按多級頁表存放的,例如intel i7的頁表是四級頁表,但2M大頁的頁表就是3級頁表了。多級頁表可以減小頁表占用的空間。 技術分享

MMU

虛擬地址轉換到物理地址是通過MMU完成的。MMU負責把虛擬地址和頁表基地址組合成頁表項的地址,然後再根據頁表項中的有效位等標記檢查頁表項是否有效、是否在主存中。如果有效且緩存在主存中就向主存獲取數據(會先嘗試從cache中獲取)。如果未被緩存在主存中,而是在磁盤中,則觸發缺頁處理程序,從磁盤換入主存中和相應的cache中。

TLB對頁表的緩存

CPU每產生一個虛擬地址,訪問主存,都涉及到從虛擬地址到物理地址的轉換,都會訪問頁表,因此,如果訪問的頁表項被緩存在cache中,將大大提高獲取數據的速度。現在的系統采用專門的cache結構——TLB,來緩存頁表項。采用專門的TLB,原因有,因為有了頁表基地址之後,頁表項是虛擬地址尋址的,所以TLB采用虛擬地址更加方便,但cache結構是采用物理地址尋址的,所以設置了專門的TLB結構緩存頁表。

TLB種類:

虛擬存儲器和高速緩存總結