1. 程式人生 > >8.1 存儲層次結構概況

8.1 存儲層次結構概況

是不是 旋轉 明顯 事情 即使 哪些 是我 交互 正是

計算機組成

8 存儲層次結構

8.1 存儲層次結構概況

技術分享圖片

如果CPU愛好哲學,它可能一直在問自己兩個問題。

我要運算的數據從哪裏來?我算完的數據又將去向哪裏?

這在計算機世界當中確實是一個非常重要的問題。這也正是我們今天所要探討的主題:存儲器。

技術分享圖片

這是我們非常熟悉的馮·諾依曼計算機結構,這其中哪些部件和存儲功能有關呢?存儲器自然會是一個,而外部記錄介質也是帶有存儲功能的,這兩個都比較明顯。

另外還有一個也帶有存儲功能那就是運算器。因為CPU當中的通用寄存器是包含在運算器當中的,通用寄存器中也是用來存放臨時的數據,也可以看作是一種存儲器。

這些就是我們要介紹的構成存儲層次結構的主要部件,為了便於描述把這些部件都統稱為存儲器。

技術分享圖片

那我們來看一看計算機當中對存儲器有哪些需求。

首先存儲器當中應該保存了將要運行的程序和需要運算的數據,那這些內容在系統通電啟動的時候就應該在存儲器當中了,而且在斷電之後也不會丟失。那麽具有這樣特定的存儲器我們稱之為非易失性存儲器。而斷電後存儲的信息就會丟失的存儲器則稱為易失性存儲器。在現在的計算機系統當中主存和CPU當中的通用寄存器都是易失性的存儲器,斷電之後其中的信息就丟失了。而bios芯片和硬盤則是非易失性的存儲器,所以,在系統通電之後CPU必須要從bios芯片開始執行程序,然後這段程序把硬盤等設備配置好之後再將更多的程序和數據從硬盤搬運到內存,之後CPU才可以在內存裏執行程序。因此,在系統中必須要有非易失性的存儲器。

第二這樣的存儲器肯定得是可讀又可寫的。那在這個結構當中硬盤和主存都是可讀可寫的,而bios芯片則是一個只讀的芯片,倒不是說它完全不支持寫操作,而是對它的寫需要借助特殊的設備或者特殊的操作過程,非常的麻煩,無法支持經常性地寫入數據。

第三存儲器最好是能夠支持隨機訪問。所謂隨機訪問是指對存儲器當中任何一個數據的訪問所花費的時間與這個數據所在的位置沒有關系。一種典型的非隨機訪問的設備就是磁帶,比如早期要聽歌都是要使用磁帶的,假如現在磁帶的開頭你就可以馬上聽第一首歌,但是如果你想聽第十首歌,你就得用快進的方式快速的卷過前九首歌才能夠聽第十首。這樣的訪問就是和它的位置有關的,而在計算機程序的運行過程中,我們會訪問到存儲器的任意位置,如果不支持隨機訪問,這就會對性能造成很大的影響。在這裏對主存的讀寫和bios芯片的讀都是支持隨機訪問的。而硬盤內部實際上是由多個盤片構成,這些盤片處於高速旋轉的狀態,並由一個機械的讀寫頭去尋找需要訪問的數據的位置,這就不是隨機訪問的模式,而且由於其中有機械部件的存在,速度就變得非常的慢。

而在計算機當中存儲器的速度也就是訪問的時間也是一個非常重要的因素。CPU的運行速度很快,在它需要訪問存儲器的時候,最好能在一個時鐘周期內就完成數據的訪問,不然就會阻礙CPU後續的操作。而主存的速度是明顯高於硬盤的速度的。所以,總體看來,如果我們能找到一個存儲器支持隨機讀寫而且是非易失性的,訪問時間也很短,那麽就可以考慮只用這樣一個存儲器和CPU連接,當然我們還要考慮到是否有足夠大的容量以裝下所以我們需要的程序和數據,還有價格是否能夠承受,以及功耗是否合適等等。

既然現狀我們是使用了這麽多種不同的存儲器,雖然是因為沒有一個唯一而完美的解決方案,那麽就從性能和價格等方面對它們進行一個比較。

技術分享圖片

這是30年來具有代表性的CPU。我們每隔十年選取一個代表,80年的8080,時鐘頻率大約為一兆赫茲,其時鐘周期是一千納秒。90年我們選取了386的一個版本,時鐘周期是五十納秒。而2000年選擇的是奔騰二,時鐘周期大約為一點六納秒。2010年選擇的是Core i7,時鐘周期大約是0.24納秒,當然我們要註意因為這個時候已經是四核了,如果每個核,每個時鐘周期都需要對外傳輸數據,那其實相當於每零點一納秒就需要傳輸一個數據。那麽就以這個CPU的時鐘周期為指標來看一看外部存儲器的特性。

首先我們來看硬盤。硬盤的訪問時間在80年的時候大約是87,我們註意這個單位是毫秒。毫秒和納秒差了一百萬倍,所以,雖然這30年來硬盤的訪問速度也有所提升,大概提升了29倍,但它和CPU的時鐘周期完全沒有可比性,相差數百上千萬倍。所以,僅從訪問時間這一項來看硬盤從一開始就不具備直接和CPU進行交互的能力。當然它的優勢在於容量大而且便宜。在80年的時候大約每兆字節需要五百美元,那時典型的硬盤容量是一兆字節。而在這30年中硬盤單位容量的價格在迅速的下降,下降幅度超過160萬倍。而與此同時硬盤的容量也在迅速的增長,上升的幅度也有150萬倍。這樣我們就可以存放更多的程序和數據。這是硬盤技術進步帶來的最大的好處。當然另外還有一件很有意思的事情,我們發現價格下降的幅度和容量上升的幅度基本相當,也就是說現在和30年前相比雖然硬盤的容量和單個字節的價格有了巨大的變化,但是整個硬盤的價格卻基本保持著不變。那好硬盤作為一個非易失性的存儲器自然有它自己的作用,但是要想和CPU直接交互還得看其他的設備,這就是DRAM。

現在的主存主要是采用DRAM實現。它的訪問時間在1980年大約是375納秒,我們註意到這個時候DRAM實際上比CPU的運行的速度還要快一些。所以,這時候並不用擔心內存無法及時給CPU提供數據的事情。而到了90年DRAM的速度已經比CPU的速度慢了,而且後來這個差距越來越大,到2010年,即使只考慮單核CPU的需求,DRAM的訪問時間也和CPU的時鐘周期相差一百倍。在這同樣的這30年裏CPU的時鐘頻率提升了2500,而DRAM的訪問速度卻只提升了9倍。所以,這個差距明顯是在拉大的。不過DRAM的進步也同樣體現在其容量和價格上,這30年來其容量足足提升了有12萬倍之多,而成本也幾乎有同樣比例的壓縮,也就是說我們可以與30年前用同樣的價格買到12萬倍的容量的內存。容量擴大自然是一件好事,但是這個性能的差距到底會帶來什麽樣的影響呢?

技術分享圖片

我們通過一個例子來看一看。假設CPU直接連接著DRAM構成的主存,那在CPU當中執行一條指令所需要花的時鐘周期大約是這樣的。我們就以奔騰CPU執行指令的五個步驟為例,首先是取指,我們假設在CPU內部需要花一個周期產生訪問存儲器的地址,那麽接下來就因為要讀存儲器而進行等待,所以這樣CPU就會等待一百個時鐘周期才能得到這條指令的編碼,然後再花一個周期在CPU內部進行譯碼。第三步在奔騰當中是生成地址。第四部則是執行。如果在執行當中需要去訪問存儲器讀取操作數,那又需要再等待一百個周期,然後才可以得到操作數,並在CPU內部再用一個周期完成相應的執行工作。最後花一個周期寫回到寄存器,但是如果目的操作數是存儲器的話那還需要花一段時間完成寫存儲器的操作。那麽這裏就可以看到實際上執行一條指令大約要花掉二百多個時鐘周期,而且絕大多數的時間都在等待存儲器。我們原先希望一個時鐘周期就能完成一條指令,那如果CPU真是這麽運行的,那一個1G赫茲的CPU只相當於時鐘主頻只有5兆赫茲的CPU的性能了。這樣顯然是無法接受的。所以,我們必須要考慮如何提升CPU訪問存儲器的性能。

既然DRAM的性能提升有限,就只能去尋找其它速度更快的存儲器。比如說SRAM就是一種選擇。可以考慮在CPU和DRAM之間,加上一個速度更快的SRAM,如果我們能讓CPU所需要的程序和數據大部分時間都存放在這個SRAM當中,那CPU就可以獲得快得多的存儲器訪問時間。這樣一個SRAM的部件,就稱為cache,也就是高速緩存。那我們來對比一下cache對指令執行時間的影響,SRAM的訪問時間大約可以認為是3個時鐘周期,那上面這個指令執行的過程就會變成這個樣子,所有讀存儲器的100個時鐘周期都會縮短為大約3個時鐘周期,這樣大約只需要總共10個時鐘周期就可以完成一條指令了。相比於之前的性能,有了巨大的提升。

既然SRAM這麽好,那麽為什麽不用SRAM作為主存呢?

技術分享圖片

要回答這個問題,我們還得來看這張表。我們再加上SRAM的相關參數。在1980年,SRAM的訪問時間大約是300納秒,比DRAM要快一些,但是很有限,基本上屬於相當的訪問時間。但是SRAM的訪問速度提升的很快,三十年間提升了大約兩百倍,而這段時間,DRAM只提升了九倍。在很長一段時間內,SRAM的訪問時間與CPU的時鐘周期基本相當,所以在之前學習處理器結構的過程中,我們一直認為CPU可以在一個時鐘周期內從高速緩存當中獲得數據,即使在2010年的時候,SRAM的訪問時間也不過是CPU時鐘周期的三到四倍,這個差距,也完全可以通過繼續細化切分流水級來解決。因此從速度上來說,SRAM作為與CPU直接連接的存儲器是合適的。但是我們能不能直接把它作為主存呢?那我們就得來看看價格是否能夠接受了。

我們註意到在2010年,同樣容量的SRAM,它的價格是DRAM的一千倍。如果說我們現在花一千塊錢就可以買到一個非常好的內存條,那你是不是願意花十萬塊錢買一個相同容量的SRAM作為內存呢?所以,即使僅從價格因素來考慮,SRAM也無法取代DRAM用來作為內存,而是只能用一個小容量的SRAM作為高速緩存,保存最常用的程序和數據,以達到性能和價格的平衡。

那是什麽時候開始用SRAM作為cache加到CPU和主存之間的呢?其實從這張表上我們也能夠看出來。在80年的時候,DRAM還是比CPU的速度要快的。所以,這個時候沒有使用高速緩存的需求,而到了90年,DRAM的速度已經比CPU慢了。所以,在我們用作例子的這些英特爾系列的CPU中,正是在1980年到1990年這個過程中,逐漸產生了高速緩存的需求。

技術分享圖片

那在這個時期,我們細致地來看。

早期的8088CPU訪存實際上需要840納秒,而DRAM的延遲是250納秒,那當然就不需要cache。286的訪存周期大約是200納秒,DRAM的延遲220納秒,也基本相當,這時候還是不需要cache。而386的訪存周期大約是80納秒,DRAM的延遲雖然有所進步,但還是需要190納秒,這時候已經明顯慢於CPU了。但是386CPU芯片內部並沒有設計cache這個部件,後來也發現這對性能有很大的影響。所以,當時是采用在芯片外再增加一塊SRAM芯片作為cache來解決這個問題。那麽到了486的時候,就已經把cache集成到了CPU芯片的內部,從而緩解CPU和DRAM主存之間的性能差距。

技術分享圖片

因此,現代的計算機當中都采用了這樣層次化的存儲結構。在這個層次結構中,越往上的部件,容量越小,但速度更快,而單位字節的成本更高;越靠下的部件,容量更大,但速度更慢,而單位字節的成本更低。

技術分享圖片

現在,我們已經了解了計算機對存儲器的基本需求,也知道了存儲器的基本特性和大致的分類。那我們就要對其中的細節進行深入的探索,以及建立完整的計算機存儲體系。

8.1 存儲層次結構概況