第二節:內存層次結構

當 有人們提到“內存”這個詞的時候,往往都與主板上的專門提供數據存儲能力的芯片聯繫起來。通常將這類提供存儲能力的芯片稱之爲隨機存儲器(RAM),主內 存(main memory),和主存儲器(primary storage).回首計算機的鐵器時代,大型機大行其道的時候,稱之爲核心部件(core)。這些芯片提供的存儲只是臨時的,也就是說,存儲在這些芯片 裏的數據只要當電源被關閉以後也隨之消失。


有這麼幾類RAM
  • DRAM
  • SDRAM
  • SRAM
  • VRAM

動態 RAM(DRAM)一秒鐘內會進行數千次的充電動作。同步 DRAM (SDRAM) 隨着處理器高速的時鐘運行速度下保持同步刷新。靜態 RAM(SRAM)不需要像DRAM那樣頻繁的刷新,這使得它的速度大大加快。不幸地是,SRAM的價格也比DRAM昂貴得多,只得以被少量的使用。 SRAM適合用於處理器的高速緩存,DRAM則適用於大規模的主存儲器。最後還有一種視頻RAM(VRAM),它是一種有視頻硬件使用的一類內存。在下一 章中,會有一個例子用語演示如何通過控制VRAM來向屏幕輸出信息。

最近隨着某些硬件廠商對技術的不斷進步和特別的性能優化實現又衍生出很多新的縮寫出來,下面有幾個: 
  • DDR SDRAM
  • RDRAM
  • ESDRAM 
DDR SDRAM是雙倍數據傳輸速率的同步隨機存儲器。使用DDR SDRAM 數據可以在一個系統時間週期的上升沿和下降沿同時讀取數據,基本上兩倍於常規的可用帶寬。RDRAM是Rambus DRAM的簡稱,由Rambus公司出售的高性能版本的DRAM,它可以達到800MHz的傳輸速率。增強型的同步DRAM(ESDRAM),由 Enhanced Memory Systems,Inc 公司生產,作爲取代SRAM的一種更廉價的SDRAM。

1 (bit)比特是一個二進制數,(例如一個1或者一個0)。RAM中由比特這樣的基本單元結構構成,依據RAM的類型,以某種晶體管和電容器的佈局方式組 成。每一個單元是一個可以設置爲‘開’ 和‘關’的數字開關(例如:1或者0)。這些單元每八個分爲一組成爲字節(bytes)。字節是用來計量存儲器所提供的內存總量的的基本單位。在過去,硬 件廠商曾經使用不同大小的byte單位。有些使用6比特作爲一個字節,還有使用16字節作爲一個字節。而現在所有人都遵守了相同的8比特一爲個字節的標 準。

以下是以byte爲單位的內存單位容量說明。

1 byte = 8bits
1 word = 2bytes
1 double word = 4bytes
1 quad word = 8bytes
1 octal word = 8bytes
1 paragraph = 16bytes
1 kilobyte(KB) = 1,024bytes
1 megabyte(MB) = 1,024KB = 1,048,576bytes
1 gigabyte(GB) = 1,024MB = 1,073,741,824bytes
1 terabyte(TB) = 1,024GB = 1,099,511,627,776bytes
1 petabyte(PB) = 1,024TB = 1,125,899,906,842,624bytes


    註解:在80 年代,擁有一個上M的DRAM內存已經很了不起了。孩子們不斷的遊說父母再升級16KB的內存,讓他們在Atari400可以玩上更復雜一些的遊戲。在那 個時候只有1M內存並不是什麼大問題,因爲軟件工程師們都傾向使用匯編代碼構建更加精巧的程序。實際上,經常有人引用比爾蓋茨於1981年的一句話: "640K的內存對於每個人都綽綽有餘了"

 而今,大多數用於開發的計算機至少擁有128M的DRAM,在2002年擁有256M被視爲是標準配置。此後的十年內。上G的內存將作爲標準配置出現。(如果我們仍使用DRAM)。希望以後不要有人引用我的這段話。


RAM並不是唯一存儲數據的地方,這裏引出了我們內存層次結構的議題。不同的數據存儲位置,根據與處理器的遠近關係排列。排列後產生了如下層次結構:


1.Registers   寄存器
2.Cache    高速緩存區
3.RAM     主內存
4.Disk storage 硬盤


這些存儲器之間最大的區別在於存儲時滯或者說延遲。訪問靠近處理器的存儲設備所用的時間比相對稍遠處理器的存儲器少。處 理器訪問硬盤上數據的時間遠遠的大於處理器訪問它內部的高速緩衝區數據的響應速度。比如,DRAM往往使用納秒來衡量時滯,而硬盤的時滯,卻是用毫秒來衡 量!(如下表1.1)


File?id=dhq2hrzd_49cb9gpfd6_b
圖 1-1

寄存器是位於處理器內部的小型存儲器。寄存器是處理器鍾愛的工作區。處理器的大部分日常工作是對寄存器中的數據進行處理。將數據在寄存器之間移動,是最爲實用的數據移動方式。


工 程師們在設計的編譯器時跨越種種難題,力求將所有變量和常量都保存在寄存器中。應用程序狀態保存在處理器內部所擁有的大量寄存器中從而降低了存儲時滯。因 此MIPS64處理器設計了32個64位的通用寄存器。安騰——INtel的下一代64位處理器,更加不可匹敵,它有用竟然數百個寄存器。

Intel Pentium處理器擁有多種寄存器(如圖 1-2)其中:6中16位的段寄存器(CS,DS,ES,FS,GS,SS)。8位,32位通用寄存器(EAX,EBX,ECX,EDX,ESI, EDI,EBP,ESP )還有一個32位的錯誤標誌寄存器(EFLAGS)用以標識錯誤狀態,以及一個32位的指令指針寄存器(EIP)。

 File?id=dhq2hrzd_50fzpqxmhp_b
圖 1-2


高級內存管理的功能得到由四種系統寄存器(GDTR,LDTR,IDTR,TR)和五種模式控制寄存器(CR0,CR1,CR2,CR3,CR4)協助。這些寄存器的使用方法會在後面介紹。

    註釋:  注意很有意思的是由於歷史的原因Pentium處理器的寄存器數量受到了限制由於向後的兼容性的設計需求,使得Pentium處理器所擁有的寄存器數量比當年的8086沒有太多增加。

高 速緩衝區提供訪問速度大於DRAM的臨時存儲器。通過將程序部分集中放置在高速緩衝區中的進行運算的方式,處理器可以避免重複訪問DRAM所帶來的性能開 銷,這個效果十分顯著。有不同類型的高速緩衝區。L1緩衝區是位於存儲器內部的存儲器。L2是典型的SRAM類型存儲器,於處理器外部。(例如, Intel Pentium4搭載了這樣256或者512KB的高速緩存器)

    註釋: 如果你正在嘗試針對高速緩衝區優化程序代碼,你應該避免不必要的函數調用。調用一個遠程函數需要處理器執行高速緩衝區以外的代碼。這將會導致重新裝載高速緩衝區裏的內容。這也便是爲什麼某些C編譯器提供內聯函數功能選項的原因。從另一個一方面來說使用內聯函數比不使用內聯函數的程序體積更大(佔用更多的存儲器空間)時間和空間的互換的取捨平衡的問題一直貫穿整個計算科學領域。

硬 盤是數據存儲的最後一個位置。通常,硬盤常常用於創建虛擬內存。虛擬內存使用硬盤空間來模擬主內存。換言之,將一部分存儲在DRAM上的數據寫入硬盤,處 理器便可以訪問的內存總量大於實際物理內存。例如,如果你有10MB的DRAM內存並且使用了2MB的硬盤空間作爲虛擬內存,處理器便可以訪問12MB的 虛擬內存。

   
註釋:我將在本書中反覆重申的一點是硬盤I/O的嚴重性能損耗。正如我之前所提到的,硬盤是使用毫秒爲單位來橫定響應能力的。處於處理器來說這個時間太過漫長。這個情形就類似遠北達科他州做pizza的小店,如果運氣好的話,你冰箱裏有一個冷凍pizza,加熱只需要30分鐘。否則你不得不給那個pizza小店叫份pizza外賣(就好象訪問硬盤上的數據)然後花上幾個小時等待外賣小子跨越150英里的距離送到你的房間。

使用虛擬內存就好象跟魔鬼打交道,當然你會獲得很多擴展內存,但是你會在性能上付出昂貴的代價。硬盤I/O涉另一整套的操作行爲,其中還有一些物理機械性的。Windows系統的內存分頁,
粗略的估計會因此佔用10%的執行時間。管理虛擬內存還需要生成大量的內存信息記錄。我會在後面詳細的談論有關虛擬內存信息記錄的內容。
                                     題外話
我 曾經在一家ERP的公司工作過,其中一位副主管常常對過度濫用硬盤I/O的工程師進行懲罰。在代碼複審時候,他會用grep命令搜索源代碼裏面的所有 fopen()和fread()標準庫函數。我們接受了這樣基本課程:你應該儘可能的將一切緩存到內存中只有在別無選擇的情況下才將數據保存到硬盤中(這 個操作甚至需要得到他的許可)。歸功於該副主管,公司的三層中間件產品成爲產業中性能最高的。
硬 盤總是比RAM便宜,在60年代買一塊8KB的RAM花費不菲,用硬盤虛擬內存或許很有意義。今天,硬盤和DRAM的價格差距並不是像以前那樣那麼明顯 了。買一臺512MB內存的計算機並不是大不了的事情。虛擬內存可能會完全成爲歷史或者成爲某些緊急情況下的數據安全方案。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章