存儲器
存儲器的分類
磁芯存儲器:通過磁性材料的磁場方向來存儲信息,X、Y方向通電來改變磁場方向
半導體存儲器是易失的,剩下的是非易失的
Flash Memory:半導體存儲器,速度比磁盤快、比存儲器慢,用作U盤,也可作為高性能硬盤和主存和輔助存儲器之間的緩存層(SSD)
https://zhidao.baidu.com/question/72838372.html
目前市面上出現了大量的便攜式存儲設備,這些設備大部分是以半導體芯片為存儲介質。采用半導體存儲介質的優點在於可以把體積變的很小,便於攜帶;與硬盤類存儲設備不同,它沒有機械結構,所以不怕碰撞,沒有機械噪聲;與其它存儲設備相比,耗電量很小;讀寫速度也非常快。半導體存儲設備的主要缺點就是價格較高和容量有限。現在的半導體存儲設備普遍采用了一種叫做“Flash Memory”的技術。從字面上可理解為閃速存儲器,它的擦寫速度快是相對於EPROM而言的。Flash Memory是一種非易失型存儲器,因為掉電后,芯片內的數據不會丟失,所以很適合用來作電腦的外部存儲設備。它采用電擦寫方式、可重復擦寫10萬次、擦寫速度快、耗電量小。
只能說它是一種特殊的半導體存儲器,非易失
trade-off:復雜的存儲體系是在速度和價格之間權衡的結果
通過軟硬件相結合的方式,將存儲體系連接為一個整體,使得從某一級程序員來看,存儲是一個高速、大容量、低價格的透明整體
存儲層次
分為緩存-主存、主存-輔存兩個層次,緩存-主存通過硬件連接(為了提高速度)並且使用主存的尋址方式;主存-輔存通過軟硬件結合的方式連接(解決容量為主,速度不太重要)並且使用虛擬地址解決主存和輔存尋址方式不同的問題。
主存
主存的技術指標
存取時間:從存儲器給出地址到得到穩定的數據輸出或者輸入的時間間隔長度
一般來說,存儲周期比存儲時間長
半導體存儲芯片
通過地址線寬度和數據線寬度計算芯片容量:
容易理解
片選線:現在的存儲器都集成了多個芯片,片選線用來選擇使用哪一個或者哪幾個芯片
讀寫控制線可以用一根,也可以用兩根:
半導體儲存芯片的譯碼驅動方式
- 線選法
輸入是4位,所以有2的4次方個地址,也就是16。而輸出的是每一個地址對應的數據長度,也就是8位
這種線性方法限制了容量的增大
- 重合法
X、Y分別為行和列
行列中分別只能有一個是有效的,所以只有一個會進行輸出
尋址方式由線性變成了二維,在有限的芯片大小上大大增加了存儲的數據量
RAM
RAM分為靜態RAM和動態RAM
靜態RAM(SRAM)
核心是一個觸發器,雙穩態電路
WE:讀寫(低讀高寫)控制、CS:片選信號(只有在低電平的時候該芯片才會被選中)
每個列選擇信號控制四列,所以每次四列同時輸出,也就是同時輸出4位
動態RAM(DRAM)
動態RAM時候電容,有電是1,沒電是0
如果要讀的話,先給預充電管充電,然后讀選擇線被導通
除了三管之外,還有單管的
刷新放大器:對電容上的信息進行定期刷新,以應對電容漏電
對於單管芯片:
注意它是1位的
對於地址要輸入兩次,行地址一次,列地址一次
讀放大器是蹺蹺板電路:一端設置電平為1,則另外一端就會變成0
動態RAM刷新
刷新只和行地址有關,和列地址沒關系:一行一行刷新
集中刷新:
在一個刷新時間間隔內,后面的128個存取周期是專門用來進行刷新的,無論是讀寫都無法在這段時間內進行,這段時間稱為“死區”:
分散刷新:
把刷新分布在每一次讀寫操作中,刷新過度了
異步刷新:分散刷新和集中刷新的結合
其實總的刷新占用時間和集中刷新是一樣,但是可以通過合理設計,將刷新安排在指令譯碼階段,就不會出現“死區”現象了
動態RAM和靜態RAM的對比
- 靜態RAM結構比動態RAM復雜,相應的它的集成度也就比較高,功耗也比較大(一直有管子在通電,所以才不需要刷新)
- 動態RAM行地址和列地址的傳輸可以通過一組地址線依次傳送,地址線和芯片的引腳也就因此可以減少了;但是靜態RAM為了體現它的高速訪問,所以一般不這樣做,所以它的芯片引腳也就比較多。
正因如此,DRAM一般用於做內存(主存),SRAM用於做緩存
ROM
發展歷程
類型
有無MOS管是廠家生產時就確定的,所以用戶無法對ROM進行修改
使用熔絲的硬核一次性編程,編錯了就再買芯片
想起了被大物支配的恐懼
通過紫外線擦除:
RAM and ROM in mobile phone
來源:https://www.zhihu.com/question/302518700
現在智能手機配置中的ROM指的是EEProm(電擦除可寫只讀存儲器)類似於計算機的硬盤,手機里能存多少東西就看他的容量了。而機子的反應速度看的是RAM,就像電腦中的內存相似。容量越大機子運行越快
主存儲器和CPU的連接
存儲器容量擴展
- 位擴展
- 子擴展
使用11根地址線,其中一根是用來進行片選的,如果它為0,則表示使用的是第一個芯片,其余的10根地址線上的地址指的是第一個芯片上的地址;如果為1,則使用第二個
- 字和位同時進行拓展
兩個芯片為一組
存儲器和CPU的連接
保存系統信息和配置的要放到ROM中(因為這些數據修改不多),用戶數據要放到RAM
以一道例題說明
根據題目要求,上面的那個2KX8位的是系統程序區(選用ROM),下面的1KX8位是用戶程序區(選用RAM)
根據題目要求,選用芯片
剩下的地址線作為芯片選擇信號(選擇是用RAM還是ROM):
使用138譯碼器,有CBA三個輸入和三個控制端(G1高電平有效,G2A和G2B低電平有效)。但是注意CPU還有一個MREQ信號用來表示訪問的是主存(低電平時)還是IO(高電平時),這個信號也要接入片選信號,與G2B相連接,以保證只有在CPU真正想要訪問主存(MREQ為低電平)時才會訪問主存
由上圖我們也可以看到,對於RAM,除了A0-A9作為有效的地址輸入外,我們還要求A10應該是0才是表示對RAM的一次訪問,所以我們需要對A10的值進行驗證,防止A10為1、也就是本來沒有打算訪問該RAM時錯誤地訪問了該RAM:
存儲器的校驗
-
為什么要對儲存器的信息進行校驗
內存中的內容也會出錯的(電子環境復雜時),信息可能會出錯
甚至是台式電腦,都會對信息進行校驗
-
如何編碼以校驗
合法代碼集合
如果合法代碼如上,即使出錯了、某一位由零變成一或者由一變成了零,出錯的代碼依然在合法代碼集合中,這樣是很難甚至是沒有辦法設置進行檢驗的
這種情況下,我們可以檢測出代碼是出錯的,但是只憑借出錯后的代碼,我們沒有辦法推出到底是哪一位代碼出錯了(因為合法代碼集合中有多個代碼可以變成該出錯代碼)
介紹一下三倍存儲方式:用三個0和三個1來表示0和1,這樣如果有一位出錯的話(一位出錯的概率最大,超過90%,這一點從概率上講也能理解,連着出錯概率太小了)立馬就可以知道是哪一位出錯了.
也有四倍存儲,但是這個很雞肋:
五倍存儲就好多了:
具體用幾位就看具體使用環境了,是正確性重要還是速度和容量重要
合法代碼集合中各個代碼的差異越大,檢測能力越強,這就引出了下一個概念:
漢明碼
關於漢明碼,我這篇文章中有:https://www.cnblogs.com/jiading/p/11876898.html講過,這里會更深入的去學
但是漢明碼使用的不是這樣的一種划分方式,而是一種非划分方式:
注意我們不是說這里存放的數據就是1-7,而是說這些位置的編號是1-7,因為這樣編號才能使得我們的各個分組的二進制校驗結果拼起來就是出錯位置
為什么校驗位要放在1,2,4上?因為校驗是對單個的分組進行校驗,它只能對該分組內進行作用,所以不能放在和其他組公用的位置
如果漢明碼檢測位有k位,原數有n位,則一共有n+k個可能出錯的位置,還有一種情況是沒錯的,所以2^k種漢明碼檢測位的結果要能表示該n+k+1中可能的狀態
漢明碼的糾錯過程:
如果判明了是檢驗位有錯,不影響原文信息,不糾錯也行
提高訪問存儲器的速度
存儲器的訪問速度跟不上CPU速度的提升,現在是限制計算機整體性能的一個主要因素之一
提高速度的措施有:
調整主存結構
存儲器的字長比CPU字長長,每次訪問多取出幾個字放在數據存儲器上以便於之后使用,減少和存儲器的交互,這也是順應程序訪問的局部性原理的
缺點有:
- 寫入單個字長數據時會比較麻煩
- 如果下一次不訪問相鄰字就沒用了
多個獨立的存儲器,可以並行使用
地址的前幾位是用來區分存儲器的
缺點有:
- 對於訪問相鄰資源沒用,因為他們非常可能都在一台存儲器上,只有一台在工作
- 適合容量的擴展,而不是提高速度
低位交叉解決了高位交叉所存在的問題
低位交叉下,相鄰數據是存儲在不同存儲器上的,這種並行效果好
啟動一個存儲器的訪問操作,在一個τ時間間隔之后,啟動對下一個存儲器的訪問操作,這樣就可以實現前一個剛剛傳輸完,后一個就接着傳輸,線路就不會空閑了
如果用單個存儲器的話,讀取四個字所需的時間是4T+τ
高性能部件
同步DRAM:
速度要和CPU匹配
RDRAM:
帶Cache的DRAM
高速緩存存儲器
Cache的工作原理
Cache也可以分塊,和主存的塊大小是相同的
一個塊在Cache和主存之間傳輸的時候是整體傳輸,塊內順序不變
Cache的標記記錄了主存的主存塊號,用於識別
塊太小的話,沒運行幾步就需要再次去讀,再次讀就不一定還在cache中了,所以塊小了命中率也會小,但是太大的話會占用其他信息的進入機會,也會減小命中率
命中率是最核心的指標
cache的基本結構
注意cache的地址映射規則
核心的幾塊是:
cache的讀寫
cache的寫要解決和主存的一致性問題
寫直達法訪問內存比較頻繁
寫回法可能造成不一致,尤其是並行系統
cache的改進
現在的處理器每個核有自己的cache,多核還有共用的cache,一般cpu內的cache能達到三級
將指令和數據分開,避免在流水的時候造成指令沖突
cache的地址映射
-
直接映射
內存的某個塊只能映射到某個指定的cache中主存字塊在圖中表示0-2^c-1,cache字塊地址表示是主存儲器的哪一個區(也就是去cache第幾個字塊去找)
結構簡單速度快,但是cache的利用率不能得到保證、沖突的概率高,即使cache其他位置是空閑的也不能存入,比較僵硬。一般用在靠近CPU的cache,這些cache對速度要求比較高
-
全相連映射
cache的任何位置都可以放
缺點就是找起來麻煩,比較的長度也長,相比於第一種就是比較時沒有捷徑走
一般用在距離CPU最遠的cache上,因為這些cache對速度的強調比較低、對利用率的強調更高 -
組相連映射
是1和2的融合
把主存儲器分區,每個區的大小依然和cache的組數是相同的(注意cache的一個組包括不止一個塊)
主存儲器中每個區的字塊可以放在cache相應的組的任何塊上
相比1好一些,比2也好找不少這種方式是現代計算機中cache常用的方式
一般用在中間的一些cache中
替換算法
選擇哪一個cache塊從cache中退出
第二種辦法比較好
輔助存儲器
輔助存儲器的特點是不直接和CPU交換信息
固定磁頭式硬盤需要的磁頭多,但是速度比較快;移動磁頭式硬盤則相反