天天看點

【計算機組成原理】存儲器前言寄存器高速緩存器(Cache)主存(RAM)外存存儲容量的計算擴充閱讀

前言

存儲器就是帶存儲功能的部件,它是馮諾依曼體系裡必不可少的組成部分。

在馮的模型中我們把存儲器抽象成一個了整體,而在現代的計算機中,存儲體系是采用的分層的政策。

下面從與CPU關系緊密程度的順序來詳細介紹。

寄存器

這是速度最快的存儲器了,延遲小于CPU的時鐘周期。位于CPU内部,與内部內建電路直接連接配接。通常是以寄存器堆(RegisterFile)的方式存在。下圖就是32位寄存器堆,可以看到它有位址線,資料線,讀寫控制,以及CLK信号。

【計算機組成原理】存儲器前言寄存器高速緩存器(Cache)主存(RAM)外存存儲容量的計算擴充閱讀

高速緩存器(Cache)

這是為了解決記憶體與CPU之間讀寫速度差異過大而設定的緩存結構。Cache本身是SRAM(static RAM),這種結構是不用定期重新整理的,而且讀寫速度很快。從下圖可以看到,一個SRAM存儲單元裡,有兩個P型mos管,4個N型mos管,通過WL來控制外部是否能通路該單元,通過BL,BLB來傳送讀寫資料資訊。這麼複雜的結構竟然隻儲存一個比特的資料,難怪它這麼貴。

【計算機組成原理】存儲器前言寄存器高速緩存器(Cache)主存(RAM)外存存儲容量的計算擴充閱讀

它在使用的時候,可以看做一個表。如果采取直接映射的方式,就是類似下圖這樣,每個表項存了連續的16個位元組的内容,舉個例子,現在CPU要通路4021H的位址,這時候就cache miss了,然後就去主存取資料來,因為是4位元組對齊的,取得位址實際上是從4020開始取,取16個位元組,存到表項2中,并且有效位置1,标簽寫入40H。

【計算機組成原理】存儲器前言寄存器高速緩存器(Cache)主存(RAM)外存存儲容量的計算擴充閱讀

不過,為了提高cache hit率,這種直接映射的方式就淘汰了,改為組相連的方式,組相連就是把原來的表項分為并列的若幹組,這樣有效的減少了cache的替換次數,不過這樣帶來的一個新的問題,就是現在替換的目标不再是唯一的了,可以選擇替換,是以替換政策也是一個提升性能的點,當然最好的還是LRU了。

下圖是Core i7的cache結構,其中L1級的兩個cache采用的是8路組相連,L2也是8路組相連,指令和資料放一起,L3是16路組相連,指令和資料放一起。

【計算機組成原理】存儲器前言寄存器高速緩存器(Cache)主存(RAM)外存存儲容量的計算擴充閱讀

主存(RAM)

主存是DRAM(dynamic RAM)結構,這種結構采用電容沖放電來儲存資訊,而且需要定期重新整理來保證電容上的電荷。其實可以根據實作技術的不同,把DRAM分為兩種,SDR SDRAM和DDR DRAM。後者就是Double Data Rate技術,也就是會在一個周期裡讀出兩個資料。

下圖的紫色部分就是一片DRAM,其中每個存儲單元都是由一個MOS管和一個電容構成的,顯然比SRAM簡單多了。

【計算機組成原理】存儲器前言寄存器高速緩存器(Cache)主存(RAM)外存存儲容量的計算擴充閱讀

DRAM的工作方式是怎麼樣的呢?下圖,我們可以看到,CPU向位址總線發送位址後,主存的控制器收到位址,就先轉給行位址解析器,這裡可能同時會由預充電發生,然後找到目标單元所在的行,并把整行資訊在放大之後都存到Sense Amplifiers中去(暫且就把它看做一個緩存的地方),然後主存控制器又将列位址發送到列位址解析器,這樣列選擇之後,就會将目标位址的内容送入資料緩存(Data I/O Buffers)中,而通路記憶體通常不會隻讀一個數,而是讀多個數,這些數都會被依次送入到資料緩存中。剛剛講了一個預充電的過程,它隻有在行緩存的資訊是無用的時候,會預充電,以便将行緩存的内容清除。

【計算機組成原理】存儲器前言寄存器高速緩存器(Cache)主存(RAM)外存存儲容量的計算擴充閱讀

分析一個記憶體的性能,要同時考慮訪存延遲和訪存帶寬,如果一個人使勁吹訪存帶寬,其實是沒道理的。

總結。存儲器的性能發展較之CPU來說,可以算是沒有多大進步,買記憶體條SDRAM,DDRRAM,如果是因為記憶體容量不足可以買DDRRAM,如果是速度那就買SDRAM。其實這個言論也隻局限于理論,現在有些機器可能對DDRRAM支援比較好,另外追求速度更可靠的方式應該從CPU或者SSD考慮。

外存

硬碟,優盤。它們就不是随機存取了,通常都是機械的方式,是以速度很慢。

存儲容量的計算

硬碟、優盤廠商喜歡用1kb = 1000b的換算方式,而計算機裡是1kb = 2^10b的換算方式,是以買回來的優盤明明是4Gb結果隻有3.7Gb。

為此,國際标準組織搞了個新标準,來區分計算機裡的k,m,g機關字首。1kib,表示2^10b,而1kb,表示1000b。

擴充閱讀

每個程式員都應該知道的一些延遲資料

Latency Comparison Numbers
--------------------------
L1 cache reference                           0.5 ns
Branch mispredict                            5   ns
L2 cache reference                           7   ns                      14x L1 cache
Mutex lock/unlock                           25   ns
Main memory reference                      100   ns                      20x L2 cache, 200x L1 cache
Compress 1K bytes with Zippy             3,000   ns        3 us
Send 1K bytes over 1 Gbps network       10,000   ns       10 us
Read 4K randomly from SSD*             150,000   ns      150 us          ~1GB/sec SSD
Read 1 MB sequentially from memory     250,000   ns      250 us
Round trip within same datacenter      500,000   ns      500 us
Read 1 MB sequentially from SSD*     1,000,000   ns    1,000 us    1 ms  ~1GB/sec SSD, 4X memory
Disk seek                           10,000,000   ns   10,000 us   10 ms  20x datacenter roundtrip
Read 1 MB sequentially from disk    20,000,000   ns   20,000 us   20 ms  80x memory, 20X SSD
Send packet CA->Netherlands->CA    150,000,000   ns  150,000 us  150 ms

Notes
-----
1 ns = 10^-9 seconds
1 us = 10^-6 seconds = 1,000 ns
1 ms = 10^-3 seconds = 1,000 us = 1,000,000 ns
           

繼續閱讀