1. 程式人生 > >快取記憶體工作原理

快取記憶體工作原理

        如果您買過計算機,那麼您肯定聽說過“快取”這個詞。現代計算機都有L1和L2快取,許多計算機現在還有L3快取。可能還有熱心朋友在快取方面給您出過主意,像“別買賽揚的晶片,它裡面沒有任何快取!”。

       事實表明,快取記憶體是電腦科學所採用的一種重要方法,它以各種不同的形式存在於每臺計算機上。快取分為記憶體快取、硬體和軟體磁碟快取、頁快取等等。甚至虛擬記憶體也是一種快取記憶體形式。在本文中,我們將探究快取記憶體的原理,以讓您明白它為何如此重要。

      快取記憶體是一項基於計算機儲存器子系統的技術。使用快取的主要目的是在提高計算機速度的同時,保持計算機的較低價格。採用快取記憶體,您可以在計算機上更快地完成各種任務。

       為了瞭解快取系統的基本概念,讓我們先通過一個超級簡單的圖書管理員的例子來說明快取記憶體的概念。想像一下,有一點陣圖書管理員坐在桌子的後面。他的工作就是為您找出您要借閱的書。為簡單起見,我們假定您自己不能取書,而必須讓圖書管理員幫您取來所要借閱的書。於是他會從庫房的藏書架上為您取出這本書(華盛頓特區的國會圖書館就採用這種方式)。我們首先從不帶快取的圖書管理員開始。

       第一位顧客來了。他要借閱《白鯨》。圖書管理員到庫房找到這本書,然後回到櫃檯將這本書交給顧客。一段時間後,客戶回來了並將這本書還給圖書管理員。圖書管理員收下這本書然後將它放回庫房。接著,他返回櫃檯等待下一位顧客。我們假定下一位顧客也要借閱《白鯨》(您看到這本書已經送還回來了)。圖書管理員不得不返回庫房去找他剛放回去的這本書,然後將其交給客戶。如果以這種方式工作,圖書管理員取每本書都得返回庫房一次,即使那些極受歡迎、借閱率很高的書也要如此。有沒有辦法來提高圖書管理員的工作效率?

       當然有,我們可以給圖書管理員一個快取來解決這個問題。在下一節,我們仍將使用此示例,不同的是圖書管理員將使用快取記憶體系統。

       我們給圖書管理員一個揹包,他可以用這個揹包裝十本書(用計算機術語表達,就是圖書管理員現在有一個能裝十本書的快取)。他可以用這個揹包來裝客戶還給他的書,最多可裝十本。下面我們使用前面的示例,不過現在的圖書管理員可以採用改進的快取記憶體新方法。

新的一天開始。圖書管理員的揹包是空的。我們的第一位客戶來了並要借閱《白鯨》。沒有取巧的辦法,圖書管理員必須到庫房去拿這本書。他把這本書交給客戶。一段時間後,客戶回來了並將這本書還給了圖書管理員。圖書管理員不是把這本書放回庫房,而是把它放到揹包中,繼續接待閱覽者(他會先看看揹包滿沒滿,隨後將更頻繁地進行檢視)。另一名客戶到來借閱《白鯨》。在去庫房之前,圖書管理員要檢視揹包中是否有這本書。於是他找到了這本書!他所要做的一切就是從揹包中拿出來並把它交給客戶。因為無需去庫房取書,所以能夠更快地為客戶提供服務。

      如果客戶要借閱的書不在快取(揹包)中又會怎樣?在這種情況下,圖書管理員在有快取時的效率比在沒有快取時的效率要低,因為圖書管理員要先花時間看看揹包中是否有這本書。快取設計面臨的一項重大挑戰就是需要將搜尋快取造成的影響降至最低,而現代的硬體幾乎已將這種時間延遲縮短為零。即使在我們這個圖書管理員的簡單示例中,與走回庫房的時間相比起來,搜尋快取的延遲時間(等待時間)是如此之小,以至於顯得無關緊要。由於快取比較小(十本書),因此發現包中沒有要借的書所花費的時間只是往返庫房所需時間中極其微小的一部分。

     通過這個示例,您可以瞭解到關於快取記憶體的幾個重要方面:

  • 快取技術就是採用速度較快但容量較小的儲存器來提高速度較慢但容量較大的儲存器的速度。
  • 使用快取時,必須先檢視快取中是否有需要的專案。如果有,則稱之為快取命中。如果沒有,則稱之為快取失誤,這時計算機就必須等待往返一次讀取龐大而又緩慢的儲存器。
  • 最大的快取也遠遠小於龐大的儲存區。
  • 可以存在多級快取。在我們這個圖書管理員示例中,揹包是容量較小但速度較快的儲存器,庫房則代表容量較大且速度較慢的儲存器。這是一級快取。也可以在它們之間再加一級快取,就是在櫃檯後面放一個能容納一百本書的書架。圖書管理員可以先檢視揹包,然後檢視書架,最後檢視庫房。這就構成了一個兩級快取。

       計算機是一種以非常小的增量來度量時間的機器。微處理器對主儲存器(RAM) 的訪問在大約60納秒(一秒的六百億分之一)內完成。這已經相當快了,但與典型的微處理器相比還是慢得多。微處理器的週期可以只有2納秒那麼短,因此對它而言,60納秒就顯得無比漫長。

如果我們在主機板上增設容量小但速度非常快(大約30納秒)的特殊儲存器組,結果會怎樣?這已比訪問主儲存器的速度快了兩倍。這就被稱為2級快取或L2快取。如果我們直接在微處理器晶片上構造容量更小但速度更快的儲存器系統,結果會怎樣?如果這樣,系統將以微處理器的速度而非記憶體匯流排的速度訪問該儲存器。這就是L1快取,在233兆赫茲(MHz)奔騰處理器上,其速度比L2快取快3.5倍,而L2快取的速度比主儲存器訪問速度要快兩倍。

       某些微處理器晶片上帶有兩級快取。在這種情況下,主機板快取(微處理器和系統主儲存器之間的快取)就成為3級快取或L3快取

       計算機中有許多子系統,對於多數子系統而言可以在它們之間安插快取來提高效能。舉一個例子。我們擁有微處理器(計算機中速度最快的部件)。還有對L2快取(對主儲存器進行快取)進行快取的L1快取,主儲存器可以作為速度更慢的外圍裝置(如硬碟CD-ROM)的快取(主儲存器通常用於此用途)。也可以使用硬碟來對速度更慢的介質(網際網路連線)進行快取。

       網際網路連線是計算機執行中最慢的環節。因此瀏覽器(IE、Netscape、Opera等)會使用硬碟儲存HTML頁面,也就是將它們存放在硬碟上的一個專用資料夾中。首次請求一個HTML頁面時,瀏覽器將顯示該頁面並在磁碟上儲存一個頁面副本。下次再請求訪問此頁面時,瀏覽器將檢查網際網路上相應檔案的日期是否比快取檔案的日期新。如果日期相同,則瀏覽器將直接使用硬碟上的檔案而不會從網際網路上下載檔案。在這種情況下,硬碟是容量較小但速度較快的儲存器系統,網際網路則是容量較大但速度較慢的儲存器系統。

      人們也可以直接在外圍裝置上增設快取。現代硬碟帶有較快的儲存器(大約512K),它以硬連線方式與硬碟連線。計算機不直接使用此儲存器,它由硬碟控制器直接使用。對於計算機來說,這些儲存器晶片就是硬碟本身。當計算機向硬碟請求資料時,硬碟控制器在操縱硬碟機械部件(與儲存器相比這非常慢)之前先檢查此儲存器。如果硬碟控制器在快取中找到了計算機請求的資料,則它將返回在快取中儲存的這些資料,而不去實際訪問硬碟本身的資料,這樣就節省了大量時間。

      您可以嘗試以下實驗。計算機使用主儲存器對軟碟機進行快取,您可以對此過程進行實際觀察。訪問軟盤上的大型檔案,例如,用文字編輯器開啟一個300K的文字檔案。第一次您會看到軟碟機上的指示燈亮起,並且需要等上一段時間。軟盤的訪問速度極慢,因此載入檔案將需要20秒鐘。現在,關閉編輯器,然後再次開啟上述檔案。這次(不要等上30分鐘或在兩次嘗試之間執行大量磁碟訪問)指示燈不會亮起,您也不需要等待。作業系統檢查了軟盤的記憶體快取並找到了它要找的內容,於是系統很快就在儲存器子系統中找到了資料,速度比首次嘗試訪問資料時的速度快許多(訪問一次軟盤需要120毫秒,而訪問一次主儲存器大約只需60納秒,這快了許多),因此不用再等20秒。您也可以對硬碟進行相同的實驗,但因為軟碟機速度非常慢,所以效果會更明顯。

      為了讓您對快取系統有個全面的瞭解,以下列出了與普通快取記憶體系統相關的內容:

  • L1快取——以全速微處理器速度進行的儲存器訪問(10納秒,大小為4-16千位元組)
  • L2快取——SRAM型別的儲存器訪問(大約20到30納秒,大小為128-512千位元組)
  • 主儲存器——RAM型別的儲存器訪問(大約60納秒,大小為32-128兆位元組)
  • 硬碟——機械裝置,較慢(大約12毫秒,大小為1-10千兆位元組)
  • 網際網路——極慢(在1秒和3天之間,大小不限)

      您可以看到,L1快取對L2快取進行快取,L2快取對主儲存器進行快取,主儲存器對磁碟子系統進行快取,依次類推。

      講到這裡,人們通常會問:“為什麼不讓計算機的所有儲存器都以L1快取的速度執行,這樣不就無需使用快取記憶體了嗎?”那樣當然可以,但成本會相當昂貴。採用快取記憶體的目的就是用較昂貴的小容量儲存器來提高價格較便宜但速度較慢的大容量儲存器的速度。

      設計計算機時,目標就是讓微處理器全速執行,同時讓價格儘可能低。500MHz的晶片一秒鐘可執行五十億個週期(每兩納秒一個週期)。如果沒有L1和L2快取,那麼訪問主儲存器將需要60納秒,這相當於浪費掉約30個訪問儲存器的週期。

       容量如此小的儲存器可以使容量比其大出許多的儲存器的使用率達到最大,這真讓人覺得不可思議。考慮一下使用256千位元組的L2快取對64兆位元組的RAM進行快取。在這種情況下,容量為256,000位元組的儲存器能夠有效地對容量為64,000,000位元組的儲存器進行快取。它為何能發揮這樣的作用?

       在電腦科學中,有一個被稱作訪問區域性性的理論概念。它的意思是:在一個較大的程式中,在任何時候,都只有一小部分被使用。儘管這似乎有點奇怪,但訪問區域性性適用於絕大多數程式。即使是10M大小的可執行程式,在任何時候,該程式中都只有極少數部分得以使用,而且這部分的重複率非常高。在下一頁,您將瞭解到有關訪問區域性性的更多內容。

      讓我們看看下面的虛擬碼,從而瞭解為什麼訪問區域性性會起作用(有關詳細內容請參見C語言入門教程):

Output to screen « Enter a number  between 1 and 100 »
Read input from user
Put value from user in variable X
Put value 100 in variable Y
Put value 1 in variable Z
Loop Y number of time
   Divide Z by X
   If the remainder of the division = 0
      then output « Z is a multiple of X »
   Add 1 to Z
Return to loop
End

       這個小程式要求使用者輸入1-100之間的一個數字,然後它讀取使用者輸入的值。接著,程式拿使用者輸入的數字去除1-100之間的每一個數字。程式檢查餘數是否是0(模數除法)。如果是0,那麼對於從1到100之間的每一個數字,程式都將輸出“Z是X的倍數”(例如,12是6的倍數)。而後程式終止。

       即使您對計算機程式設計所知甚少,也會很容易就明白,在該程式的第11行中,迴圈部分(第7-9行)執行了100次。其他各程式行只執行一次。由於採用了快取記憶體,第7行到第9行的執行速度都將極大提高。

       這個程式非常小,因此整個程式可以輕易地存放到最小的L1快取中。但我們假定這個程式非常大。結果還是一樣。程式設計時大部分操作都在迴圈語句內部執行。字處理程式95%的時間都用於等待輸入並將輸入顯示在螢幕上。字處理程式的這一部分就存在於快取中。

       我們將這種95%比5%的比率(近似)稱作訪問區域性性,正是由於存在訪問區域性性,快取才能如此有效地發揮作用。也正是由於存在訪問區域性性,如此小的快取才能有效地對大型儲存器系統進行快取。現在,您應當明白為什麼全部用最快的儲存器來製造計算機是不值得的了。因為通過訪問區域性性,我們只需花些許成本,就可以達到95%的效率了。

        有關快取記憶體及相關主題的更多資訊,請檢視下一頁上的連結。

     博聞網相關文章

      更多精彩連結­