前言
本文是對王道計(jì)算機(jī)考研《計(jì)算機(jī)組成原理》課程的總結(jié),主講咸魚學(xué)長講的確實(shí)清晰。
王道考研《計(jì)算機(jī)組成原理》
由于我們學(xué)校已經(jīng)開設(shè)過匯編和計(jì)算機(jī)體系結(jié)構(gòu),所以計(jì)組的筆記內(nèi)容會比較精煉,高屋建瓴,不適合無基礎(chǔ)人聽。
如果有不理解的,可以回去看看我前面的CSAPP筆記和匯編語言筆記(不過我感覺還是沒啥必要,我這篇文章更多的是總結(jié)性質(zhì),不適合入門學(xué)習(xí))
CSAPP筆記:
第一卷:程序結(jié)構(gòu)與執(zhí)行——信息表示、指令、處理器、性能優(yōu)化、儲存層次
第二卷:在系統(tǒng)上運(yùn)行程序——鏈接、異常控制流、虛擬內(nèi)存
第三卷:程序間的交流與通信——系統(tǒng)級IO、網(wǎng)絡(luò)編程、并發(fā)編程
匯編語言筆記:
匯編語言筆記——微機(jī)結(jié)構(gòu)基礎(chǔ)、匯編指令基礎(chǔ)
匯編語言筆記——匯編程序開發(fā)、匯編大作業(yè)
匯編語言筆記——接口技術(shù)與編程
概論
計(jì)算機(jī)的發(fā)展
計(jì)算機(jī)系統(tǒng)
計(jì)算機(jī)硬件組成
最開始計(jì)算機(jī)是沒有內(nèi)存的,程序員給條指令,計(jì)算機(jī)就執(zhí)行一個行為。
馮諾依曼提出了儲存程序
理論,程序記錄了計(jì)算機(jī)要做的一系列流程,理應(yīng)先放在儲存器(內(nèi)存)中,等計(jì)算機(jī)需要的時(shí)候按照規(guī)定順序執(zhí)行。
下圖中,注意看實(shí)線,代表數(shù)據(jù)流。
輸入設(shè)備把數(shù)據(jù)交給運(yùn)算器,運(yùn)算器和儲存器進(jìn)行交互,最后運(yùn)算器再把結(jié)果輸出給輸出設(shè)備??刂破髫?fù)責(zé)協(xié)調(diào)這4個部件,他只和儲存器有數(shù)據(jù)交換,這是因?yàn)榭刂破餍枰獜膬Υ嫫髦凶x取指令。雖然控制器負(fù)責(zé)協(xié)調(diào),實(shí)際上還是以運(yùn)算器為核心的。
現(xiàn)代計(jì)算器為了減輕運(yùn)算器的壓力,將儲存器作為中心,整體運(yùn)行沒什么變化,只不過輸入是先送到儲存器中,儲存器的數(shù)據(jù)也可以直接輸出,都不需要經(jīng)過運(yùn)算器了。
各個硬件的工作原理
這一節(jié)比較抽象,我學(xué)過5級流水線CPU了,所以就直接從宏觀層面去總結(jié)。
首先是主存:
- 儲存體負(fù)責(zé)具體儲存數(shù)據(jù)
- 儲存單元指的是一個地址對應(yīng)的空間
- 儲存元指一個可以存1bit的電子元件
- 字就是儲存單元具體的值,字長就是其bit數(shù)
- MAR。一個寄存器,儲存了地址
- 即指向儲存單元的指針
- 長度對應(yīng)內(nèi)存地址空間范圍
- MDR。一個寄存器,儲存一個字的數(shù)據(jù)
- 一般MDR長度=字長
- CPU存取數(shù)據(jù)都要經(jīng)過MDR
CPU和主存通過寄存器交換著三個數(shù)據(jù):地址,數(shù)據(jù),指令,看一下交互過程:
- 假設(shè)CPU要取數(shù)據(jù),就先設(shè)置MAR,然后發(fā)一個“取”指令給主存,然后主存把數(shù)據(jù)放到MDR里。
- 當(dāng)CPU存數(shù)據(jù)時(shí),CPU先把數(shù)據(jù)放MDR,然后設(shè)置MAR,發(fā)送一個“存”指令給主存,主存就會把MDR的數(shù)據(jù)放到目標(biāo)位置。
現(xiàn)在CPU已經(jīng)把MAR和MDR集成進(jìn)去了。
再說運(yùn)算器:
運(yùn)算器是一個計(jì)算核心ALU+三個輔助寄存器構(gòu)成:
- ALU負(fù)責(zé)計(jì)算
- ACC,默認(rèn)的操作數(shù)和結(jié)果寄存器
- X,第二個操作數(shù)的寄存器
- MQ,執(zhí)行乘除時(shí)會用到
一個完整的運(yùn)算過程如下:
- 取指:控制器C收到運(yùn)算指令
- 譯碼:取出操作符和操作數(shù)
- 執(zhí)行:ALU計(jì)算,把結(jié)果放在對應(yīng)寄存器
- 訪存:輸出到內(nèi)存(有時(shí)候不執(zhí)行)
- 寫回
有時(shí)候要多執(zhí)行一個周期,先去把內(nèi)存的數(shù)放到輔助寄存器中,再進(jìn)行一個周期的計(jì)算。
再論控制器:
控制器以CU為核心,IR和PC是兩個輔助寄存器。IR存放指令內(nèi)容,PC存放下一指令地址。
現(xiàn)在的CPU其實(shí)是把控制器和運(yùn)算器集成在了一起,同時(shí)又集成了一大堆寄存器。指令的執(zhí)行其實(shí)就是CPU和內(nèi)存在反復(fù)打交道。
下圖描述了一條指令被CPU執(zhí)行的全過程??梢钥吹?,無論是取指令,還是取數(shù)據(jù),都要進(jìn)行內(nèi)存訪問。
圖靈機(jī)的神奇之處就在于,第一條指令存在IR之中,運(yùn)行完畢后,會決定PC值是單純+1還是做其他處理,也就是說一條指令可以決定下一條指令是什么,如此就可以自動執(zhí)行,生生不息了,所以你的計(jì)算機(jī)只要開了機(jī),指令就是在一直運(yùn)行的。
計(jì)算機(jī)系統(tǒng)的層次結(jié)構(gòu)
計(jì)算機(jī)系統(tǒng)=軟件+硬件/固件,實(shí)際上,在開發(fā)設(shè)計(jì)人員眼中,軟硬件在邏輯上是等價(jià)的,乘法運(yùn)算可以用軟件去寫(基于底層硬件),也可以直接用底層硬件實(shí)現(xiàn),所以說軟硬件只不過處在不同層次罷了。
從整體的角度來看,軟硬件還可以繼續(xù)細(xì)化成若干層,形成7(或者5)層結(jié)構(gòu),自下向上為:
- 硬聯(lián)邏輯。最基礎(chǔ)的硬件,比如晶體管構(gòu)成的各種邏輯門。
- 微程序級。由基礎(chǔ)硬件構(gòu)成的功能單元。比如什么控制器,加法器,移位器等等。
- 機(jī)器語言級。用0和1來描述抽象的模塊行為。
- 操作系統(tǒng)級。建立在裸機(jī)之上,上面的人看不懂機(jī)器語言,機(jī)器也看不懂人的匯編語言,在此之間操作系統(tǒng)構(gòu)成軟硬件交流的界面。
- 匯編語言級。比如x86指令集匯編。
- 高級語言級。用來開發(fā)的編程語言。
- 應(yīng)用語言級。應(yīng)用程序。
計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)、組成、實(shí)現(xiàn)
- 系統(tǒng)結(jié)構(gòu)(體系結(jié)構(gòu)):計(jì)算機(jī)硬件有哪些部分,有哪些功能。比如CPU就是一個系統(tǒng)結(jié)構(gòu)部分,CPU可以進(jìn)行尋址,可以操作寄存器,執(zhí)行指令,這是功能。又比如有內(nèi)存,這是結(jié)構(gòu)部分,內(nèi)存空間是如何管理的,這是功能。
- 組成:是硬件實(shí)際的結(jié)構(gòu),比如CPU的結(jié)構(gòu)如何,有沒有Cache,有沒有片外Cache。
- 實(shí)現(xiàn):計(jì)算機(jī)組成其實(shí)是用各種模塊進(jìn)行組合,形成一個大型功能單位;而模塊(微程序級)的物理實(shí)現(xiàn),就是計(jì)算機(jī)實(shí)現(xiàn)部分。
程序員一般只能看到系統(tǒng)結(jié)構(gòu),再往下看不到了,也沒必要看到。既然看不到,就可以說這就是透明的。(這個透明和生活中的透明正好是反過來的)
我們之前那本CSAPP,講的其實(shí)是體系結(jié)構(gòu),而計(jì)組學(xué)的是組成,電子信息那幫人學(xué)的是實(shí)現(xiàn)。
計(jì)算機(jī)性能指標(biāo)
儲存器
- 字長=MDR長度
- 地址空間= 2 M A R 長度 2^{MAR長度} 2MAR長度
- 容量=字長×地址空間
CPU
- 主頻:內(nèi)部時(shí)鐘頻率
- 時(shí)鐘周期:主頻倒數(shù)
- CPI(cycles per instruction):一條指令消耗的平均周期數(shù)
- IPS(instructions per second):一秒執(zhí)行的指令數(shù)=主頻/CPI
- FLOPS:一秒執(zhí)行浮點(diǎn)指令數(shù)
CPU時(shí)間=通過CPU計(jì)算出來的時(shí)間=CPU消耗周期數(shù)/時(shí)鐘頻率。CPU時(shí)間僅僅是程序在CPU上消耗的時(shí)間,實(shí)際上消耗的還有其他部分,比如等待,調(diào)度啥的。
CPI即每條指令平均消耗周期,CPI=CPU時(shí)鐘周期數(shù)/指令數(shù)
CPI還可以通過加權(quán)計(jì)算,CPI=不同類指令的CPI加權(quán)和。
通過加權(quán)公式可以看出,CPI受到權(quán)重影響,而不同程序會影響指令權(quán)重,所以CPI實(shí)際上受到程序影響。
CPU真正執(zhí)行的時(shí)間=(指令數(shù)×CPI)/時(shí)鐘頻率,由此可得三個因素:
- 時(shí)鐘頻率。取決于計(jì)算機(jī)實(shí)現(xiàn)技術(shù)
- CPI。取決于計(jì)算機(jī)實(shí)現(xiàn)技術(shù)和指令集技術(shù),指令集夠不夠好,如何用越少的周期實(shí)現(xiàn)一個指令
- IC。指令數(shù)量,取決于從編程技術(shù)到計(jì)算機(jī)實(shí)現(xiàn)的一系列流程。
平時(shí)使用計(jì)算機(jī),CPU時(shí)間太過理想,綜合考慮各種因素,于是有了吞吐量這個衡量參數(shù),更加實(shí)用。
吞吐量常用MIPS(Million IPS)衡量,即每秒百萬條指令計(jì)算。為什么是百萬呢。百萬其實(shí)就是兆指令,對應(yīng)6次方的MHz單位,通過CPU時(shí)間計(jì)算方便。
整體指標(biāo)
- 數(shù)據(jù)通路帶寬。我們一般說帶寬指的是速度,但是這里指的其實(shí)是
數(shù)據(jù)總線位寬
- 吞吐量。單位時(shí)間執(zhí)行請求的數(shù)量。請求可以是指令,任務(wù)等。
- 響應(yīng)時(shí)間。
性能指標(biāo)的評判要用到基準(zhǔn)程序,其實(shí)就是我們說的跑分。但是這個東西只能參考,因?yàn)槲覀內(nèi)粘5氖褂脠鼍笆秦S富的,基準(zhǔn)程序只能測量某一個方面。
正如我們前面說的,CPU時(shí)間很復(fù)雜,受時(shí)鐘頻率,CPI,IC三者約束。
Amdahl定律與加速比
Amdahl定律用于衡量一個部分的性能對于整體性能的重要性,具體用加速比計(jì)算,加速比=改進(jìn)后性能/改進(jìn)前性能=改進(jìn)前時(shí)間/改進(jìn)后時(shí)間。原理很簡單,改進(jìn)的加速比取決于這一部分的占比(可向量化百分比)與提升空間(優(yōu)化部分可以提升到什么程度)。
數(shù)據(jù)的表示和運(yùn)算
省流:數(shù)據(jù)表示還是一如既往的煩。
數(shù)制與編碼
進(jìn)位計(jì)數(shù)制
還有一個東西叫BCD碼,可以用4bit表示0-9,如果在運(yùn)算的時(shí)候出現(xiàn)4+9=13這種情況,卡在10-15之間,此時(shí)就會進(jìn)行+6(0110)修正。
比如13是1101,超出BCD碼范圍,此時(shí)+0110,變成0001 0011,正好在BCD碼里面代表10+3=13。
整數(shù)——原/反/補(bǔ)碼
總結(jié):
- 無符號的全部都是數(shù)值位,有符號的最高位是符號位
- 無符號和有符號補(bǔ)碼的加減方法完全一致,只需要考慮結(jié)果是否溢出即可。
- 關(guān)于取反加一
- 原碼到補(bǔ)碼,是數(shù)值位取反加一(負(fù)數(shù)情況)
- 正數(shù)到負(fù)數(shù),是所有位取反加一
- 負(fù)數(shù)補(bǔ)碼到原碼,理應(yīng)末位減一,數(shù)值位取反,但是這么做比較麻煩,有一個快速方法。從右往左找到第一個1,左邊的數(shù)值位全部取反。
最后再具體的從區(qū)間上區(qū)分一下:
負(fù)數(shù)反碼的數(shù)值位是正數(shù)的按位取反,所以負(fù)數(shù)全0對應(yīng)正數(shù)全1,是邊界值。
因?yàn)檠a(bǔ)碼的負(fù)數(shù)其實(shí)只是在反碼基礎(chǔ)上+1而已,所以補(bǔ)碼的負(fù)區(qū)間可以理解為反碼的負(fù)區(qū)間-1。
反碼從0到 ? ( 2 n ? 1 ) -(2^n-1) ?(2n?1)這個區(qū)間偏移一位,變成了-1到 ? 2 n -2^n ?2n。原來反碼的兩個0是重疊的,現(xiàn)在-0變成了-1,所以補(bǔ)碼的0只有唯一表示,同時(shí)負(fù)數(shù)區(qū)間要多一個負(fù)數(shù)。
熟悉了這些區(qū)間,就可以快速的計(jì)算是否溢出。
移碼
移碼這個概念主要用于浮點(diǎn)數(shù)階碼。
移碼怎么來?本身是從補(bǔ)碼過來的,只要把補(bǔ)碼符號位取反,就可以得到真值相等的移碼。所以移碼其實(shí)是等價(jià)于補(bǔ)碼的,范圍特性也是一模一樣。
移碼的好處在于,既可以表示正負(fù),又便于比較大小,因?yàn)槠淇梢岳斫鉃椋?bit無符號整數(shù)減去128,曾經(jīng)的0-255變?yōu)楝F(xiàn)在的-128-127。
定點(diǎn)小數(shù)
我們先說定點(diǎn)小數(shù)和定點(diǎn)整數(shù)的不同,總的來說不同很少:
- 默認(rèn)小數(shù)點(diǎn)位置不同,導(dǎo)致權(quán)重不同,范圍不同(但是規(guī)律一樣)
- 定點(diǎn)小數(shù),小數(shù)點(diǎn)緊跟符號位
- 對定點(diǎn)小數(shù)的不同位進(jìn)行數(shù)列求和,可以算出其區(qū)間。變化規(guī)律一樣,補(bǔ)碼的負(fù)區(qū)間是反碼負(fù)區(qū)間減去偏移,只是整數(shù)是-1,小數(shù)是-
2
?
n
2^{-n}
2?n
- 定點(diǎn)小數(shù),小數(shù)點(diǎn)緊跟符號位
- 0擴(kuò)展方向不同,然而本質(zhì)還是一樣,遠(yuǎn)離小數(shù)點(diǎn),所以整數(shù)擴(kuò)展0要朝左,小數(shù)擴(kuò)展0要朝右。
- 定點(diǎn)小數(shù)沒有移碼表示。這是因?yàn)橐拼a是針對整數(shù)的修正補(bǔ)碼,所以不適用于小數(shù)。
以上是不同,除了不同以外,定點(diǎn)小數(shù)和定點(diǎn)整數(shù)一模一樣。無論是原反補(bǔ)碼與補(bǔ)碼負(fù)值的轉(zhuǎn)化方式,還是補(bǔ)碼的算術(shù)運(yùn)算規(guī)則,全部一樣,所以硬件上很省錢,是現(xiàn)行的解決方案。
運(yùn)算方法與運(yùn)算電路
這一章開始真正接觸到計(jì)組的核心,其實(shí)我感覺計(jì)組和數(shù)字邏輯有點(diǎn)像的,比數(shù)字邏輯更高級一點(diǎn),但是也高級不到哪去。
電路基本原理與加法器
ALU是CPU的核心,本節(jié)從ALU入手,介紹數(shù)電基礎(chǔ)知識,最后從ALU的基本部件:加法器入手,打好計(jì)組的基礎(chǔ)。
ALU
從簡化的邏輯上看,ALU有兩個輸入值,一個控制信號,一個輸出值。ALU可以實(shí)現(xiàn)算數(shù)(Arithmetic)和邏輯(Logical)運(yùn)算,還有一些輔助運(yùn)算
具體到數(shù)字邏輯上,每個值其實(shí)都是nbit,這個n從根本上決定了一臺計(jì)算機(jī)的字長。而控制信號也是若干個針腳。
除此之外,其實(shí)還有一些其他的針腳,負(fù)責(zé)與其他硬件進(jìn)行連接組合。
ALU說完了,它雖然功能復(fù)雜,但是最后其實(shí)都可以變成加法,所以繼續(xù)深挖,講一下加法器是怎么做的。
一位全加器
首先是一位全加器。所謂全加,指的是輸入有上一位的進(jìn)位,輸出有進(jìn)位。
具體實(shí)現(xiàn)如下圖,比較復(fù)雜,不用去刻意記,就是知道分成兩條線去設(shè)計(jì)即可,還有就是兩條線都要復(fù)用A ⊕ \oplus ⊕B,之后你通過那個公式就可以畫出電路圖。
最后變成一個模塊:
- 兩個輸入值,一個輸出值
- 一個輸入進(jìn)位,一個輸出進(jìn)位
多位全加器
如何實(shí)現(xiàn)多位加法呢?迭代就可以。
使用一個全加器+觸發(fā)器就可以實(shí)現(xiàn)每個時(shí)鐘周期進(jìn)行一次加法。在每個時(shí)鐘周期, C i C_i Ci?被保存在觸發(fā)器,用于下一次加法,而 S i S_i Si?被輸出保存在寄存器的對應(yīng)位上。最后還要考慮殘留的進(jìn)位,總之是比較麻煩且慢的。
并行加法器更快,用空間換時(shí)間,以空間級聯(lián)代替時(shí)間迭代。
把n位全加器級聯(lián),然后把n位的AB按位放到對應(yīng)位置,一個時(shí)鐘周期就可以計(jì)算完畢,得到n+1位的結(jié)果。
這里的并行并不是同時(shí),只是代表一個時(shí)鐘周期內(nèi)完成。
并行進(jìn)位加法器
并行全加器雖然可以在一個時(shí)鐘周期內(nèi)實(shí)現(xiàn)全加,但是本質(zhì)上仍然是一級一級的串行進(jìn)位,如果位數(shù)太多,就必須保證時(shí)鐘周期夠長才能夠走完加法過程。
能不能做到真正的并行呢?可以,此時(shí)需要數(shù)字邏輯的數(shù)學(xué)優(yōu)化了,去提前進(jìn)位,同時(shí)進(jìn)位。
看下圖。假設(shè)我們并行計(jì)算4位加法,經(jīng)過公式展開,我們可以發(fā)現(xiàn), C n C_n Cn?只需要知道 C 0 C_0 C0?以及 P n ? P 1 P_n-P_1 Pn??P1?,P不需要進(jìn)位就可以直接算出,通過增加線路提前傳輸?shù)胶竺妫虼?span id="n5n3t3z" class="katex--inline"> C 4 C_4 C4?不需要知道前面的進(jìn)位就可以算出來。
由此,真正做到了同時(shí)計(jì)算4個進(jìn)位。
其實(shí)進(jìn)位還可以這么繼續(xù)展開下去,但是這會導(dǎo)致電路極其復(fù)雜,所以可以準(zhǔn)備4位的CLA加法器,內(nèi)部同時(shí)進(jìn)位,外部級聯(lián)串行進(jìn)位,這樣就既可以加快求和速度,又不至于把成本搞太高。
加減運(yùn)算
首先要明白,無論是有符號的補(bǔ)碼還是無符號整數(shù),無論是定點(diǎn)整數(shù)還是定點(diǎn)小數(shù),其運(yùn)算邏輯都是一模一樣的,這也是補(bǔ)碼存在的意義:省錢。唯一的區(qū)別就在于溢出解釋不一樣,這個就要涉及到后面標(biāo)志位的生成了。
所以不要管下面是什么碼,反正都一樣,就直接上圖。減法是基于加法的,所以我們直接用現(xiàn)成的并行進(jìn)位加法器:
- 輸入兩個nbit數(shù),輸出一個nbit數(shù)
- 輸入一個進(jìn)位,輸出一個進(jìn)位
上半個是并行進(jìn)位加法器,下半部分是用于實(shí)現(xiàn)加減法的額外的控制電路。
Sub是控制信號,1代表要減,0代表是加,來模擬一下這個神奇的過程。
- Sub=1。
- 多路選擇器將Y按位取反的結(jié)果輸入加法器
- 進(jìn)位Cin=Sub=1。
- Sub=1實(shí)現(xiàn)了按位取反+1,之后就是加法本身了。
- Sub=0。
- 多路選擇器將Y直接輸入加法器
- 無進(jìn)位。Cin=Sub=0。
很神奇的過程,Sub名義上是控制信號,實(shí)際上是控制取反和+1這兩個過程的。
標(biāo)志位的生成
前面已經(jīng)實(shí)現(xiàn)了加減法,如何區(qū)分不同的碼呢?如何判斷運(yùn)算結(jié)果是否合法呢?這就涉及到標(biāo)志位了:
- OF和CF分別是有符號數(shù)和無符號數(shù)的溢出判斷
- SF(正負(fù))和ZF(零和非零)結(jié)合起來,可以判斷結(jié)果是正/負(fù)/零
接下來具體理解一下各個標(biāo)志位是怎么生成的:
- OF
- 這里我們僅討論加法,減法本質(zhì)還是加法。OF是對最高位和次高位的進(jìn)位進(jìn)行異或判斷,
本質(zhì)上就是對符號位是否變化進(jìn)行判斷
- 00代表兩正相加,不上溢,11代表兩負(fù)相加,不下溢,這兩個都表示符號位沒有變化。比如11情況下,雖然兩個數(shù)的符號位1+1進(jìn)位了,但是次高位又補(bǔ)上了一個1,所以符號位保持住了,沒有溢出。
- 01和10,其實(shí)都代表符號位發(fā)生了改變,這就是溢出了。
- 這里我們僅討論加法,減法本質(zhì)還是加法。OF是對最高位和次高位的進(jìn)位進(jìn)行異或判斷,
- CF
- 加法的時(shí)候,直接看進(jìn)位即可。如果進(jìn)位了,那么就發(fā)生上溢,Cout=1,和Sub=0異或后CF=1
- 減法實(shí)際上是在比較兩個數(shù)的大小,通過Cout可以間接反映出大小關(guān)系。
- 減法的時(shí)候,會有一個數(shù)按位取反+1,此時(shí)再進(jìn)行加法。無符號數(shù)按位取反后,就有一種否極泰來的感覺,原來越小的,取反以后就越大。總的來說就是,
減的時(shí)候你不溢出反而代表你缺了,發(fā)生了借位
- 如果是大-小,小的取反后會變成一個很大的數(shù),大+很大=溢出,所以此時(shí)進(jìn)位1,和Sub異或后CF=0
- 如果是小-大,大取反后會變成一個普通大數(shù),小+普通大=不溢出,此時(shí)和Sub異或后就CF=1
- 減法的時(shí)候,會有一個數(shù)按位取反+1,此時(shí)再進(jìn)行加法。無符號數(shù)按位取反后,就有一種否極泰來的感覺,原來越小的,取反以后就越大。總的來說就是,
- SF。結(jié)果的最高位就是結(jié)果的SF位,1負(fù)0正。
- ZF。結(jié)果全0,ZF=1,實(shí)際上是一個或非運(yùn)算。
移位運(yùn)算
移位運(yùn)算是計(jì)算機(jī)底層支持的一種運(yùn)算,速度很快,經(jīng)常用于和加減配合實(shí)現(xiàn)其他運(yùn)算。
- 算數(shù)移位是要實(shí)現(xiàn)乘除2的,所以符號位都不變
- 原碼的數(shù)值位是正值,所以補(bǔ)0,反碼數(shù)值位是反值,所以補(bǔ)1
- 補(bǔ)碼之所以這么特殊,是因?yàn)槠湓a的數(shù)值位按位取反+1后,會從右到左產(chǎn)生連續(xù)進(jìn)位,直到停止進(jìn)位,出現(xiàn)第一個1。比如1000 100,其實(shí)+1之前是1000 011,所以從右到左第一個1是一個分界線。
- 分界線左邊是反碼規(guī)則,右邊是原碼規(guī)則。
- 邏輯移位就是純粹的移位
- 循環(huán)移位是邏輯移位的加強(qiáng)版變體
- 不帶進(jìn)位的循環(huán)移位可以用于大小端表示轉(zhuǎn)換,nbit就移位n次。
- 帶進(jìn)位的用途廣泛
定點(diǎn)數(shù)乘法運(yùn)算(妙?。?/h4>
原碼乘法
對于十進(jìn)制乘法來說,結(jié)果實(shí)際相當(dāng)于把乘數(shù)的每一位單獨(dú)取出來,和被乘數(shù)相乘,最后加和。
二進(jìn)制比較特殊,每一位不是0就是1,0代表沒有加,1代表加上被乘數(shù)本身。邏輯簡單粗暴,非常適合電路實(shí)現(xiàn)。
- 初始化:在ALU內(nèi)部,首先把ACC置0,X置被乘數(shù)
數(shù)值位
,MQ置乘數(shù)數(shù)值位
。在乘積的過程中,ACC會逐漸變成乘積的高位,MQ會逐漸變成乘積低位。 - n次循環(huán):
- 累加。判斷MQ最低位是0還是1
- 0則ACC不變
- 1則ACC累加一個X
- 移位
- ACC和MQ整體邏輯右移一位
- ACC最高位補(bǔ)0,ACC最低位移到MQ最高位
- MQ最低位移出。這一位作為參與乘法的最低位,已經(jīng)沒有利用價(jià)值了
- 累加。判斷MQ最低位是0還是1
- 異或運(yùn)算計(jì)算符號位
無論是定點(diǎn)小數(shù),還是定點(diǎn)整數(shù),算法都是一樣的,只是最后解釋的時(shí)候,小數(shù)點(diǎn)位置不一樣罷了。
做題手算的時(shí)候,就是按照下面這個圖來走,比較清晰規(guī)范。
補(bǔ)碼乘法
補(bǔ)碼和原碼的整體流程類似,但是因?yàn)槠淙》醇右坏奶厥馍蛇^程,我們計(jì)算的過程也要有所修改。
具體講解一下細(xì)節(jié)。
首先是位數(shù)要多一位。MQ增加一位輔助位,所以實(shí)際上MQ最低位已經(jīng)變成了輔助位,現(xiàn)在的“最低位”特指輔助位前一位。
因?yàn)橐y(tǒng)一寄存器長度,所以ACC和X也要加一位,只是在最前面加了一位,構(gòu)成雙符號位,多出來的那個便于判斷補(bǔ)碼是否溢出,沒啥大用。
我們直接結(jié)合實(shí)例來看:
整體過程還是:
- 初始化,ACC賦0,MQ賦乘數(shù)
帶符號位
,輔助位=0,X被乘數(shù)(額外符號位=符號位) - n次累加移位循環(huán)
- 額外加法。這一步實(shí)際上是在生成補(bǔ)碼的符號位,代替了原碼的異或運(yùn)算。
定點(diǎn)數(shù)除法運(yùn)算
原碼除法:恢復(fù)余數(shù)法
手算除法的時(shí)候,我們是估計(jì)一個商,然后用商×除數(shù),與當(dāng)前的被除數(shù)(之前的余數(shù)×k)比大小,選出一個合適的商。
二進(jìn)制很特殊,真的是一個優(yōu)秀的進(jìn)制。
二進(jìn)制中,我們只需要比較除數(shù)和當(dāng)前被除數(shù)(之前的余數(shù)×2)誰更大即可,被除數(shù)更大就取1為商,否則就取0。
來看一下恢復(fù)余數(shù)法的具體操作,直接看手算吧,右邊有流程圖。
這里打了個啞謎: [ ? ∣ y ∣ ] 補(bǔ) [-|y|]_補(bǔ) [?∣y∣]補(bǔ)?=全部取反+1。說白了就|y|的負(fù)值唄,這么說只是因?yàn)檫@種方式是電路中實(shí)際的實(shí)現(xiàn),因?yàn)殡娐分兄挥醒a(bǔ)碼電路。而 [ ∣ y ∣ ] 補(bǔ) [|y|]_補(bǔ) [∣y∣]補(bǔ)?=|y|,其實(shí)恢復(fù)余數(shù)就是要加上|y|的,和補(bǔ)碼沒什么關(guān)系,大概也是必須要走一趟補(bǔ)碼電路,才強(qiáng)行加了一個補(bǔ)。
總的來說就是:
- 上商+左移循環(huán)n次
- 最后再上第n+1次商,最后一次上商后就已經(jīng)圓滿,不需要再左移了。
- 最后再通過異或運(yùn)算出余數(shù)的符號,覆蓋n+1位商的最高位。
具體到硬件組成細(xì)節(jié)如下:
- ACC置被除數(shù)
數(shù)值位
,X準(zhǔn)備除數(shù)數(shù)值位,MQ置0,最后會隨著左移變成商 - MQ最后一位默認(rèn)上1為商,得到余數(shù),判斷后決定是否還原。
- 正常情況下,減完以后,新余數(shù)的符號位必然等于0,正因此,邏輯左移才沒有任何副作用。
- 符號位如果是1代表有問題。重新取商為0,且恢復(fù)余數(shù)。
- 邏輯左移是整體左移,但是因?yàn)镸Q前面都是0,所以就無所謂整體不整體的
- 最后通過異或求出的符號直接覆蓋MQ最高位
最后注意小數(shù)點(diǎn)隱含位置就可以了。
加減交替法
恢復(fù)余數(shù)是一個比較麻煩的過程,可不可以跳過呢?此時(shí)再次請出數(shù)學(xué)工具。
經(jīng)過上面的演算,可以把恢復(fù)余數(shù)的一大步合并到計(jì)算下一個余數(shù)的步驟里。
具體步驟就是:
- 第1次是減,馬上得出第一個商
- 之后循環(huán)n次,左移,加/減,得商
- 最后商0(余數(shù)結(jié)果為負(fù)),需要進(jìn)行一次加法恢復(fù)余數(shù)。注意這次恢復(fù)之前不用再左移了。
最后還有一個小細(xì)節(jié)就是,在定點(diǎn)小數(shù)中,不允許大除小,因?yàn)槎c(diǎn)小數(shù)不能大于1,自然除法結(jié)果也不能超過1。
如果發(fā)生大除小,那么第一次被除數(shù)-除數(shù)結(jié)果就會是正值,這時(shí)直接中止過程報(bào)錯即可。
補(bǔ)碼加減交替法
正如補(bǔ)碼乘法之于原碼乘法,補(bǔ)碼除法也需要把符號位加入計(jì)算。
具體做法如下,和原碼加減交替流程是一樣的,商1以后就左移減,商0則移位加,差異如下:
- 判斷依據(jù)從結(jié)果正負(fù)變成了是否同號。具體原因我也不深究了,可以理解為,同號≈原碼中余數(shù)大于除數(shù)≈能上商,對應(yīng)著記。
- 求商n次,最后左移,加/減完了以后,不需要再求第n+1位商了,直接置1,省事(少一次移位加減)誤差又小。
定點(diǎn)類型轉(zhuǎn)換、儲存、對齊
C語言中,采用補(bǔ)碼儲存數(shù)字,C語言定點(diǎn)數(shù)的強(qiáng)制類型轉(zhuǎn)換有兩種規(guī)則:
- 有無符號轉(zhuǎn)換:不改變數(shù)據(jù)內(nèi)容,直接變解釋方式
- 長度變化:截?cái)嗷蛘邤U(kuò)位
- 長變短:直接截掉高位,產(chǎn)生新的符號位
- 短變長:算術(shù)右移
此外,計(jì)算機(jī)儲存二進(jìn)制的方式一般是小端法。雖然大端法更便于人看,但是機(jī)器處理小端法更加方便。
我們前面說,一個地址對應(yīng)一個儲存單元,其實(shí)這句話并不準(zhǔn)確。
現(xiàn)代計(jì)算機(jī)的字長是64,但是實(shí)際上是以字節(jié)為地址單位的,即字節(jié)尋址
。當(dāng)然,我們也支持按字,半字尋址。
那字長到底有什么意義呢?字長規(guī)定了一次讀取的寬度,也就是說,雖然我是按照字節(jié)尋址的,但是每次訪存必須讀寫一個字(64bit),不能多也不能少,因?yàn)閿?shù)據(jù)線從物理上已經(jīng)把位寬定死了。
既然讀取內(nèi)容固定了,那么為了一次讀取一定能讀完一個數(shù)據(jù),數(shù)據(jù)的存放也應(yīng)該進(jìn)行邊界對齊,一個數(shù)據(jù)的起始地址一定是其長度的整數(shù)倍。
如果不對齊,可能就像下面的半字1-1和半字1-2,讀兩次才行。
浮點(diǎn)數(shù)的表示和運(yùn)算
IEEE 754計(jì)算機(jī)浮點(diǎn)標(biāo)準(zhǔn)
之前在CSAPP筆記里寫過了,此處直接復(fù)制粘貼,懶得再寫了,已經(jīng)很詳細(xì)了。
考試無非就是考10進(jìn)制浮點(diǎn)數(shù)和754的相互轉(zhuǎn)換,注意要點(diǎn):
- 階碼:
- 規(guī)格情況下frac非全1,非全0
- 偏置和傳統(tǒng)階碼差1,偏正
- 尾數(shù):
- 前導(dǎo)1別忘了
因?yàn)殡S著小數(shù)點(diǎn)位置的不同,相同的二進(jìn)制碼會有不同的解釋,小數(shù)的表示也是百花齊放,所以IEEE就指定了IEEE 754標(biāo)準(zhǔn)。
總的來說,好的浮點(diǎn)數(shù)標(biāo)準(zhǔn),應(yīng)該有足夠的精度,且可以適應(yīng)各種舍入,溢出情況。
浮點(diǎn)表達(dá)
從形式上來說,這是一種科學(xué)計(jì)數(shù)法表示。S確定整體的正負(fù),E有8位,本身也可以表示負(fù)的指數(shù)。
從具體實(shí)現(xiàn)來看,exp和frac表示E和M。但是絕對不等同,而且根據(jù)情況不同還會有不同的解釋,具體請看IEEE 標(biāo)準(zhǔn)
精度
精度由位數(shù)決定,最常用的是32位,但是很明顯,32位的尾數(shù)只有23位,如果從10進(jìn)制轉(zhuǎn)到2進(jìn)制時(shí),數(shù)字長度太長,超過23位,就會損失精度。所以出現(xiàn)了雙精度,在exp(11)和frac(52)上都有擴(kuò)展
所以在與32位int轉(zhuǎn)換的時(shí)候,不一定完全等價(jià),且不說有效二進(jìn)制位就不夠,浮點(diǎn)exp能表示的范圍也和int不同(詳見CSAPP-datalab : floatFloat2Int函數(shù))
規(guī)格數(shù)
如果exp是非全0,以及非全1,總的來說就是正常的數(shù),就都是規(guī)格化表示。
在規(guī)格化情況下:
- 尾數(shù)部分必然是1.xxx,所以大可把1省去,用frac表示小數(shù)部分,最后+1表示M,這樣可以說是憑空增加了1位。
- 階碼是移碼表示,本身是無符號數(shù),換算成帶符號的要偏置一下。實(shí)際的階碼=E-127,實(shí)際的階碼可以取到-127-128(這一點(diǎn)和補(bǔ)碼稍微有些差距,補(bǔ)碼是-128-127)
這里給出一個從實(shí)數(shù)到單精度的計(jì)算過程,你也可以倒著算回去:
從極小規(guī)格數(shù)到非規(guī)格數(shù)再到0(特殊非規(guī)格數(shù))
當(dāng)exp全0,這時(shí)E不是-127,而是-127+1,E=-126。
浮點(diǎn)數(shù)極其趨近于0,那這個時(shí)候frac默認(rèn)補(bǔ)1就沒有意義了,此時(shí)前導(dǎo)1就變成了前導(dǎo)0,因?yàn)榇藭r(shí)我們要以最大的精度表示趨近于0的數(shù)字。
當(dāng)exp為 0000 0001,此時(shí)E=exp-127=-126,和exp為 0000 0000時(shí)一樣。這就有趣了,既然極小規(guī)格數(shù)和非規(guī)格數(shù)的E是一樣的,那這兩個又有什么區(qū)別呢?即前導(dǎo)1和前導(dǎo)0的區(qū)別。本質(zhì)上說,非規(guī)格數(shù)是把E中最后一位能表示的信息轉(zhuǎn)移到了frac位,讓frac位有了更強(qiáng)的表達(dá)能力,這就是所謂的精度提升。具體來說,我沒有去細(xì)究的想法,就此略過。
從當(dāng)非規(guī)格數(shù)(exp=0)的frac=0,此時(shí)表示0,隨S的不同而表示+0,-0
提問:exp不為0且不全1(規(guī)格數(shù))的時(shí)候frac=0,表示的是0嗎?
不是,因?yàn)閑xp=0的時(shí)候,前導(dǎo)1變成0了,但是exp不為0的時(shí)候,frac是1.xxxx,不可能表示0。所以,0一定是非規(guī)格數(shù)。
最后,非規(guī)格數(shù)與exp=1的極小規(guī)格數(shù)這個區(qū)間,是罕見的均勻分布。因?yàn)镋是固定為-126的,所以尾數(shù)部分就決定了實(shí)際的值。從極小規(guī)格數(shù)的1.1111 1111 1111 1111 1111 111到1.0000 0000 0000 0000 0000 000到最大非規(guī)格數(shù)的0.1111 1111 1111 1111 1111 111到0.0000 0000 0000 0000 0000 000,是連續(xù)的,間距穩(wěn)定的,很神奇。
特殊值總結(jié)
exp全1,當(dāng)frac全為0,則E=exp-127=128
此時(shí)指數(shù)是最大的,所以表示Inf
exp全1,但是frac不全0,比Inf都大,顯然不合理,所以就表示Nan(Not a number——不是數(shù),一般溢出以后是這個表達(dá))
exp全0,當(dāng)frac不為0,則表示E=-126,前導(dǎo)0為0,即M為0.xxxxx的極小數(shù)。
exp全0,當(dāng)frac全0,就變成了0。根據(jù)符號位為0或1,就有+0 -0之分(這里強(qiáng)調(diào),浮點(diǎn)數(shù)不是補(bǔ)碼)。從這一點(diǎn)看,浮點(diǎn)數(shù)+0和補(bǔ)碼0是一樣的,浮點(diǎn)數(shù)-0和補(bǔ)碼最小數(shù)一樣。
范圍可視化與值的表達(dá)
exp全1,frac非0,表示Nan
exp全1,frac為0,表示Inf
exp介于全1全0之間,frac任意,表示規(guī)格數(shù),在正數(shù)部分最小為frac全0,exp為1的時(shí)候,此時(shí)frac為1(僅有前導(dǎo)1),最大為exp為1111 1110的時(shí)候,frac全1的時(shí)候。
exp全0,frac任意,表示非規(guī)格數(shù),在非負(fù)數(shù)部分,最小為frac全0,代表0,最大為frac全1,前導(dǎo)為0。
從大到小,浮點(diǎn)數(shù)在數(shù)軸上順序排列,而且從極小規(guī)格數(shù)到非規(guī)格數(shù)不會發(fā)生重疊,這一個優(yōu)秀的結(jié)果是非常令人意外的。
我們用6位的IEEE格式檢驗(yàn)一下,就會發(fā)現(xiàn),整體分布是外部稀疏,內(nèi)部稠密的,逐漸變密集,而再往內(nèi)部走,間距就穩(wěn)定了,極小規(guī)格與非規(guī)格是區(qū)間連續(xù)+間距穩(wěn)定的
示例
這是一個規(guī)范化數(shù)。
exp全0,是非規(guī)范化數(shù),E=-126,frac前導(dǎo)為0
非754浮點(diǎn)加減
非IEEE格式加減與舍入
浮點(diǎn)加減是比較復(fù)雜的,尤其是浮點(diǎn)數(shù)格式規(guī)定各有不同,可能考出來的和IEEE 格式壓根不一樣,所以具體到做題,還是應(yīng)該有所改變。
比如下面這道題,浮點(diǎn)數(shù)格式和IEEE完全不同,壓根就是兩個補(bǔ)碼定點(diǎn)小數(shù)。
- 第0步首先要得到科學(xué)計(jì)數(shù)法情況下的真值,尾數(shù)要是定點(diǎn)小數(shù),階碼是定點(diǎn)整數(shù)。之后變成補(bǔ)碼格式。
- 比如X,尾數(shù)是-0.101,變成原碼是1.101,補(bǔ)碼是1.011,擴(kuò)展一下符號位就是11.011,擴(kuò)展后續(xù)位就是后面補(bǔ)0;階碼是-101,變成原碼是1101,補(bǔ)碼是1011,擴(kuò)展符號位就是11011
- 再比如Y,尾數(shù)是+0.111011,正數(shù)補(bǔ)碼還是原來的0.111011,擴(kuò)展符號位是00.111011;階碼是-100,變成原碼1100,補(bǔ)碼是1100,擴(kuò)充符號位是11100。
- 對階的時(shí)候,先求階差n。之后位移,小階的尾數(shù)右移n位,則階碼+n
- 此處規(guī)格化是針對尾數(shù)的,階碼是整數(shù),不需要規(guī)格化
幾個注意點(diǎn):
-
真值轉(zhuǎn)換時(shí),尤其要注意階碼,尾數(shù)用什么碼表示,是補(bǔ)碼,還是移碼,還是無符號數(shù)。
-
對階要求小階向大階對齊。
- 小階變大階,對應(yīng)的尾數(shù)在計(jì)算機(jī)內(nèi)部只需要算術(shù)右移即可,仍然可以滿足定點(diǎn)小數(shù)的儲存原則。
- 反之,如果大階變小階,就會出現(xiàn)大于1的數(shù),這個既不是定點(diǎn)整數(shù),也不是定點(diǎn)小數(shù),比較難處理。
- 算術(shù)右移可能丟失末位精度,但是影響很小。
-
規(guī)范化。這里的規(guī)格化不是針對IEEE的,而是補(bǔ)碼尾數(shù)的規(guī)格化
- 左歸的最終目標(biāo)是為了構(gòu)成定點(diǎn)小數(shù)0.xxxx
- 右歸是為了修正尾數(shù)符號位溢出,雙符號位不同代表溢出,此時(shí)把溢出的一位挪回來就行。
-
舍入。下面的0舍1入其實(shí)和偶數(shù)舍入一樣,如果舍入的數(shù)大于中間值(舍3位就是100),就末尾+1,小于就直接舍去,等于就要看情況讓結(jié)果是偶數(shù)。恒1就是比較粗暴的了,末尾=1。
-
階碼沒有右歸,溢出就是真溢出了,尾數(shù)上溢還可以通過右歸救回來。
補(bǔ)充一點(diǎn)偶數(shù)舍入的例子:
在這道題中,要舍入到第二位小數(shù),那就要比較剩下的小數(shù)與中間數(shù)的大小了。中間數(shù)就是100,如果大于100,就向上進(jìn)位,小于100,就直接截?cái)啵扔?00,就要讓結(jié)果為偶數(shù)。
第三個例子,是10.11,因?yàn)樽詈笠晃皇?,所以偶數(shù)舍入要進(jìn)位,最終變成11.00
第四個例子,是10.10,最后一位是0,所以偶數(shù)舍入不進(jìn)位,變成10.10,無論是11.00還是10.10,都是偶數(shù)。
754與非754對比
408考試無非就是考兩種浮點(diǎn)數(shù),默認(rèn)情況下會考你754,但是有時(shí)候題目也會給出特定的格式。
一般來說,特定的格式都是告訴你諸如下圖之類的位數(shù),格式,此時(shí)就萬萬不可套用754的思路。
具體來說,754和普通浮點(diǎn)數(shù)的區(qū)別如下:
- 前導(dǎo)1
- 754有默認(rèn)前導(dǎo)1,而且尾數(shù)部分一定是正的(前導(dǎo)1代表正常情況下尾數(shù)至少為1),相當(dāng)于去掉符號和前導(dǎo)1的原碼部分,符號位在最開頭
- 一般浮點(diǎn)數(shù)沒有前導(dǎo)1,是啥就是啥,而且符號位和尾數(shù)是連起來的
- 關(guān)于規(guī)格化
- 754不需要規(guī)格化,因?yàn)榍皩?dǎo)1已經(jīng)隱藏固定了
- 普通浮點(diǎn)數(shù)會讓你規(guī)格化,注意尾數(shù)的編碼,如果是補(bǔ)碼,那么1.0xx和0.1xx就是規(guī)格形式,而原碼就得0.1xx和1.1xx形式,左歸右歸的時(shí)候是
算數(shù)移位
- 普通浮點(diǎn)數(shù)還有一個特殊的規(guī)格化,就是雙符號位尾數(shù)
假溢出
時(shí),要進(jìn)行一次右歸,這次右歸只是把溢出到低符號位的數(shù)移到最高數(shù)字位,在符號位上補(bǔ)0/1即可,補(bǔ)的位置和算數(shù)移位不一樣
- 浮點(diǎn)數(shù)加減
- 非標(biāo)準(zhǔn)情況,就按照上一節(jié)那個例子來
- 754的加減,首先要轉(zhuǎn)化為普通浮點(diǎn)數(shù),注意前導(dǎo)1要寫出來,符號也要連上去,這才能變成普通浮點(diǎn)數(shù)的格式。最后算完以后如果要轉(zhuǎn)化為754格式,要進(jìn)行規(guī)格化,把1放在最前面,隱藏為前導(dǎo)1。
強(qiáng)制類型轉(zhuǎn)換
總結(jié):
- 范圍上
- int-float-double完美上升
- 論上升的精度
- int-float會損失——有效位可能不夠
- int-double完美——有效位足夠
- float-double完美上升,double完全碾壓(且不用擔(dān)心對階損失)
- float和double不一定完美——float對階右歸損精度
- 論下降的精度
- float/double-int會趨0截?cái)唷崛バ?shù)部分
接下來具體講一下計(jì)算機(jī)中可能面對的一切精度問題。
類型轉(zhuǎn)換要考慮范圍和精度
首先是進(jìn)制損失
,從10到2進(jìn)制,小數(shù)部分可能會損失。
比如1.2,小數(shù)部分用乘二取整法是無窮的,因此必然要截?cái)嘁徊糠中?shù),精度就損失了,相比之下,1.25這種可以完美化成2進(jìn)制的,就不會損失。
其次再說一下范圍和精度
,這兩個的本質(zhì)其實(shí)都是有效位數(shù)
。
int向float轉(zhuǎn)換,范圍是可以包含的,但是精度會丟失。
這是因?yàn)閕nt最多有31位有效數(shù)字,而float只有23+1位有效數(shù)字,所以即使范圍很大,精度實(shí)際上是可能
有所損失的。
為什么是可能呢?如果int的實(shí)際有效數(shù)字只有11位,比如1024,那么float就可以完美容納,不會損失。
int到float的精度損失也可以從另一個角度理解,大家都是32bit,理論上再怎么排列組合,能表達(dá)的數(shù)字個數(shù)的上限都是有限的,之所以浮點(diǎn)數(shù)范圍更大,就是因?yàn)橛镁葥Q取了范圍。
所有的轉(zhuǎn)換只需要看這兩個東西就可以,不需要刻意去記。
不過需要注意,long型的位數(shù)會根據(jù)機(jī)器而變化,32位機(jī)器的long是32位,而64位機(jī)器的long是64位,所以說long->int會不會損失精度,這要看是什么機(jī)器。
儲存系統(tǒng)
第二章終于結(jié)束,說實(shí)話第二章我是覺得真麻煩,補(bǔ)碼算來算去的特別煩,還是第三章好點(diǎn),有人說更難,但是我聽下來感覺也不過爾爾,還是第二章難。
儲存器概述
- cache和主存的交換是硬件完成的,而主存和輔存的交換是操作系統(tǒng)+硬件完成的
- 隨機(jī)讀?。涸L問時(shí)間不受空間影響,比如DRAM,順序讀寫:訪問數(shù)據(jù)前,需要先訪問之前的數(shù)據(jù),比如磁帶。直接存?。簷C(jī)械盤介于二者之間,移動機(jī)械臂是隨機(jī),開始讀取以后的都是順序。
主儲存器
主存的基本組成
儲存元=電容+MOS管。
電容負(fù)責(zé)儲存具體的bit,高電平就是1,低電平就是0。MOS管是一個開關(guān),如果接1,電容與外界接通,電荷就可以自行流入流出,這就是讀寫的原理。
一排儲存元連起來,mos管接一個統(tǒng)一的開關(guān)信號,這樣一次性就可以讀寫一排,這也就是字長的本質(zhì)。
當(dāng)然,這個過程是不穩(wěn)定的,所以會有一個延遲,這個延遲由電路控制。
實(shí)際上,我們會有很多排,也就是若干個儲存單元(字),這些字每列都是串在一起的,使用一個統(tǒng)一的輸出。為了防止沖突,同一時(shí)間只能有一個字進(jìn)行讀寫,為了實(shí)現(xiàn)這個,使用譯碼器進(jìn)行唯一的字選。
所以主存的工作流程就是,CPU先把地址送到MAR,然后等地址穩(wěn)定了以后觸發(fā)一個時(shí)鐘周期,等待取數(shù)據(jù)流到MDR,等待數(shù)據(jù)穩(wěn)定后再觸發(fā)一個時(shí)鐘周期進(jìn)行后續(xù)操作。
為了實(shí)現(xiàn)上述流程,還需要一個控制電路控制這個時(shí)間。控制電路有兩個功能:
- 片選:其實(shí)就是個使能信號,負(fù)責(zé)區(qū)分這塊芯片是否能工作
- 讀寫控制:兩根或者一根,負(fù)責(zé)區(qū)分讀寫操作
把這些封裝一下就是下圖,輸入n位地址,輸出m位數(shù)據(jù),然后有一個片選,1/2根讀寫控制線。其他引腳我們是忽略的。
最后說一下尋址吧。雖然我們可以按照字編址,但是現(xiàn)代計(jì)算機(jī)都是字節(jié)編制,所以假設(shè)有1kB,那么我們就給10根地址線,默認(rèn)字節(jié)尋址。
當(dāng)然你想要用字尋址也可以,左移就可以。
SRAM和DRAM
DRAM和SRAM的核心區(qū)別是儲存元不一樣:
- DRAM:柵極電容=電容+MOS×1
- SRAM:雙穩(wěn)態(tài)觸發(fā)器=MOS×6
雙穩(wěn)態(tài)比較有意思,電容是和外界進(jìn)行能量交換,所以是破壞性的,需要恢復(fù)。而雙穩(wěn)態(tài)的能量是在兩級之間交換,所以都很穩(wěn)定,是非破壞性的,就好比是用MOS管模擬出類似于電磁鐵的東西,寫入時(shí)只需要給他加個點(diǎn)平,雙穩(wěn)態(tài)觸發(fā)器就會進(jìn)行狀態(tài)轉(zhuǎn)換(當(dāng)然,斷電也還是會寄的)。
他倆的本質(zhì)區(qū)別就是,柵極電容的讀寫原理是電荷的流入流出,而雙穩(wěn)態(tài)的讀寫原理是點(diǎn)平檢測與施壓。
正因?yàn)闁艠O電容是電容儲存,所以會逐漸流失,周期大約是2ms,所以需要定期充電。即DRAM的刷新
。注意這個詞和再生
還不一樣,再生是開閘放水以后的充電,而刷新是流失了一段時(shí)間后的主動充電。
這里補(bǔ)充一下行列地址
。行列地址可以把選通線二進(jìn)制數(shù)量級減少一半,原理自己算一下就好,關(guān)鍵是這么做以后,地址空間并沒有什么變化,所以過渡很自然。
說一下這個二維布局,其實(shí)一個儲存單元里面可能有若干字節(jié),但是現(xiàn)在我們都是字節(jié)編址的,所以其實(shí)一個儲存單元里面也就是一個字節(jié),可以理解為把字節(jié)鋪開成一個矩陣了。
具體討論一下刷新策略。首先要明確,讀寫要占用一個讀寫周期
,而讀寫后的充電,同樣需要一個讀寫周期。我們以周期為單位計(jì)算,所以先計(jì)算出2ms(一個刷新周期
)里面有多少個讀寫周期。
下面是4000
- 分散刷新:讀寫與刷新就各分一半時(shí)間,2000次的刷新即使是亂序,也足夠刷新完128行儲存單元。很明顯,浪費(fèi)了一半的時(shí)鐘周期。
- 集中刷新:這樣倒是比較節(jié)省時(shí)間,但是會有一個集中的時(shí)間內(nèi)存什么都干不了,拖累CPU。
- 異步刷新:優(yōu)化了集中刷新,雖然還是128次(不浪費(fèi)資源),但是時(shí)間分散,每隔2ms/128的時(shí)間就刷新一行,這個刷新時(shí)間可以放在CPU譯碼階段,正好不影響CPU(因?yàn)樗⑿潞驮偕莾Υ嫫鲀?nèi)部的機(jī)制)。為了防止不重復(fù),我覺得最粗暴的方式就是從上到下掃描。
最后說一下DRAM特有的地址線復(fù)用技術(shù)。之所以要有這個技術(shù),是因?yàn)镈RAM太大了,比如我們現(xiàn)在的4G內(nèi)存,就要32根地址線,確實(shí)有點(diǎn)多,所以有人就想出來,我們既然已經(jīng)把行列地址分開了,不如用16根地址線,第一次送行地址,第二次送列地址。
這就是地址線復(fù)用的思路,可以減少DRAM一般的地址引腳,這個在計(jì)算中會考慮到。為什么SRAM沒有呢?因?yàn)檫@玩意集成度低又貴,所以一般頂天也就是個12M(intel i5的cache容量),折合下來也就是20來根線,沒必要復(fù)用。
最后,SRAM比較貴,效果好,一般用于Cache,DRAM便宜量大,一般用于主存。當(dāng)然,現(xiàn)在有更好的SDRAM,也就是我們現(xiàn)在的DDR技術(shù)。
ROM
RAM斷電以后會丟失,我們需要一種斷電后還能保存的芯片。RAM和ROM都可以隨機(jī)存取,區(qū)別只在于斷電以后是否丟失信息。
- MROM:Mask,廠家生產(chǎn)時(shí)寫一次
- PROM:Programable,用戶用編程器寫一次
- EPROM:Erasable,用戶可以反復(fù)擦除編寫
- UV-EPROM:紫外線擦除
- E-EPROM:電擦除
- Flash Memory:閃存其實(shí)是EEPROM的一種,只是太牛逼了,單獨(dú)列出。
- SSD:特殊控制單元+閃存芯片
主儲存器與CPU的連接
多芯片連接——一根完整的內(nèi)存條
以下是最基礎(chǔ)的單個芯片與CPU的連接。雖然主存里面是行列排列(行列地址線),但是每次取仍然也只是取出一個字。假設(shè)我們這里的一個字就是1bit,連接方式如下:
CPU地址線和主存芯片地址線連接,然后輸出的字引腳與CPU引腳相連。還有一個WE引腳,用于控制讀寫。
CS引腳、一部分地址引腳、一部分?jǐn)?shù)據(jù)引腳暫時(shí)空著,后面多芯片的時(shí)候才會用。
位擴(kuò)展:提升讀寫性能和容量
很明顯,CPU同時(shí)可以讀取8bit的,現(xiàn)在一個芯片只能給1bit,所以我們就多弄幾個芯片,8個同時(shí)讀寫,使用同一個CS信號和WE信號。
實(shí)際上,我們平時(shí)看到的儲存器芯片應(yīng)該都是8K×8這種的,我也不知道8K×8這種是本身就以1B作為儲存單元,還是用8個1bit儲存單元的芯片位擴(kuò)展得到的,又或者位擴(kuò)展本身就是1B儲存單元的實(shí)現(xiàn)原理呢?
總之,我們平時(shí)看到的儲存器芯片應(yīng)該都是8K×8這種的,假定他的輸出是可以接滿數(shù)據(jù)線的,下面會以這個為基礎(chǔ)擴(kuò)展。
字?jǐn)U展:僅提升主存容量
書接上回,現(xiàn)在有兩片芯片,但是數(shù)據(jù)線一個芯片就占滿了,我想擴(kuò)展容量,怎么才能把這兩個接到一起呢?
其實(shí)單純想擴(kuò)展容量的話,一次只讀寫一個芯片不就可以了嗎,這就是字?jǐn)U展的原理:保證同一時(shí)間只有一個芯片工作,保證數(shù)據(jù)線不會有電信號沖突
一種原理是線選法
,n根線控制n個芯片。
但凡稍微懂一點(diǎn)數(shù)字邏輯的同學(xué)都會覺得不合理,浪費(fèi)線了。事實(shí)也是如此,不僅浪費(fèi),而且地址空間還不連續(xù)。所以就有了譯碼片選法
。
一個譯碼器就可以解決片選,下圖理論上應(yīng)該接8個芯片,因?yàn)橛?個空閑地址線,圖里只接了4個??荚嚨臅r(shí)候可能會接的奇形怪狀,讓你分析,但是實(shí)際上就是按順序接滿。
字位擴(kuò)展法
假定現(xiàn)在一個芯片的輸出占不滿數(shù)據(jù)線,此時(shí)可以同時(shí)采用字位擴(kuò)展法:
- 通過位擴(kuò)展提升讀寫性能和容量,位擴(kuò)展的芯片使用同一個CS信號
- 字?jǐn)U展提升讀寫容量,字?jǐn)U展的芯片之間,同時(shí)只有一個CS信號激活
- 所有芯片公用一個WE信號
到此為止,你就擁有了一條不錯的內(nèi)存條,如果你買來內(nèi)存條,就可以看到上面有很多顆粒,這些都是芯片。
譯碼器
譯碼器還有一些細(xì)節(jié)可能會考。
首先是是否加取反信號。如果CS加了取反,那么譯碼器也要加取反信號。
74ls138:
- 3-8譯碼器,輸出加取反信號
- 三個使能,兩負(fù)一正
- 一個clock
下面給出一個工作流程:
- CPU先送地址信號,等待穩(wěn)定
- CPU送出使能信號,激發(fā)片選
- 主存給出數(shù)據(jù),穩(wěn)定后有效,讀取流程結(jié)束
主存性能提升
雙端口RAM
雙端口RAM暴露兩套完整的端口,可以同時(shí)給兩個CPU進(jìn)行讀寫。但是考慮到數(shù)據(jù)一致性問題,需要有一個復(fù)雜的邏輯,很像操作系統(tǒng)的讀著寫者問題。
為了解決這個問題,加鎖就可以,也就是下面的忙信號。具體如何,參考讀者寫者問題。
多體并行儲存器
然而第一種方式其實(shí)對速度提升沒什么用,因?yàn)镃PU的頻率本來就比內(nèi)存大很多,兩個CPU都讀一個內(nèi)存,對內(nèi)存的壓力更大,所以我覺得雙端口RAM沒太大用。
真正提升容量或者性能的,是多模塊儲存器,也就是我們說的多插幾條內(nèi)存。
有低位交叉編址和高位交叉編址兩種方法??此聘呶唤徊婢幹房梢宰尩刂房臻g連續(xù),但是實(shí)際對數(shù)據(jù)提速沒什么幫助,反而是低位交叉效果更好,這樣可以吧連續(xù)數(shù)據(jù)打亂,分散到不同的內(nèi)存條的同一行上,實(shí)現(xiàn)CPU對內(nèi)存的流水線訪問。
公式解讀:T+(n-1)r=最后一個數(shù)據(jù)的讀取時(shí)間+前n-1個數(shù)據(jù)的流水線讀取
CPU的頻率肯定是要遠(yuǎn)大于內(nèi)存的,所以內(nèi)存條數(shù)量是不需要考慮CPU的。理想情況應(yīng)該是內(nèi)存條數(shù)量=內(nèi)存讀寫周期/內(nèi)存讀寫時(shí)間(總線傳輸周期)。
做到這個以后,你的平均內(nèi)存讀寫周期就約定于內(nèi)存讀寫時(shí)間了,性能翻了m倍。其實(shí)這就是雙通道內(nèi)存的原理,雙通道其實(shí)并不是同時(shí)讀,而是交替流水線讀取,宏觀并行,微觀流水線。
現(xiàn)實(shí)生活中,主板可能會給兩對內(nèi)存插槽,我們購買兩條內(nèi)存,如果插到同色的插槽里,就是雙通道(低位交叉編址),如果插在同一側(cè)的異色插槽李,那就是高位交叉編址。高位交叉編址只能單純的擴(kuò)展空間,而低位交叉編址兩者兼顧,碾壓高位交叉編址。
不過高位交叉也不是一無是處,如果兩根內(nèi)存參數(shù)差的比較多,組雙通道很容易藍(lán)屏,這也是內(nèi)存套條的意義。如果只是兩根隨便找的內(nèi)存,高位交叉更加穩(wěn)定。
其實(shí)還有一種單體多字儲存器,雖然一次性可以同時(shí)讀取m條內(nèi)存,但是不夠靈活,因?yàn)橐淮巫x取的是同一行。
外部儲存器
機(jī)械硬盤(磁盤)
雖然這個原理不考,但是我還是要總結(jié)一下,很有意思的東西。磁盤的原理就是上面的磁性材料,磁極方向代表01。讀寫通過磁頭實(shí)現(xiàn),磁頭是一個電磁鐵,有兩個功能:
- 寫的時(shí)候,磁頭通電,電生磁,改變磁性材料的磁極,實(shí)現(xiàn)01轉(zhuǎn)換
- 讀的時(shí)候,通過電磁感應(yīng),用磁頭切割磁性材料的磁感線,產(chǎn)生感應(yīng)電流,這個電流的方向代表01。
所以機(jī)械硬盤真是一個很有趣的東西。
一個機(jī)械硬盤構(gòu)件還是挺多的:
- 磁盤驅(qū)動器。讓磁盤轉(zhuǎn)起來,支架之類的東西都是驅(qū)動器的部分。
- 磁盤控制器??刂拼疟P讀寫的芯片,向外暴露出接口,有IDE,SCSI,SATA等。機(jī)械盤主流的是SATA。
- 盤片。
需要注意的是,磁盤讀寫,內(nèi)部一定是串行的,只是對外暴露的接口是并行的,這中間有一個串并行緩存轉(zhuǎn)化電路,這就是磁盤控制器要做的工作之一。
性能指標(biāo)方面,也有一些細(xì)節(jié):
- 記錄密度:因?yàn)槊總€磁道的扇區(qū)數(shù)量恒定,所以磁道密度其實(shí)是越往里越大的,技術(shù)難度也就越高。對應(yīng)的,面密度肯定也是越往里越大
- 磁盤地址:我們以前在操作系統(tǒng)里學(xué)的是三元組,其實(shí)還有一個驅(qū)動器號,因?yàn)橐粋€電腦很可能有多個機(jī)械盤(尤其是臺式機(jī))
最后說下RAID,以前就聽說過這個東西,后面沒繼續(xù)了解,現(xiàn)在沒想到學(xué)了,很好。接下來整理多硬盤的玩法:
- 多硬盤的最基本玩法就是啥也不干,單純用來擴(kuò)容。
- RAID0類似于低位交叉編址,通過磁盤陣列軟件管理實(shí)現(xiàn)
- RAID1是鏡像,這種鏡像會浪費(fèi)一半空間,但是該有的提速功能還有,也可以交叉讀取,而且抗干擾能力更強(qiáng)。
- RAID2用了海明碼,相比于RAID1來說,冗余率更小一些,是4:3,效果相同。
我感覺,一般人用到RAID2就可以了,挺好玩的。
固態(tài)硬盤(SSD)
SSD雖然是硬盤,但是采用的技術(shù)是ROM,而且是EEPROM。
- 閃存芯片。類似于機(jī)械盤的盤面
- 閃存塊。類比機(jī)械盤磁道
- 閃存頁。類比機(jī)械盤扇區(qū)
閃存翻譯層是軟硬件之間的界面。閃存翻譯層記錄了邏輯地址到物理地址的映射,而且這個映射是可以被修改的,后面如果有數(shù)據(jù)遷移,則映射關(guān)系也要修改。
向下,閃存芯片的讀寫特性很特別,以塊為單位擦除,擦了以后每頁都有一條命,寫一次就用完了,以后只能讀。
所以要想重復(fù)寫,只能擦除一整塊,問題這就來了,你為了重寫一頁,要擦掉其他頁,不合適。所以就把其他頁先復(fù)制到另一個地方(遷移),然后再擦這一塊,重寫這一頁。正因?yàn)檫@個特性,所以SSD寫的雖然快,但是還是要比讀慢很多。
最后,動態(tài)磨損均衡比較好理解,就是寫之前看看那些塊健康度比較高,而靜態(tài)磨損均衡的原理就是有些數(shù)據(jù)不會頻繁讀寫,比如電影,有些會頻繁讀寫。具體做就是定期掃描檢測(注意不是掃描壞道,樂),把頻繁讀寫的數(shù)據(jù)放到健康的塊上。
只要磨損均衡做得好,一個盤的健康度是可以堅(jiān)持很久的(10年沒啥問題),健康度掉得快,要么是閃存芯片質(zhì)量不行,要么是磨損均衡做的不好。
高速緩沖儲存器
基本概念和原理
Cache使用SRAM,速度更快,但是容量更小。邏輯上,Cache相當(dāng)于一塊小的主存。
cache和主存的數(shù)據(jù)單元都是一樣的,交換的時(shí)候統(tǒng)稱“塊
”,只是在各自里面名稱有所不同。主存中的塊叫做“頁
”,cache中的塊叫做行
。
cache映射方式
總結(jié):
- 全相聯(lián)具備極致的
空間效率
- 優(yōu)點(diǎn):可以保證cache總是滿的,命中率高
- 缺點(diǎn):需要遍歷整個cache才能確定主存的塊號
- 直接相聯(lián)具備極致的
時(shí)間效率
- 優(yōu)點(diǎn):不需要任何遍歷,直接鎖定目標(biāo)位置
- 缺點(diǎn):cache中的塊有一定可能處于閑置狀態(tài),命中率低
- 組相聯(lián)介于兩者之間,
本質(zhì)上就是時(shí)間效率和空間效率的平衡!
- 一個分組整體上是直接相聯(lián),但是內(nèi)部是全相聯(lián)的,所以外部直接定位,內(nèi)部再進(jìn)行少量的遍歷
- 選擇合適的組數(shù)量,可以達(dá)到最好的平衡效果。
全相聯(lián)映射
先理解全相聯(lián)映射,這是最粗暴的。
主存按照塊與cache交換,所以主存地址可以分解為兩部分。全相聯(lián)的意思就是,主存塊號被完整地記錄在標(biāo)記位上(這個其實(shí)就是TLB快表)。
當(dāng)來了一個地址,訪問cache的流程如下:
- 截取主存塊號
- 然后遍歷cache,逐個對比標(biāo)記位
- 找到匹配的標(biāo)記位后查看有效位
如果hit,就好,miss則直接訪存就好??梢钥吹剑闅vcache是不是有點(diǎn)麻煩呢,這就是全相聯(lián)的缺點(diǎn)。
直接映射
再來看另一個極端,直接映射。
將主存地址分為(標(biāo)記位+行號+塊內(nèi)地址),觀察一下規(guī)律,比如主存中塊號為0-7的,標(biāo)記位是一樣的,區(qū)別只在于3位行號,而這3位行號恰好就是cache的行號。
所以只要知道主存地址,我就可以直接鎖定其在cache中的行號,不需要去遍歷。缺點(diǎn)就是空間效率低,比如我同時(shí)使用0,8,16號主存塊,理論上把這三個都放到cache就好,但是直接映射只能允許這三個中的一個在cache的第0行。
組相聯(lián)映射
組相聯(lián)映射介于兩者之間。
先使用組號直接定位組,然后在組內(nèi)遍歷匹配,最后確定有效位。
從這個角度來講,其實(shí)全相聯(lián)映射就是行號分配了0bit的組相聯(lián)映射,而直接映射就是分配了nbit行號的組相聯(lián)映射,n=log(cache行數(shù))
cache交換算法
首先要明白,如果是直接映射,那么即將調(diào)入cache的主存塊,只能被放在固定位置,所以一定會直接替換,不需要替換算法。而全相聯(lián)需要在整個cache尋找要替換的行,組相聯(lián)映射需要在組內(nèi)尋找要替換的行,所以這兩者是替換算法應(yīng)用的場景。
接下來介紹替換算法
隨機(jī)替換與FIFO(先進(jìn)先出)
隨機(jī)替換
就是在cache滿了以后,替換的時(shí)候隨機(jī)找一個cache行進(jìn)行替換,很明顯,沒有考慮到局部性原理,穩(wěn)定性很差。
FIFO也好不到哪去,先進(jìn)的就先出,同樣沒有考慮到局部性原理,畢竟最開始被調(diào)入的塊也完全有可能被頻繁訪問。FIFO容易出現(xiàn)抖動
這個東西的硬件實(shí)現(xiàn)也很簡單,只需要記錄一個指針就可以,替換后指針(指針++)%n就可以。
LRU(最近最少使用)
LRU(Least Recently Used)。其實(shí)叫這個中文名字不是很合適,容易誤導(dǎo)人,因?yàn)檫@個最少很容易理解為頻率。實(shí)際上,最少應(yīng)該指的是最近最沒有被使用過的一個塊。
做題的時(shí)候,當(dāng)需要替換的時(shí)候,就倒著數(shù)哪個塊最近沒有被用到,就把哪個替換了就行。比如5號來的時(shí)候,往前數(shù)分別是2,1,4,3,那么就替換3號。
LRU算法很優(yōu)秀,效果是最好的,充分考慮到了局部性原理,因?yàn)閏ache的目標(biāo)就是存放被頻繁訪問的塊,那頻繁訪問=計(jì)時(shí)器值小,所以LRU的效果和cache的目標(biāo)一致,這才是LRU效果好的原因。但是呢,如果主存中活躍的塊比cache大小更大,那就沒辦法了,還是會抖動。
具體到計(jì)算機(jī)實(shí)現(xiàn),是使用一個叫計(jì)數(shù)器的東西。計(jì)數(shù)器可以理解為沒有被用過的時(shí)間,也可以理解為沒有被用過的次數(shù),這兩個是一致的。沒有被用過的時(shí)間越久,就越要淘汰這個塊。
計(jì)時(shí)器的最大值=cache行最大值,只要用一樣的位數(shù),cache裝滿后計(jì)時(shí)器的值就一定不會重復(fù),每次都能找到那個最大的進(jìn)行淘汰,有趣的是,只要cache滿了,那么最大值=cache行最大值。
LFU(最不經(jīng)常使用算法)
LFU(Least Frequently Used)。
設(shè)置計(jì)數(shù)器,存放cache塊被訪問的次數(shù),cache滿了以后,就會進(jìn)行替換,把計(jì)數(shù)器最小的替換了。LFU有兩大問題:
- 計(jì)數(shù)器的大小可能會很大,比較浪費(fèi)空間
- 曾經(jīng)被經(jīng)常訪問≠未來被經(jīng)常訪問,比如程序預(yù)加載的東西,其實(shí)就剛開始頻繁用,后面不用了,但是卻要占位置很久
所以實(shí)際中LFU效果不如LRU。
cache寫策略
hit時(shí):
- 寫回法
- 優(yōu)點(diǎn):能節(jié)省訪存次數(shù)
- 缺點(diǎn):數(shù)據(jù)一致性略差,為了保證數(shù)據(jù)一致性,還需要搭配一個
臟位
使用,
- 全寫法(直寫法)
- 優(yōu)點(diǎn):數(shù)據(jù)一致性好
- 缺點(diǎn):但是速度慢(CPU要訪存) 。為了提速,指定一個
寫緩沖
,使用SRAM實(shí)現(xiàn),CPU寫到寫緩沖里的速度很快,之后就去干別的,這個時(shí)候有一個專門的控制電路會慢慢把寫緩沖的東西挪到主存里。
當(dāng)miss時(shí)
- 寫分配是回寫法的逆過程,搭配使用
- 非寫分配法,不調(diào)入,直接寫主存,搭配全寫法使用。
- 這種方法下,只有當(dāng)CPU讀不命中,才會調(diào)入cache。
這兩套方法沒有誰對誰錯,算是各有優(yōu)劣吧?,F(xiàn)在cache是多級的:
- cache內(nèi)部優(yōu)先使用全寫+非寫分配,為了保證內(nèi)部的數(shù)據(jù)一致性
- cache外部與主存之間用寫回和寫分配法,成本較低。
虛擬儲存器
文章來源:http://www.zghlxwxcb.cn/news/detail-479974.html
這一塊建議直接看我OS的筆記,我簡單概括一下就好:文章來源地址http://www.zghlxwxcb.cn/news/detail-479974.html
- 虛擬儲存的作用有兩個,一是主存分區(qū),二是保護(hù)物理地址。為此,會有頁表,甚至二級頁表的出現(xiàn)。具體轉(zhuǎn)換過程還是比較簡單的。
- 訪問頁表也是一次訪存,訪問數(shù)據(jù)還是一次訪存,這兩次訪存分別以TLB和cache作為緩存。
- 頁式管理和段式管理通常結(jié)合起來,變成虛擬段頁式管理,說白了就是把二級頁表變成了段表,使得頁表大小更加靈活,共享頁表也非常簡單。
- 之所以是虛擬,是因?yàn)檫€要和輔存進(jìn)行交換,因此需要在虛頁表里增加訪問位和有效位,臟位這些東西,說白了還是一種cache原理。
到了這里,關(guān)于計(jì)算機(jī)組成原理筆記(王道考研)(持續(xù)更新)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!