上一章只是簡簡單單的講了計算機是怎么運行的,從這章開始,就要進行系統(tǒng)的學(xué)習(xí)計算機的每一個系統(tǒng)了,那么第二章講的就是存儲系統(tǒng)。
2.1 存儲系統(tǒng)概述
存儲系統(tǒng)就是計算機存儲程序和數(shù)據(jù)的系統(tǒng),由各種存儲設(shè)備和控制部件及管理信息調(diào)度的硬件和軟件組成,具有存入和取出兩大功能。
2.2.1 存儲體系
現(xiàn)代的計算機需要滿足大容量,高速度和低成本三項要求。但是,大容量的便宜運算速慢。運算速度快的儲存元件運算速度快但是價格大,存儲內(nèi)容小。于是為了滿足現(xiàn)代計算機的要求,采用了分層存儲體系。把各種不同存儲容量,不同存取速度,不同價格的存儲器組合在一起。發(fā)揮它們最大的優(yōu)勢。
它們之間的信息調(diào)度是由輔助硬件或者軟件直接完成的。能發(fā)揮整個存儲系統(tǒng)的最大效能,有最佳的性價比。
當然最主要的是它的工作原理:
cpu先訪問運行速度最快的存儲器,如果找到了返回,沒有則通過管理軟件或者輔助硬件向下一級運算速度較慢存儲器中尋找。找到則返回內(nèi)容,如果還沒有則到運算速度更慢的存儲器中尋找比如硬盤,直到找到。沒有找到的化,則返回失敗。找到了,則把內(nèi)容逐漸上調(diào)。
這里同時也要注意,在cpu和主存之間有一個高速緩沖存儲器,用來提高CPU的訪問速度。這個是由純硬件實現(xiàn)。而在主存和輔存之間采用虛擬存儲技術(shù),由軟件和硬件共同實現(xiàn),擴充容量。同時,CAche的容量很小,只有幾兆字節(jié),用來存放臨時數(shù)據(jù)和指令。而主存的容量有幾G字節(jié),速度稍微慢點。輔存是最大的,用來存放系統(tǒng)程序和大型文件和數(shù)據(jù)庫等,運行速度是最慢的。
2.1.2 存儲器分類
1,按照構(gòu)成存儲器的器件和存儲介質(zhì)分類可分為磁介質(zhì)存儲器,電子介質(zhì)存儲器,紙介質(zhì)存儲器等。目前主要用的是磁介質(zhì)存儲器。
2,按存取方式分類可分為隨機存儲器RAM,只讀存儲器ROM和串行存儲器SAM。
3,按制造工藝來分可分為雙極性存儲器和金屬氧化物半導(dǎo)體存儲器。
4,按照計算機的作用來分類的化,存儲器又可分為主存儲器,輔存儲器和緩存。
5,按信息的可保護性分類又可分為易失性存儲器和非易失性存儲器。這里簡單說一下,易失性存儲器就是斷了電沒法保存信息了,主要應(yīng)用于主存。而非易失性就是斷了電還能保存,就是硬盤啥的。
具體分類大家自己再去網(wǎng)上查一下。
2.1.3 存儲器的主要性能指標
說到這個,大家可以去前面我寫的文章里查看一下CPU的性能指標都是啥,下面來介紹一下存儲器的性能指標。
1,存儲器的存取時間
從存儲器中讀出或者寫入一個存儲單元的信息所需要的平均時間叫存儲器的存取時間,從字面意思上就已經(jīng)好理解了。
2,存儲器存取周期
存儲器進行一次完整的讀寫操作所需要的全部時間叫存取周期。舉個例子,就是說老師第一節(jié)課45分鐘休息10分鐘,那么上課(存取)時間就是45分鐘,上課周期(存取周期)也就是55分鐘。周期是這一個操作完成到下一個操作開始中間所間隔的時間。
3,數(shù)據(jù)傳輸率
單位時間可寫入存儲器或從存儲器取出的信息的最大數(shù)量稱為“數(shù)據(jù)傳輸率”或者“存儲器的傳輸帶寬”,單位為字節(jié)/秒(B/s,Bps)或位/秒(b/s,bps)。舉個例子簡單的了解一下,
某存儲器數(shù)據(jù)傳輸率BW,存儲周期Tm,存儲器主頻F,每次訪問讀寫n個字節(jié),則
存儲器主頻:F=1/Tm
存儲器帶寬:BW=n/Tm=n*F
當然還有一些其他指標,比如價格啊啥的,最主要的就是以上三個指標。
2.2 主存儲器
2.2.1 主存儲器的基本組成
1,主存儲器的組成部分
①存儲陣列,就是存儲單元集合在一起
②地址譯碼與驅(qū)動器,驅(qū)動地址譯碼器翻譯從CPU傳來的地址并選中某一單元
③讀寫電路,對你選中的那個存儲單元進行讀或者寫操作
④控制部件,控制操作的順序。
2,存儲器的組成結(jié)構(gòu)
主存儲器主要有兩種基本組成結(jié)構(gòu):字片式結(jié)構(gòu)和位片式結(jié)構(gòu)
(1)字片式結(jié)構(gòu)
它是一種采用單譯碼方式的結(jié)構(gòu),訪存地址只進行一個方向的譯碼。具體請看下圖
我解釋一下它是怎么進行讀出存取的,CPU先發(fā)出指令,也就是A0-A5,然后放到寄存器里面,當控制信號過來了告訴它可以進行編譯了,放入地址寄存器的地址譯碼器開始進行譯碼,然后在W0-W63中選到了W1,因為這是個字片式結(jié)構(gòu)所以它只能選一個方向,圖中的就是行方向,然后把w1這一行里面所有的存儲單元全部取出一共是8位一個字節(jié),傳給讀寫電路。
(2)位片式結(jié)構(gòu),這一個就很好一點它是雙譯碼方式的結(jié)構(gòu),需要對列地址和行地址(這個是cpu主動分配的)兩個方向進行譯碼儲存器讀寫速度的排序,選中行和列交叉處的存儲單元被唯一選中具體請看圖
它是怎樣尋找存儲單元的呢,首先CPU發(fā)出 分別對應(yīng)A0-A5和A6-A11,都放入它們對應(yīng)的寄存器里面。然后,cpu控制信號來了,地址譯碼器分別對行地址和列地址進行譯碼,然后分別選中某一行和某一列,然后這行和列交叉的存儲單元就被放入讀寫電路。只有1位。
2.2.2 RAM
我們規(guī)定AB=10為1,AB=01為0
1,SRAM 無需刷新
這個就是SRAM。我給大家解釋一下,SRAM是由雙穩(wěn)態(tài)觸發(fā)器構(gòu)成,靠mos管存儲信息。
像T5,T6那就是mos管,上面一通電,下面就可以有電流流過。那么它是怎么進行讀和寫的呢。
讀:X,Y地址選中,T5T6通電,電流打通
1)若存的是“1”AB=10則T2通,有電流傳導(dǎo),到D非進而到I/O非然后右側(cè)有脈沖表示1
2)若存的是“0”,AB=01則T1通,左側(cè)有電流傳到到D,進而到I/O,左側(cè)有脈沖,表示0
寫:寫就容易多了,X地址和Y地址選中,強行打入高電平和低電平,假設(shè)T2為高電平T1為低電平表示為10為1然后你要寫0即01那么你就直接在I/O和I/O非端進行輸入電平信號強行改變即可。
2,DRAM需要刷新
它沒有SRAM那么復(fù)雜,沒有那么多mos管,造價比較便宜,是由電容和少量mos管組成
讀:讀選擇線選中通入電流,T2導(dǎo)通,然后預(yù)充電信號給出T4也導(dǎo)通,如果Cg里面有電荷那么讀數(shù)據(jù)線就會有電流,如果里面沒有,那么讀數(shù)據(jù)線就沒有電流。由此可以判斷是否為0或1.我們可以看到這個讀會破壞Cg里面的電荷,所有這是破壞性的讀。需要不斷刷新來維持里面數(shù)據(jù)的正確性,同時還有一個理由就是cg會隨著時間久慢慢放電,所以需要不斷地刷新來維持數(shù)據(jù)。
寫:先是寫選擇線選入,T3導(dǎo)通,如果寫1,則在寫數(shù)據(jù)線通入電流給Cg充電,如果寫0,則不充,反之放電把里面的電荷放光。
當然,還有更簡單的DRAM
只用兩個mos管和一個Cg
讀:X地址和Y地址被選中,T和T'導(dǎo)通,如果cg里面有電則i/o會檢測到電流,為1.若沒有檢測到電流說明里面沒有電荷為0.我們可以看出,他也是一個破壞性的讀操作,也需要不斷地刷新。
寫:T和T’導(dǎo)通,i/o給電流,充電為1,不給電流,則放電為0
當然,最重要的是刷新操作,刷新總共有三種方式,集中刷新,分散刷新和異步刷新
集中刷新:集中刷新是在信息保存的允許范圍內(nèi),集中一段時間對所有的基本存儲單元一行一行地順序刷新,這段時間稱為刷新時間。
刷新時間=存儲矩陣行數(shù)×存儲周期(刷新一行所需要的時間)
舉個例子,一共有128行,刷新周期為2ms就是說要在2ms內(nèi)完成讀寫和刷新所有操作。假如一次讀寫是0.5us那么128行刷新就需要64us,且只有用來讀寫。那么在那64us內(nèi)就不能進行讀寫了,這就變成了死時間。雖然讀寫操作不受刷新工作的影響,但是在那死時間內(nèi)必須停止讀寫。
分散刷新:每隔一段時間刷新一次,把刷新操作分散到每個存取周期內(nèi)進行,此時系統(tǒng)的存取周期tc被分為兩段,前斷ta進行讀寫操作和保持,后斷tb進行刷新即tc=ta+tb,刷新操作與CPU操作無關(guān)。
舉個例子,若ta=0.5us那么tc就是0.5+0.5=1us對128行進行存儲的化刷新周期為128秒,雖然沒有死時間但是存取周期太長,讀取寫入太慢。而且刷新時間過于頻繁。
異步刷新:是結(jié)合前兩種刷新方式。就是說,根據(jù)刷新的行數(shù)對刷新間隔進行分割,分割后的每段時間中,再分成兩部分前一段時間用來讀寫或者保持。后一段時間用來刷新。
舉個例子,刷新間隔為2ms,當行數(shù)為128時每隔2ms/128=15.6us就刷新一行,而每次刷新的時間仍然是0.5us這樣死時間就只有0.5us了。異步刷新雖然減少了刷新次數(shù)但是仍然有死區(qū),但比集中刷新少了很多。
2.2.3 ROM
ROM大家就自行上百度進行搜索了解,并不為重點,簡單的了解一下即可。
2.2.3 半導(dǎo)體存儲容量的擴展
1,半導(dǎo)體存儲容量擴展需要考慮的問題
我們知道CPU從存儲器中進行讀寫操作時,先給出地址到存儲芯片上,然后進行信息交換,但是一個單片存儲器的容量是有限的,需要許多片來進行組合才能成為一定容量的存儲器。但是這么多存儲片怎么通過地址來查找到正確的存儲片進而在這個存儲片中尋找到單元呢,于是就有了地址譯碼實現(xiàn)片選,進而尋找正確的存儲單元。它主要有三種方法有線選法,全譯碼法和部分譯碼法。下面我們一個一個的進行講解
1)線選法:直接將某些高位地址線連接到存儲芯片的片選端,當該地址線為0或者1時就選中該芯片,即用一根地址線選通一塊芯片。
下面請看一個例子
【例】某微機系統(tǒng)的地址位為16位,選用256×8的ROM和RAM存儲器芯片各一片擴展為512B存儲器
這里我給大家解釋一下,因為這個微機系統(tǒng)的地址為16位所以其地址為A0-A15比如0 1011,加入我用A15作為標志,若A15為1選中第一個,A15為0選中第二個,這個就是進行片選,選中哪一個芯片,然后A0-A7就是片內(nèi)選,在這個芯片中選中哪一個存儲單元。但是,這里A8-A14沒有進行譯碼,比如0 1101 和00 1101因為該譯碼方式只譯碼A0-A7和A15,所以這兩個地址碼對于內(nèi)存都是一樣的。這就發(fā)生了地址重疊。
為了避免發(fā)生地址重疊,我們就用全譯碼方法
2)全譯碼法
全譯碼法是對全部地址線進行譯碼,將地址的低位直接接到存儲器芯片的地址端,實現(xiàn)片內(nèi)選址;將剩余的高位全部接譯碼器的輸入端,經(jīng)譯碼器后做輸出并進行片選,實現(xiàn)片選尋址。
【例】某十六位微機系統(tǒng)擴展和,用1K×8的芯片,地址安排在64K空間的最低4K位置。
解釋一下,比如倆地址A0-A15,這回我要它們?nèi)窟M行譯碼,其中A0-A9用來進行片內(nèi)尋址,A10-A15進行片選尋址,這樣每一個地址都沒有浪費,而且也不會發(fā)生地址重疊,比如1 1110和1 1110 那么前面六位1010 01和1101 01進行片選將它們放入地址譯碼器中用來進行片選選取哪個芯片,而后面的00 1100 1110和00 1100 1110 用來對選中那個芯片進行片內(nèi)選址,在這個芯片里選取正確的單元。雖然很好,但是電路太過于復(fù)雜。
3)部分譯碼法
這個就是前面兩個的結(jié)合體不要求提供CPU可尋址的全部單元,則用兩者結(jié)合的方法。將高位地址的部分地址線參加譯碼,一部分不參加譯碼,所以會出現(xiàn)地址重疊。但不是很多
【例】CPU地址總線為16位,存儲器由4片8容量為8kB的芯片構(gòu)成,采用部分譯碼尋址32KB。
有了上面兩個例子的理解,這個例子就會好理解很多,A13-A14進行片間尋址,A0-A12就是片內(nèi)尋址尋找正確的存儲單元。其中A15不參加譯碼。由此可見還是會存在地址重疊但是不是很多。
2,半導(dǎo)體存儲器的擴展方式
擴展半導(dǎo)體存儲器的容量有三種方式:位擴展方式和字擴展方式和字位擴展方式。這里字位同時擴展就需要先進行位擴展再進行字擴展。給大家畫張圖來理解一下
因為位比較好擴展所以先進行位擴展然后再進行字擴展。
存儲器芯片的容量個數(shù)由以下公式得出:
存儲器芯片數(shù)量=(存儲器總的單元數(shù)×位數(shù)/單元)/(每片存儲芯片的單元數(shù)×位數(shù)/單元)
1)位擴展方式 當芯片的單元數(shù)與存儲器要求的單元數(shù)一致,比如我要128個字節(jié)就有128個字節(jié)了但是位數(shù)我要16位你只給我8位那么我必須要進行位擴展。其連接的方式就是:將所有的芯片地址線,片選信號和讀寫控制線并聯(lián),數(shù)據(jù)線單獨列出,分別連接CPU數(shù)據(jù)線的對應(yīng)位。
【例】 用2114(1K×4)芯片構(gòu)建1kB的半導(dǎo)體存儲器。
先確定存儲芯片的數(shù)量,運用那個公式,1K×8/1K×4=2于是就是要兩片芯片,然后進行如圖連接即可
2)字擴展方式
當所需位數(shù)相同但是我的芯片容量不夠,可以用足夠多的存儲芯片擴展單元來進行組合達到要求。比如我需要128K×8個字節(jié)但是我一個芯片是64×8個字節(jié)于是我只能用兩個芯片進行連接。
【例】用6116(2K×8)芯片構(gòu)建8KB的半導(dǎo)體存儲器。
套用公式需要4片
3)字位擴展方式,當你所需要的位數(shù)也不夠字節(jié)數(shù)也不夠那么我們必須兩個方面都進行擴展才能滿足要求。
【例】CPU地址總線為16位,用SRAM(1K×4)芯片構(gòu)成4K×8位存儲器,畫出連接圖,并寫出地址分配表。
首先我們要確定需要多少個芯片
存儲器芯片數(shù)量=(存儲器總的單元數(shù)×位數(shù)/單元)/(每片存儲芯片的單元數(shù)×位數(shù)/單元)
即(4K×8)/(1k×4)=8需要8片那么連接如圖
地址分配表如下圖:
更:
前面講的就是一些存儲器的東西,但是為了提高速度除了提高主存的絕對速度之外還有一種就是通過改變主存的結(jié)構(gòu)進行,提高其相對速度。
2.5.5 并行存儲技術(shù)
1,單體多字系統(tǒng)
首先看圖:
因為程序和數(shù)據(jù)在存儲體內(nèi)是連續(xù)存放的,因此CPU訪存信息也是連續(xù)的,所以主存將一個地址給過去可以把周圍所有的數(shù)據(jù)都給拿出去,傳輸出去。這樣一下子可以拿出4個w位的數(shù)據(jù)。但是這有一個壞處,就是你要確保這里的指令和數(shù)據(jù)在主存內(nèi)都是連續(xù)存儲的,一旦遇到轉(zhuǎn)移指令,或者操作數(shù)的存放不連續(xù),那么該方案就失去提速的效果。
2,多體并行系統(tǒng)
它由多個能夠獨立操作的模塊構(gòu)成,稱為“多模塊存儲器”,每個模塊包括獨立的存儲器地址寄存器MAR,存儲數(shù)據(jù)寄存器MDR,讀寫電路和存儲體。它有兩種編址方式
1)高位交叉編址
主存地址被分為高n位和低m位,高n位為模塊地址,低m位為塊內(nèi)地址;在一個模塊內(nèi),信息從低地址連續(xù)存放,連續(xù)單元存取一般只對一個模塊進行存取。它的運行速度很慢,但是比較容易擴充
T為存取一個字所需要的時間,t為總線傳輸周期,m為模塊數(shù)
它連續(xù)讀取m個字所需要的時間為
t2=mT
2)低位交叉編址
和上面的正好相反,它的是低位m表示模塊地址,高位n表示塊內(nèi)地址,對連續(xù)單元進行存放時多個模塊并行工作,怎么說呢就是你要取一個連續(xù)存儲空間的數(shù)據(jù),比如00 0000-00 0011內(nèi)的數(shù)據(jù),這四個同時工作,但是如果你要用高位編址的話,那就只有一個在工作,大大地提高了速度。
T為存取一個字所需要的時間,t為總線傳輸周期,m為模塊數(shù)
它連續(xù)讀取m個字所需要的時間為
t2=T+(m-1)*t
2.3 高速緩沖存儲器
這個東西你這樣理解,一般就可以執(zhí)行一條指令,而主存呢60-120ns才可以訪問一次,這就造成了當cpu急著干活嘞,你主存不把工作給它。于是緩沖器就出現(xiàn)了,它是介于主存和cpu之間的一個由純硬件實現(xiàn)的東西。它的讀取速度很快,它先把主存里的那些常用的數(shù)據(jù)和指令都放在里面,這樣cpu就先從緩沖器里面找指令,然后執(zhí)行,與此同時不斷地更新緩沖器里面的內(nèi)容。它就相當于主存的副本,一些常用的指令數(shù)據(jù)副本。
2.3.1 CACHE的基本工作原理
1,程序訪問的局部性原理
提供它的目的就是讓其適應(yīng)CPU的存取速度,即一定時間內(nèi),被訪問的指令和數(shù)據(jù)集中一部分。它包括兩個方面:
1)時間局部性:就是說現(xiàn)在達到訪問數(shù)據(jù)或者指令將來可能還會被訪問,就是循環(huán)程序
2)空間局部性:如果一個存儲單元被訪問那么它相鄰的存儲單元有可能也會被訪問這就因為其中大部分指令是順序存儲的,順序執(zhí)行的且數(shù)據(jù)也是由數(shù)組儲存器讀寫速度的排序,樹等結(jié)構(gòu)簇聚在一起。
2,cache——主存存儲空間結(jié)構(gòu)
你這樣看這個圖,先看主存地址,它的主存塊號是不是有m位,那就說明他有2^m
個字塊,你再看塊內(nèi)地址,是不是有b位那就說明有2^b個字,那么主存就是有2^m×2^b個字
你看cache的,有c位緩存塊號,那么它就有2^c個字塊,和主存一樣一個字塊里有2^b個字,它就有2^c×2^b個字,這樣我們可以看出c