生活不可能像你想象得那么好,但也不會像你想象得那么糟。
我覺得人的脆弱和堅強都超乎自己的想象。
有時,我可能脆弱得一句話就淚流滿面;有時,也發(fā)現(xiàn)自己咬著牙走了很長的路
前言知識
機器字長:計算機一次整數(shù)運算所能處理的二進制位數(shù)
.exe文件就是用機器語言描述的程序
1.1 計算機的發(fā)展
計算機系統(tǒng)=軟件+硬件
軟件分為系統(tǒng)軟件和應用軟件
系統(tǒng)軟件:用來管理整個計算機系統(tǒng)(eg:操作系統(tǒng),數(shù)據(jù)庫管理系統(tǒng),標準程序庫,網(wǎng)絡軟件,語言處理程序,服務程序)
應用軟件:按任務需要編制成的各種程序(eg:抖音,王者榮耀,迅雷等)
硬件的發(fā)展
第一臺電子數(shù)字計算機:ENIAC(手動接線來控制計算) 1946 邏輯元件:電子管
第二代:邏輯元件:晶體管
第三代:邏輯元件:中小規(guī)模集成電路,將元件集成在基片上
第四代:邏輯元件:大規(guī)模,超大規(guī)模集成電路,開始出現(xiàn)“微處理器”,微型計算機 ,個人計算機pc 萌芽 蘋果A13制造工藝:7nm 也就是每一個邏輯元件不超過七納米的工藝水平,微處理器8080機器字長8位,微處理器8086機器字長16位
摩爾定律:揭示了信息技術進步的速度,集成電路上可容納的晶體管數(shù)目,約每隔18個月便會增加一倍,整體性能也將提升一倍
計算機硬件的基本組成:早期馮諾依曼機的結構,現(xiàn)代計算機的結構
1.2 計算機硬件的基本組成
早期馮諾依曼機
“存儲程序”的概念是指將指令以二進制代碼的形式事先輸入計算機的主存儲器,然后按其在存儲器中的首地址執(zhí)行程序的第一個指令,以后就按該程序的規(guī)定順序執(zhí)行其他指令,直到程序執(zhí)行結束,就不需要每一步都進行手工連接的操作,進而來提高速度
輸入設備:將信息轉換成機器能識別的形式
存儲器:存放數(shù)據(jù)和程序
運算器:算術運算邏輯運算
輸出設備:將結果轉換成人們熟悉的形式
控制器:指揮程序運行,控制器從存儲器中讀取一個指令的數(shù)據(jù)流,這樣他才會指揮運算器
在計算機系統(tǒng)中:軟件和硬件在邏輯上是等效的,意思也就是同一個功能可以使用軟件實現(xiàn),但是也可以使用硬件實現(xiàn),eg:對于乘法運算,可以設計一個專門的硬件電路實現(xiàn)乘法運算也可以用軟件的方式,執(zhí)行多次加法運算來實現(xiàn)
馮諾依曼計算機的特點:1:計算機由五大部件組成,2:指令和數(shù)據(jù)以同等地位存于存儲器,可按地址尋訪,3:指令和數(shù)據(jù)用二進制表示 4:指令由操作碼和地址碼組成 5 存儲程序,6 以運算器為中心,輸入/輸出設備與寄存器之間的數(shù)據(jù)傳送通過運算器完成
現(xiàn)代計算機的結構
以存儲器為中心, 輸入輸出設備直接從存儲器存取數(shù)據(jù),這樣就可以解放更多的運算器的時間,由于運算器以及控制器的關系十分緊密,所以在大規(guī)模集成電路出現(xiàn)之后,這兩個東西通常被集成于同一個芯片上,這個芯片通常也就叫cpu,cpu通過控制線控制運算器,你接下來要執(zhí)行的是什么操作,另外控制器也會控制主存儲器的一個讀寫,以及輸入輸出設備的啟動與停止,主存儲器也會與cpu進行數(shù)據(jù)的交換,第一種就是參與運算的數(shù)據(jù)會放在運算器中,指令會放在控制器中,由控制器來進行解析,并發(fā)出相應的控制信號,主存儲器和cpu統(tǒng)稱為主機,主存和輔存統(tǒng)稱為存儲器,這里要注意主存(運行內存)屬于主機,而輔存(機身存儲)屬于i/o設備
主存儲器的基本組成
主存儲器有三個部分:存儲體,MAR,MDR
主存儲器中用于存儲數(shù)據(jù)的東西叫做存儲體,存儲體是由一系列的存儲元件組成的,可以存放二進制的零或者一
MAR: 存儲地址寄存器
MDR:存儲數(shù)據(jù)寄存器
cpu會將它想讀的數(shù)據(jù)的地址寫到MAR中,主存儲器就可以根據(jù)MAR中的地址并把數(shù)據(jù)先寫到MDR中去,最后cpu就可以通過數(shù)據(jù)線路從MDR中取走數(shù)據(jù),寫也是同樣的操作 cpu會將要寫的數(shù)據(jù)的地址放在MAR中,將數(shù)據(jù)存放在MDR中,最后cpu會通過控制總線告訴主存儲器,這次要執(zhí)行的是寫操作 主存儲器可根據(jù)這三個信息便可寫入數(shù)據(jù)
存儲單元:每個存儲單元存放一串二進制代碼,存儲字:存儲單元中二進制代碼的組合,存儲字長:存儲單元中二進制代碼的位數(shù),存儲元:既存儲二進制的電子元件,每個存儲元可存1bit
運算器的基本組成
運算器:用于實現(xiàn)算術運算,邏輯運算
ACC:累加器,用于存放操作數(shù),或者運算結果
MQ;乘商寄存器,在乘,除運算時,用于存放操作數(shù)或者運算結果
x:通用 的操作數(shù)寄存器,用于存放操作數(shù)
ALU(核心單元):算術邏輯單元,通過內部復雜的電路實現(xiàn)算數(shù)運算,邏輯運算
控制器的基本組成
CU:(核心單元)控制單元,分析指令,給出控制信號
IR:指令寄存器,存放當前執(zhí)行的指令
PC:程序計數(shù)器,存放下一條指令地址,有自動加1功能
完成一條指令:取指令PC 分析指令IR 執(zhí)行指令CU
計算機系統(tǒng)的層次結構
下層是上層的基礎,上層是下層的擴展
編譯程序:將高級語言編寫的源程序全部語句一次全部翻譯成機器語言程序,而后再執(zhí)行機器語言程序(只需翻譯一次,生成.exe文件,下次直接點擊exe文件即可)
解釋程序:將源程序的一條語句翻譯成對應機器語言的語句,并立即執(zhí)行,緊接著再翻譯下一句(每一次執(zhí)行都要翻譯)
1.3 計算機的性能指標
存儲器的性能指標
MAR位數(shù)反映存儲單元的個數(shù)(最多支持多少個)
MDR位數(shù)=存儲字長=每個存儲單元的大小
總容量=存儲單元個數(shù)存儲字長(bit) 1Byte=8bit
cpu主頻(時鐘頻率):cpu內數(shù)字脈沖信號震蕩的頻率 等于時鐘周期分之一
cpi:執(zhí)行一條指令所需要的時鐘周期數(shù)(不同的指令,cpi不同,甚至相同的指令,cpi也可能有變化)
執(zhí)行一條指令的耗時=cpicpu 時鐘周期
IPS每秒執(zhí)行多少條指令,IPS=主頻/平均CPI
系統(tǒng)整體的性能指標
數(shù)據(jù)通路帶寬:數(shù)據(jù)總線一次所能并行傳送信息的位數(shù)(各硬件部件通過數(shù)據(jù)總線傳輸數(shù)據(jù))
吞吐量:指系統(tǒng)再單位時間內處理請求的數(shù)量 系統(tǒng)的吞吐量主要取決于主存的存取周期
響應時間:指用戶向計算機發(fā)送一個請求,到系統(tǒng)對該請求做出響應并獲得它所需要的結果的等待時間
基準程序是用來測量計算機處理速度的一種實用程序 也就是跑分軟件
2.1.1 進位計數(shù)制
任意進制轉化十進制
二進制轉化為八進制
三個二進制數(shù)正好可以表示八種不同的狀態(tài)
以小數(shù)點開始左右3位為一組,每組轉化為對應的八進制符號(高位整數(shù)補零,地位小數(shù)補零)
二進制轉化為十六進制
四個二進制數(shù)正好可以表示十六種不同的狀態(tài)
以小數(shù)點開始左右4位為一組,每組轉化為對應的16進制符號
八進制轉化二進制
十六進制轉化為二進制
進制的常見書寫方式
二進制以B結尾,八進制以O開頭,十六進制以H結尾或者以0x開頭,十進制以D結尾
十進制轉化為任意進制
方法一
(除基取余法整數(shù)部分):任意一個整數(shù)都可以寫成整數(shù)X(R的一次方,二次方,一直到n-1次方,所以是可以整除的)部分加上余數(shù)K0(0~R)部分 ,所以我們除以R之后得到余數(shù)K0便是R的零次方上的數(shù)值,再用得到的商再除以R得到的便是K1(先取得的余是整數(shù)的低位)
(乘基取整法小數(shù)部分):核心思想也是一樣 想辦法把K-1算出來,這里發(fā)現(xiàn)乘上一個R便可直觀的得到K-1的值 ,得到的結果再乘R得到的便是K-2的值(先取得的整是小數(shù)的高位)
方法二(拼湊法)
若是給你的十進制數(shù)不是特別大的話,可能使用這些拼拼湊湊的方法可能要快一些,假如要將十進制轉化成八進制,完全可以先轉化成二進制,然后二進制再三位一組轉化為八進制
小結回顧
2.1.2 BCD碼
BCD:用二進制編碼的十進制
8421碼
通過上述我們知道要想表示0~9這十個數(shù),必須最少需要4bit,而4bit則可以表示16個值 ,這樣也就會有6個yong余,8421碼的提出便是為了快速轉換
8421碼的相加:若是兩個數(shù)對應的8421碼相加的結果不在映射表中,也就是落到了10~15這個區(qū)間這個時候我們再加上6 這樣就一定會向高位進一個1,而低位所留下的部分又正好是我們個位所留下的部分
余3碼
也就是在8421碼的基礎上加上一個0011得到不同的映射關系,
2421碼
我們依然是使用四個二進制位來表示一個十進制位,不過這四個的權值是2421,同樣需要注意0 ~ 4第一位都是零,5 ~ 9第一位則一定是1 這也是為了避免同一個值有不同的2421碼(如5 0101或1011)
回顧
2.1.3 無符號整數(shù)的表示和運算
這里主要探討兩個問題,無符號整數(shù),在計算機硬件內,如何表示,無符號整數(shù)的加法,減法運算時怎么用硬件實現(xiàn)的
機器字長限定了每一次只能進行幾個bit運算,機器字長也限制了通用寄存器只能有多少位
無符號整數(shù)
全部二進制位都是數(shù)值位,沒有符號位,第i位的位權是 2的i-1次方,n bit無符號整數(shù)表示的范圍0~2的n次方-1 超出則溢出,意味著計算機無法一次處理這么多,可以表示的最小的數(shù)全是0,可以表示的最大的數(shù)全是1
無符號整數(shù)的減法運算
被減數(shù)不變,減數(shù)全部按位取反,末位+1 減法變加法,從最低為開始,按位相加,并往最高位進位
知識點回顧
2.1.4 帶符號整數(shù)的表示和運算(原反補)
首先我們這節(jié)主要解決的是帶符號整數(shù),在計算機硬件內,如何表示,第二帶符號整數(shù)的加法,減法運算是如何用硬件實現(xiàn)的?
同一個帶符號整數(shù)可以用不同的編碼方式表示 ,這便是原碼 補碼 反碼,形式不同但是含義相同
原碼表示法
分為符號位和數(shù)值位 符號位0正1負 其實也就是之前的表示方式,不過是使用一位來表示正負,其他的依然如之前的表示,注意這里假設的機器字長是n+1
原碼的缺點:符號位不能參與運算,需要設計復雜的硬件電路才能處理,所以聰明的科學家也就想到了用補碼來表示真值——符號位可以參與運算(正數(shù)的補碼可以解釋為位權,負數(shù)的補碼不能解釋為位權)
方法 一
正數(shù)的原碼,反碼,補碼都是不變的
負數(shù)的原碼到反碼是符號位不變,數(shù)值位取反,然后末位+1得到補碼
若是讓你根據(jù)補碼來求反碼,你可以先求原碼再求反碼(這里使用的方式是第二種,從右往左找到第一個1 這個1左邊的所有數(shù)值位按位取反便可得到原碼)
方法二
從右往左找到第一個1,這個1左邊的所有“數(shù)值位”按位取反(按照之前我們計算機計算的方法,把所有的數(shù)值位按位取反,末位加一個一,若是反碼最后一個是一,并且這個一前面也是一,就會導致不斷的向前進位,直到前面那個是零才會停止,也就導致從右往左第一個1的右邊的值與原碼是一致的,所以這也就是為什么我們從右往左找到第一個1,這個1左邊的所有數(shù)值按位取反便可得到補碼)
方法一是計算機處理的方式,我們若是手算的話 推薦第二種
帶符號整數(shù)加法運算
從低位開始,按位相加(符號位參與運算),并往更高位 進位
帶符號整數(shù)減法運算
A-B=A+(-B),也就是將減數(shù)取負值,所以也就有了全部位取反
方法一:首先是全部位按位取反,然后末位加一,與上面負數(shù)求補碼有所不同(符號位不變,數(shù)值位取反)
方法二:與之前類似,從右往左找到第一個1,此1左邊的全部取反(之前負數(shù)求補碼是數(shù)值位取反,這里是全部),右邊的不變便可得到原碼或者補碼
這也就能和之前的無符號的減法相聯(lián)系,減數(shù) 全部取反,末位加1,相聯(lián)系
知識點回顧
2.1.5原反補碼的特性對比
注意加紅的即可,如若是-64-64 結果保存在原碼中則會溢出,若是保存于補碼中則不會溢出
1個字節(jié)能表現(xiàn)的最小的負數(shù)是-128(補碼),隨手用“負數(shù)源碼的補碼等于源碼絕對值取反加1”這個公式驗算了一下,發(fā)現(xiàn)這個公式在 -128這個數(shù)上居然不管用,由于源碼的取值范圍是-127~ (-0),(0)~+127,所以這個公式就無法使用了,簡單的說,單字節(jié)有符號數(shù)源碼的 定義域不包括+/-128,故這個公式遇到-128的時候就失去了作用,只能換一個方法計算-128的補碼了,即用最大的負數(shù)-1取不斷的減1,一直減到下溢,那么下溢前的最后一個數(shù)就是最小的負數(shù)了,即-128(10000000B)
2.1.6 移碼
補碼的基礎上將符號位取反
存儲的值是一個環(huán),從0000 0000開始,到0111 1111為最大正數(shù)值,再加1為1000 0000為最小負數(shù)值
2.1.7 定點小數(shù)
反碼,補碼和上面是一樣的 這里看一下區(qū)別
定點小數(shù)是低位補零,定點整數(shù)是高位補零,同時注意這里補零的個數(shù)
另外一個需要注意的地方就是取值范圍以及最小的數(shù),還有真值零的表示
2.2.0 奇偶校驗碼(大綱已刪)
在有效信息位的首部或者尾部加上一位奇偶校驗位
奇校驗碼:整個校驗碼(有效信息位和校驗位) 中“1”的個數(shù)為奇數(shù)個
偶校驗碼:整個校驗碼(有效信息位和校驗位)中“1”的個數(shù)為偶數(shù)
其實也就是數(shù)給定的編碼中1的個數(shù), 若是奇校驗碼,其中有效信息碼中1的個數(shù)為奇數(shù)個,則校驗位添加0 若是有效信息碼中1的個數(shù)為偶數(shù)個,則校驗位添加1,
偶校驗的硬件實現(xiàn),各信息進行異或(模2加)運算,得到的結果即為偶校驗位,然后進行偶校驗(所有位進行異或,若結果為1,說明出錯,但是若是同時有兩個bit發(fā)生錯誤,則進行偶校驗也是不能發(fā)現(xiàn)錯誤的)
2.2.1 電路的基本原理 加法器設計
這里主要講三個部分,算數(shù)邏輯單元的作用,大致原理,電路基礎知識,加法器的實現(xiàn),與類似C語言&& 表達式Y=A*B “或”類似“||” 表示式Y=A+B,但是要注意優(yōu)先級“與”是大于“或”的,同時滿足分配律以及結合律如A(C+D)=AC+AD ,再如ABC=A(BC),異或相同是零,相異是一 同或 相同是一,相異是零,與異或正好相反
一位全加器兩個本位和一個來自低位的進位可以確定本位的和并且也能確定應該向高位進一個什么樣的值,
串行加法器
只有一個全加器,數(shù)據(jù)逐位串行送入加法器中進行運算,進行觸發(fā)器用來寄存進位信號,以便參與下一次運算,如果操作數(shù)長n位,加法就要分n此進行,每次產(chǎn)生一位和,并且串行逐位地送回寄存器,所以這張串行加法器的效率較低
并行加法器
把n個全加器串聯(lián)起來,就可以進行兩個n位數(shù)的相加,串行又稱為行波進位,每一級進行直接依賴于前一級的進位,既進行信號是逐級形成的,所以這種加法器的快慢卻決于每一位進位的速度
本節(jié)總覽
2.2.2 并行進位加法器
上述的時候我們講過 速度很大程度上取決于進位的速度,這里我們可以發(fā)現(xiàn)進位的表達式又可以用更低一位的進位表達,這里也就是數(shù)學中的遞推法 最終我們發(fā)現(xiàn)每一級是可以使用C0表示的,也就意味著我們可以直接算出每一個全加器的值,也就意味著每一個進位幾乎都是同時產(chǎn)生的,但是這樣也有一個缺點就是會導致設計的電路越來越復雜,所以通常是有四個全加器和一些運算邏輯組成
2.2.3 補碼加減運算器
也就是從硬件的角度來看補碼的加減運算是如何實現(xiàn)的,如下圖,若是我們進行的是X+Y 則此時Sub也就是0 此時控制多路選擇器 Y的值直接通過,若是X-Y 此時Sub也就是1,此時控制多路選擇器打開1這個開關,而Y也要進行非操作,此時再加上sub 中的這個一,也就實現(xiàn)了減法變加法(全部位取反,末位值加一)
如下 計算機的底層邏輯在處理加法或者減法的時候是,無論是有符號數(shù)還是無符號數(shù)都是通過同一個電路來處理的,但是最后我們判斷是否溢出的時候,有符號數(shù)的判斷邏輯和無符號數(shù)的判斷邏輯是存在顯著的區(qū)別的
2.2.4 標志位的生成
兩個nbit的數(shù)相加,除了生成一個nbit的值外 同時也會生成四個標志位如下
2.2.5 定點數(shù)的移位運算
移位:通過改變各個數(shù)碼位和小數(shù)點的相對位置,從而改變數(shù)碼位的位權,可用移位運算實現(xiàn)乘法和除法,原碼的算數(shù)移位——符號位保持不變,僅對數(shù)值位進行移動,右移:高位補0,低位舍棄,若舍棄的位=0,則相當于/2 若舍棄的位!=0 則會丟失精度,其實這些也是可以理解的,原碼到反碼的過程中有一個是全部取反,自然左邊高位是補一,而反碼又要加一,自然作用到補碼上低位也就是補零
循環(huán)移位
不帶進位位:用移出的位補上空缺,帶進位位,移出的位放到進位位,原進位位補上空缺
總結# 2.2.6
2.2.6.1 原碼的乘法運算
這節(jié)主要講三個問題,乘法運算的實現(xiàn)思想,原碼的一位乘法,補碼的一位乘法
乘法運算的實現(xiàn)思想將乘數(shù)拆成多個數(shù)相加,再用被乘數(shù)分別與這些乘數(shù)進行相乘再相加,但是這里考慮到機器實現(xiàn)有三個問題,1,實際數(shù)字有正負,符號位如何處理?,2,乘積的位數(shù)擴大一倍,如何處理?,3,4個位積都要保存下來最后統(tǒng)一相加?
問題一:符號位單獨處理,符號位=A異或B
問題二:先加法再移位 重復n次,當前位=1,則ACC加上被乘數(shù),當前位=0,則ACC加上0,每次乘完之后 在進行移位,然后乘積高位往右移動,繼續(xù)看乘數(shù)的乘低位,為1則與乘積高位相加,結果放在乘積高位中,在移動,再繼續(xù)看乘積低位
問題三:你會發(fā)現(xiàn)這里的結果不是每一個算出來 然后相加 而是一位算出來就放在ACC與MQ中了
這里使用的是雙符號位,但是使用單符號位也不會出錯,至于這里為什么使用雙符號位,可能是因為補碼的乘法一定要使用雙符號位,這里可能是與補碼保持統(tǒng)一
2.2.6.2 補碼的乘法運算
和原碼的移位加法相似,但是還需要多來一次加法,最后的這一次加法會讓乘數(shù)的符號位也參與運算,只有加法沒有移位,如下圖MQ紅色部分既是這里所說的輔助位,所有寄存器的長度一般都是統(tǒng)一的,所以這里的補碼采用的是雙符號位的形式,
如對下圖的解析,第一步的時候,輔助位-MQ中的最低位為-1,這個時候加上乘數(shù)的補碼 然后ACC和MQ統(tǒng)一右移,符號位不動,數(shù)值位右移,正數(shù)右移補0 負數(shù)右移補1(符號位是啥就補啥),Y5是這里的輔助位,Y4是這里MQ中的最低位
知識點回顧
2.2.7.1
原碼的除法運算
如下圖ACC中保留的是被除數(shù) MQ中保留的是商 通用寄存器中保留的是除數(shù),本來我們的想法是比較ACC與通用寄存器中的值來確定商的值,但是計算機很傻,會先默認商一,若是檢查到ACC中的符號位是1(負)此時也就會修改商上面的值讓其為0 并且讓ACC恢復原樣,然后減去除數(shù),ACC與MQ整體左移低位補零,然后依然是默認商1,若是最后一步商余數(shù)為負,也需要回復余數(shù)并商零
恢復余數(shù)法(手算)
根據(jù)所得余數(shù)的符號位的正負來確定商應該是0或者1
不恢復余數(shù)法(手算)
2.2.7.2 補碼的除法運算
2.2.7.2 補碼的除法運算
2.2.8 c語言的類型轉換
C語言中定點整數(shù)是用“補碼”存儲的
所以進行強制轉化的時候
無符號數(shù)和有符號數(shù):不改變數(shù)據(jù)內容,改變解釋方式
長整數(shù)變短整數(shù):高位截斷,保留低位
短整數(shù)變長整數(shù):符號擴展
2.2.9 數(shù)據(jù)的存儲和排列
大小端模式
小段讀取的方式更有利于機器的處理:計算機首先從計算機讀入的最低有效字節(jié) 這樣CUP在處理加法的時候,這樣從低有效字節(jié)讀入是有利于處理的
邊界對齊
這個東西通常是結構體定義的時候,比如下圖我們定義了三個char型變量 三個short型變量,還有一個short型變量,若是按照邊界不對齊的方式,我們讀取第一個short變量的時候需要兩次訪問并進行拼接,而上邊界對齊則一次訪問便可,且不需要拼接,一種空間換取時間的策略
2.3.1 浮點數(shù)的表示
浮點數(shù)的作用和基本原理
定點數(shù)可表示的數(shù)字范圍有限,但我們不能無限制地增加數(shù)據(jù)的長度
將一個數(shù)值用階碼和尾數(shù)來表示,這樣表示的數(shù)值的范圍就大大增加了,
浮點數(shù)規(guī)格化
尾數(shù)的最高位是無效位會喪失精度,規(guī)定尾數(shù)的最高數(shù)值位必須是一個有效值
左規(guī):當浮點數(shù)運算的結果為非規(guī)格化時要進行規(guī)格化處理,講尾數(shù)算數(shù)左移一位,階碼減一
右規(guī):當浮點數(shù)運算的結果尾數(shù)出現(xiàn)溢出,(雙符號位為01或10,雙符號位中的更高位表示我們當前數(shù)值的正負性)時,將尾數(shù)算數(shù)右移一位,新空出的位置與與雙符號位保持一致,這里也就是零,最后階碼加一
采用雙符號位,當溢出發(fā)生時候,可以挽救,更高的符號位是正確的符號位
浮點數(shù)的表示范圍
這里要注意用補碼表示的負數(shù)的尾數(shù),我們?yōu)榱擞嬎銠C處理起來方便,也就是當符號位為0的時候 數(shù)值位為1 當符號位為1的時候數(shù)值位為0,如下圖右下的例題,你發(fā)現(xiàn)1.1110100并不滿足符號位與最高位是相反的 所以需要移位,我們知道負數(shù)的補碼是補1的,并且規(guī)格化是需最高位為0的,所以也就需要算數(shù)左移三位,此時階碼值就要減3
知識點回顧
2.3.2 IEEE754
移碼
我們上面說過階碼可以使用移碼或者補碼來,尾數(shù)也可以使用原碼或者補碼來表示,所以也就需要某些標準,
補碼的基礎上將符號位取反就能得到移碼,注意移碼只能用于表示整數(shù)
移碼的定義:移碼=真值+偏置值,此處8位移碼的偏置值=128d=1000 0000B 偏置值一般取128D 此時移碼=補碼符號位取反,IEEEE754取的偏置值127時,此時對于真值-128=1000 0000B 移碼=-1000 0000 +0111 1111=1111 1111(這里的計算時是發(fā)現(xiàn)被減數(shù)比減數(shù)要小,由于我們移碼只有8bit,所以背后的這些加減運算都會進行mod128,我們可以在原有的基礎上加上128,然后再減 此時得到的移碼便是1111 1111)
IEEE754
這個表格需要記住,并且在計算時,可以將這個移碼看成一個無符號數(shù),然后用之前的計算方式 比如下圖double中的藍色部分的,可以看成無符號數(shù)128(移碼)-1023(偏移量)
這里可以將其轉化成對應的十進制相加減,比如1111111(127)-1結果也就是126 用八位表示,并且要將其看成是無符號數(shù),所以表達的方式就是0111 1110,尾數(shù)部分的個數(shù)是需要進行拼湊的,一共湊成32位即可
數(shù)值范圍
之前我們說過-128(全1) -127(全0)有其他用處 所以這里階碼的最小值時-126,所以范圍如下
雖然在偏置值為127 時,移碼全0 事實上的對應的-127次方,但是這里下圖我們會把它固定的視為-126次方,此時是正無窮還是負無窮是看其中的數(shù)符位
2.2.3 浮點數(shù)的運算
本節(jié)主要講的是浮點數(shù)的加減法運算,以及強制類型轉換
小階向大階靠齊是為了計算機內部硬件的實現(xiàn)方便
它的兩個符號位是否相同 相同則沒有越界,如這里的11 就沒有越界
如下面這題我們還有第零步,需要轉化成真值的形式,然后這里首先將 -101 轉換成補碼的形式,也就是1011(取反加一)然后這里題目要求階符取兩位,所以這里需要雙符號位,也就是11011 ,接下來來看尾數(shù)-0.101,他所對應的原碼是1.101 他的補碼是1.011,同樣的需要兩個符號位,所以這里也就是11.011 然后根據(jù)題目所說尾數(shù)取9位,進行擴展即可,將階碼以及尾數(shù)部分拼接起來便可得到x
這里對階求階差,本來是減法,但是計算機中只有加法,所以將后面改成負數(shù)的補碼 也就是全部位取反,在加一便可,然后再將得到的結果轉化成原碼,兩個符號位不變,其余位取反加一便可這里也就是-1,下一步尾數(shù)相減 同樣的道理也是減數(shù)取負數(shù)的補碼形式,這里發(fā)現(xiàn)雙符號位發(fā)生了變化也就是尾數(shù)發(fā)生了溢出,這里就需要尾數(shù)右移 然后階碼加一,此時就完成了規(guī)格化,判溢出的方法是階碼加一,判斷兩個階符是否相同,相同則沒有溢出
舍入問題
除了右規(guī)的時候會面臨舍入的問題,有的計算機可能會浮點數(shù)的尾數(shù)部分單獨拆出來計算24bit->32bit 算完結果在經(jīng)過舍入32bit->24bit再拼回浮點數(shù),發(fā)生下溢我們直接將將其當成
機器數(shù)零便可,若是發(fā)生上溢則需要中斷處理,上溢出是我們必須要處理的錯誤
本節(jié)回顧
3.1 存儲系統(tǒng)基本概念
存儲器的層次結構
手機里面的輔存,也不是用磁盤來進行存儲的,手機里面存儲的軟件什么的就是存儲在輔存中的,但是cpu不能直接和輔存進行交互,當我們啟動一個app,需要先將數(shù)據(jù)從輔存拿到主存中,這個時間是較長的,我們增加一個高速緩沖存儲器是因為盡管我們的讀寫速度已經(jīng)很快了,但是還是沒有cpu 處理的速度快,所以計算機把那些有可能頻繁訪問的數(shù)據(jù)放在cache中,這樣讀取的速度也就更快
存儲器的分類
存儲不僅可以按照層次來進行分類
存儲器也可以按照存儲介質來進行分類以半導體器件存儲信息,以磁性材料存儲信息,以光介質存儲信息,
還可以按照存取方式來進行分類,隨機存取寄存器(RAM):讀寫任何一個存儲單元所需時間都相同,與存儲單元所在的物理位置無關,順序存取寄存器(SAM)讀寫一個存儲單元所需時間取決于存儲單元的物理位置,直接存取存儲器(DAM)既有隨機存取特性,也有順序存取特性,先直接選取信息所在區(qū)域,然后按順序方式存?。ù蓬^臂要前后移動,移動到要讀寫的那個區(qū)域,中間的馬達帶動磁盤進行轉),后面這兩種又稱為串行訪問存儲器,讀寫某個存儲單元所需要時間與存儲單元的物理位置有關,這三種是根據(jù)地址來讀寫,還有一種是相聯(lián)存儲器:也可以按內容訪問的存儲器,可以按照內容檢索到存儲位置進行讀寫,“快表”就是一種相聯(lián)存儲器
按照信息的可保存性進行分類:斷電后,存儲信息消失的存儲器,易失性存儲器(主存,Cache,如手機關機后再開機很緩慢,這是因為本來信息丟失,重新將操作系統(tǒng)調入主存也是需要時間的,),斷電后,存儲信息依然保持的存儲器——非易失性存儲器(磁盤,光盤)
存儲器的性能指標
1,存儲容量:存儲字數(shù)*存儲字長(之前有提到過MDR位數(shù)反映存儲字長,MAR又反映了存儲字數(shù)是多少)
2,單位成本:每位價格=從成本/總容量
3,存儲速度:數(shù)據(jù)傳輸率=數(shù)據(jù)的寬度/存儲周期(數(shù)據(jù)的寬度即存儲字長,存儲周期,每個存儲周期我們可以都或者寫一個存儲字這么多的數(shù)據(jù))
知識回顧
主存——輔存:實現(xiàn)虛擬存儲系統(tǒng),解決了主存容量不夠的問題
Cache——主存:解決了主存于cpu速度不匹配的問題
3.2.1 主存儲器的基本組成
本節(jié)主要講三個部分:半導體元件的原理,存儲芯片的基本原理,如何實現(xiàn)不同的尋址方式,這里我們先學習半導體元器件存儲0和1的原理,然后我們可以構成所謂的存儲芯片,又因為存儲芯片中存儲了很多字的信息,所以存儲芯片必須提供尋址的功能,最后我們來探討不同的尋址方式如何實現(xiàn)
基本的半導體元件及原理
比如這里的MOS管,可以將MOS管理解為用電來控制的開關,若是木有施加電壓,或者施加的電壓不足5V,那么這個MOS管就是絕緣體,就是不導電的,只有當上面接通的時候,這個電容才能存儲電荷,所以我們可以根據(jù)電容中是否含有電荷信息來確定表示零或者1,當我們要在電容中寫入的時候不僅要接通MOS管上面的的那個線路,而且還要接通MOS管下面的線路,這樣就可以寫入電容,如下圖本來電容中已經(jīng)存儲了電荷,當我們施加一個五伏的電壓在這個紅色的線上的時候,接通了MOS管,此時這些0,或者1 就是順著這條綠色的線導出,這樣的一整行就是我們提到的存儲單元,也就是一個存儲字,所以一個存儲子多少個bit具體要看存儲體的具體結構是怎么樣的,而多個存儲單元也就構成了一個存儲體,我們一次可以讀出的就是一個存儲字,就像下圖的,這里的存儲體只包含了兩個存儲單元
接下來我們要研究的就是如何根據(jù)地址來讀或者要寫那個存儲字,這就涉及到譯碼器的使用,我們給出n位地址,就會對應2的n次方個存儲單元,會根據(jù)地址將其轉化成某一條字選線的高電平 然后根據(jù)這條綠色的線也就是數(shù)據(jù)線(位線),將其傳送到MDR中,然后數(shù)據(jù)總線會從MDR中取走所有的數(shù)據(jù),數(shù)據(jù)總線的寬度應該與存儲字長是相同的總容量=存儲單元個數(shù)*存儲字長
比如CPU通過地址總線將地址送到MAR中,但是由于是使用電信號的方式,電信號可能不太穩(wěn)定,只有當MAR穩(wěn)定之后,控制電路才會打開譯碼器的開關,同樣的只有輸出的信號穩(wěn)定之后,控制電路才會認為此時的輸出的正確無誤的,另外存儲芯片還需要向外提供一些線路 通常是片選線(作用是讀指定芯片),通常是CS上一個扛 或者CE上一個杠,當表示它是低電平的時候是有效的
有的題目若是讓你計算存儲芯片引腳線路的個數(shù),也就是計算地址線,數(shù)據(jù)線,片選線(有多個芯片,作用是選擇哪一個芯片)讀寫線(可能是一個也可以是有兩個)
尋址
現(xiàn)代計算機通常按字節(jié)編址(每個字節(jié))即每個字節(jié)對應一個地址,按字節(jié)尋址,按字尋址,按半字尋址,按雙字尋址,如下 若是總容量是1kB,這樣的一整行表示的是一個存儲字,每一個存儲字是4B,所以也就有256個存儲字,現(xiàn)代計算機通常是按照字節(jié)進行編址,也就是每一個字節(jié)對應一個地址,有1K個字節(jié),自然也就有1k個地址,這樣自然也就有10個地址線,也就是從十個全0 到十個全1這個范圍,我們只需要將字地址算數(shù)左移兩位,就可以將字地址轉換成字節(jié)地址,比如我們要讀的是1號字,我們算數(shù)左移兩位,就是末位填兩個0也就是4 也就得到這個字它起始字節(jié)的地址, ,也就是雖然通常是按照字節(jié)進行尋址的,但是卻也有按照字尋址,按半字尋址
本節(jié)回顧
3.2.2 SRAM DRAM
DRAM用于主存,SRAM用于Cache,所以本節(jié)我們首先來根據(jù)存儲元件的不同來介紹為什么會出現(xiàn)不同的差異,還有就是DRAM的刷新,DRAM的地址線復用技術
存儲元的不同
上面說過DRAM這種存儲元所使用的柵極電容存儲0或1的方式,但是當電容放電信息被破壞,是破壞性讀出,讀出后應有重寫操作,也稱“再生”,所以這種讀出更慢,因為要重生,而且這個只需要一個MOS管,每個存儲元制造成本更低,因此常被用來制造主存,集成度低,功耗高,并且電容里面的電荷也會逐漸流失,因此我們只有不斷的刷新,并且由于集成度低,這里對應的行列地址的位數(shù)也比較少,所以我們同時把行列地址送過去便可
雙穩(wěn)態(tài)觸發(fā)器,我們規(guī)定A高電平B低電平是為1,A低B高是為0,這里我們可以根據(jù)左邊或者右邊那一條輸出了一個低電平信號,就可以判斷是0或者1,而這種雙穩(wěn)態(tài)則是非破壞性的讀出,無需重寫,這種讀出快一點,所以常被用來制造高速緩存,這個需要6個MOS管,因此體積更大,每個存儲元制造成本更高,集成度低,多個元器件聯(lián)合使用使用功耗大,而DRAM(也就是柵極電容的)則需要分兩次送(地址線復用技術,往下看有解釋)
DRAM的刷新
當需要的存儲單元的個數(shù)過多的時候,對應的選通線也將會過多,將一維的排列變成二維的排列,原來的n位地址會被拆分成行地址和列地址,地址的前半部分會被看成行地址,后半部分是列地址,
本節(jié)回顧
就如之前所講,需要有n位地址線來同時傳送行或列,但是使用地址線復用技術,也就是只用n/2個地址線,先傳行地址送入到行地址緩沖器,然后再傳列地址到列地址緩沖器中,可以讓地址線更少,芯片引腳也就更少,但是對于SRAM因為存儲元較大,自然集成度低,自然對應的地址線的數(shù)目也會少,同時送便可
3.2.3 只讀存儲器ROM
RAM芯片–易失性,斷電后數(shù)據(jù)消失
ROM芯片–非易失性。斷電后數(shù)據(jù)不會丟失
許多的固態(tài)硬盤的存儲單元是閃存,因為有多個存儲單元,所以也需要控制單元
本節(jié)回顧
3.3.1 主存儲器與CPU的連接
這小節(jié)我們主要講單塊存儲芯片與CPU的連接,多塊存儲芯片與CPU的連接,分別是位擴展法,字擴展法,以及字位擴展法,本節(jié)的最后寫了關于譯碼知識的補充,我們現(xiàn)在計算機的64位指的是數(shù)據(jù)總線的長度是64位,也就是使用位擴展法
之前我們所說MAR,MDR寄存器都是存放于存儲芯片中的,但是現(xiàn)代計算機通常都是將MAR與MDR存放于CPU內部,存儲芯片中一個普通的寄存器用于暫存輸入輸出數(shù)據(jù)
位擴展
其中每一塊存儲芯片中前面的8K需要13根地址總線,后面的1 也就需要一個數(shù)據(jù)總線,所以cpu的數(shù)據(jù)總線并沒有被充分的利用,這里將不同存儲芯片的地址總線連接到一起,這樣13位的地址信息可以選擇到多塊芯片相同的存儲單元,存儲字長擴展到了8bit,這里的CS可以一直接通,是沒有關系的。
字擴展
如下圖這個存儲芯片的存儲字長已經(jīng)是8位了,芯片所能處理的寬度與cpu所能處理的寬度是能完美匹配的,但是我們發(fā)現(xiàn)cpu的尋址能力是有2的16 次方嗎,而我們只是用了13 位,若是想充分利用,若是和上面一樣存儲芯片的地址總線連接在一起,CS同時工作,則兩個存儲單元的8bit的信息都會順著數(shù)據(jù)總線傳向CPU ,同時傳就會導致一個數(shù)據(jù)總線的一個沖突,這里的一個方案是假如CPU有n條多余的地址線,讓多余的連接每一個芯片的片選線CS,也就只能有n個片選信號,同時也能發(fā)現(xiàn)地址是01的時候選擇的都是左邊的這個芯片,01的時候選擇的都是右邊的這個芯片。但是你也會發(fā)現(xiàn)這樣是不連續(xù)的地址空間。
加入一個非門,也可以看作是一個1-2 譯碼器,這樣地址信息便是連續(xù)的,這種m-n譯碼器就像左邊010表示的是真值2,則右邊的第三個片選線被接通
這里每一個芯片的A0到A12都是直接與cpu相連的,這里畫一起是不想太亂,并且地址也是相連的
當然考試的時候可能給你一點陷阱就是中間A14沒有連接,正常連接本來有8k個合法地址對應第一個存儲芯片,若是中間A14沒有連接,則每一個芯片對應的就是有16K個合法的地址
強調
位擴展可以使得存儲器的字長變得更長,從而發(fā)揮數(shù)據(jù)總線的數(shù)據(jù)傳輸能力,字擴展可以增加存儲器的存儲字數(shù),可以更好的利用CPU的尋址能力
字位同時擴展
如下每一個芯片的存儲單元是4位的,也就是需要四根數(shù)據(jù)總線便可,所以可以進行位擴展,比如1號可以連接地址線的低四位,2號可以連接地址線的高四位,然后再進行字擴展即可,每一個芯片的字數(shù)是16k也就需要14根地址線,所以還剩余兩個地址線未使用,上面使用的是2-4 譯碼器這也就導致使用的主存空間是連續(xù)的
補充譯碼器
注意這里帶圓圈表示的是取反
本節(jié)回顧
3.3.2 雙端口RAM和多模塊存儲器
之前說過DRAM是電容存取,并且會自動放電,所以每次存取都是需要恢復時間,并且現(xiàn)在手機都是多核的 當多個cpu訪問的時候,怎么處理
雙端口RAM
兩個cpu就可以通過它的兩個端口來訪問RAM,這樣就需要主板有兩組完全獨立的數(shù)據(jù)線,地址線,控制線,CPU,RAM 中也要有更復雜的控制電路,當兩個端口進行的操作是非法的時候,應該置忙的信號
多體并行存儲器
即使是單核的cpu訪問內存的速度較快,每一次讀寫之后都需要恢復時間,一個解決的方式是使用多體并行存儲器,CPU對內存進行訪問的時候一定是需要提供地址,高位交叉編址指的是地址的高位用來判斷使用的是哪一個存儲體,后面的低位表示的是體內地址,可以將其理解位四根內存條 體號表示的是選擇的是M0 M1 還是什么,然后來看高位交叉編址的地址是豎著編號的,而低位交叉編址是橫著編的
宏觀上讀寫一個字的時間接近R,若是我們連續(xù)的訪問一系列內存,至于為什么討論的是連續(xù)的空間,是因為許多的應用都是連續(xù)的存放于主存當中,若是高位交叉編址方式每個存取時間是r,后面的3r時間等存儲體恢復,才能進行下一個存取,讀取五個連續(xù)的存儲空間5T,若是使用地位交叉編址,過了r之后對M0的存取就已經(jīng)結束了 后面的3r cpu不需要管他,讓他自己恢復便可,當M3 讀取完之后M0已近恢復了,M0又可以被讀取了,讀取5 個連續(xù) 的存儲空間則需要2T個存取周期,
應取幾個“體”
當m<T/r的時候CPU需要多余的r的時間繼續(xù)進行等待M0刷新完成,若是m>T/r,M0這個存儲體會有一段時間是閑置的,各個存儲體沒有辦法發(fā)揮到它們的極限,所以模塊數(shù)=T/R的時候流水線的效率達到頂峰,同時存儲體的數(shù)量最少,也就是成本最低,每個模塊都有相同的容量和存取速度,各模塊都有獨立的讀寫控制電路,地址寄存器和數(shù)據(jù)寄存器,它們既能并行的工作,又能交叉工作,可以有選擇的讀取某個模塊的某個字
多模塊存儲器
單體多字存儲器相當于是存儲體的合并,本來我們只能讀取一個字,但是通過這樣的擴展,我們每一次可以讀取多個字,這也就需要對總線寬度進行擴展,同時若是我們讀取的是2345 這幾個存儲單元,若是使用的是下面的單體多字存儲器,則需要分兩次讀取,并且每一次讀取會有yong余,若是用上面的多體并行存儲器則可以根據(jù)地址精準命中
當m=T/r的時候,兩者的效率幾乎差不多
本節(jié)回顧
實際用處
給自己的電腦插了兩個內存條之后,給這兩個內存條采用的是低位交叉編址的方案,這樣幾乎可以使得內存的吞吐量幾乎翻倍,如果你買的是兩個主頻不一樣的內存條 ,主頻高的將進行降頻處理,將會有所浪費,選擇的如果不是相同容量的,低地址部分組成雙通道的形式,高地址依然是單通道的形式,這樣電腦的性能就不穩(wěn)定,所以應該插入顏色相同的卡槽
3.4.1 磁盤存儲器
我們在磁性盤面上涂磁性材料的方式是一圈一圈的涂的,也就是磁道,這里綠色的圈就是磁道,為了方便主機對磁盤數(shù)據(jù)的讀寫,我們將磁道劃分成一個個更小的扇區(qū),每個磁盤有多個盤面 ,每個盤面也對應一個讀寫磁頭,比如這里就是有四個盤面 ,相對位置上的磁道我們將其稱為一個柱面,也就意味著一個磁盤上有多少個磁道就有多少個柱面,
盡管內側較短,但是存儲的位信息是一樣的,這樣就意味著越靠經(jīng)內測的,它的位密度越大,越靠近外側的它的位密度會越小,所以許多的工廠是受到這里規(guī)則的限制,旋轉延遲時間也就是磁頭定位到所在扇區(qū)所需要的時間,這里通常是轉半圈所需要的一個時間,因為在任何扇區(qū)的概率是相同的,
無校驗功能也就是當某些扇區(qū)上的數(shù)據(jù)發(fā)生損壞的時候,我們就不能恢復數(shù)據(jù),鏡像磁盤陣列也就是設置一個同樣的磁盤陣列,用于防止數(shù)據(jù)的丟失,但是也就意味著空間利用率只有一半 , 四位信息位對應的三位的海明校驗碼,就有糾正一位錯 ,發(fā)現(xiàn)兩位錯的能力,這里的技術也就會用于比如百度云這樣的公司
本節(jié)回顧
3.4.2 固態(tài)硬盤SSD
這些黑色的小芯片就是用于存儲數(shù)據(jù)的,是基于閃存技術,每個閃存芯片是由多個閃存塊組成,而每一個塊又可以拆成一個個的頁,若是數(shù)據(jù)存儲與固態(tài)硬盤中,則系統(tǒng)要讀或者寫的邏輯塊,也就對應這里的頁,當我們要寫入數(shù)據(jù)的時候,但是因為是以頁為單位的,并且需要擦除,若是其中已有數(shù)據(jù),這里我們就會先將數(shù)據(jù)進行遷移之后在進行寫入,但是發(fā)生了數(shù)據(jù)遷移,這樣也就需要閃存翻譯層進行重新的映射,這也就導致了固態(tài)硬盤讀的速度遠遠高于寫的速度
3.5.1 Cache的基本概念和原理
局部性原理
由于循環(huán)結構的存在,其中的數(shù)據(jù)比如說i,也是可能在時間上循環(huán)的存取,由于局部性原理,這也就意味著,當程序是按照列優(yōu)先進行訪問的時候,由于空間局部性較差,也就意味著所需要的時間更長
性能分析
知識回顧
3.5.2 Cache和主存的映射方式
之前我們說過Cache保存的是主存中某些數(shù)據(jù)的副本,映射方式探討的就是這個主體,這節(jié)將會介紹三種方式,如下圖,但是全相連映射也有一個問題,就是這里我們的標記使用的也是0,1 的bit,這也就也為著這個標記可能需要的bit也很大,并且開始的時候初始化都是0,這也可能不對,因為我們可能解析為主存上0的位置的信息,所以這里我們還需要另外一個有效位,主存地址的前nbit,對比Cache中所有的塊的標記,若標記匹配且有效位=1 則Cache命中,訪問塊內地址為某某的單元,若是未命中或者有效位=0,則正常訪問主存
全相聯(lián)映射
直接映射
如下圖 前面的19位可以作為Cache的一個行標記,后面的三位可以反映每一個主存標記可以放在哪一個Cache行
組相聯(lián)映射
每個主存塊的后兩位反映了分組的組號是多少,這也就意味著后兩位相同的主存塊號一定是在一個組內的,這也就意味著我們標記位只需要20位即可
知識回顧
3.5.3 Cache替換算法
Cache很小,主存很大,如果Cache滿了怎么辦?
替換算法
這也就是本小節(jié)要處理的問題,若是直接映射,則不需要考慮替換算法,因為若是對應的位置非空,則毫無選擇的直接替換即可,所以替換算法只會被用到全相聯(lián)和組相聯(lián)映射,這節(jié)我們主要學習四種替換算法,隨機算法,先進先出算法,近期最少使用,最近不經(jīng)常使用
隨機算法
先進先出
這里沒有考慮到局部性原理,如我們寫C語言中,若是第一步就使用了print 后面也可能會用到print,抖動現(xiàn)象:頻繁的換入換出現(xiàn)象(剛被提替的塊很快又被調入)
近期最少使用算法
做題的時候,我們可以從當前訪問的一個主存塊號,往前看,看哪一個是最近被訪問過的,沒有出現(xiàn)的就是要被替代的主存號,這里比起高的沒有加一,是因為即使不加1,它依然是最大的數(shù),加一毫無意義,所以我們只有四個計數(shù)器的時候,我們最大值應為3,不會達到4,Cache塊的總數(shù)是2的n次方,則計數(shù)器只需n位,且Cache裝滿后所有的計數(shù)器的值一定不重復,命中時,所命中的行的計數(shù)器清零,比其低的計數(shù)器加1,其余不變,未命中且還有空閑行時,新裝入的行的計數(shù)器置0,其余非空閑全加一,未命中且無空閑行時,計數(shù)值最大的行的信息塊被淘汰,新裝行的塊的計數(shù)器置0,其余全加1
不經(jīng)常使用算法
經(jīng)常被訪問的主存塊在未來不一定會用到,(如微信視頻聊天相關的塊) 并沒有很好的遵循局部性原理,因此實際運行效果不如最近最少使用算法
知識回顧
3.5.4 Cache寫策略
CPU修改了Cache中的數(shù)據(jù)副本,如何確保主存中數(shù)據(jù)母本的一致性?
Chche寫策略
這節(jié)寫策略分為寫命中(全寫法,寫回法),以及寫不命中(寫分配法,非寫分配法),
寫命中
我們可以根據(jù)臟位來確定數(shù)據(jù)是否修改過,根據(jù)標記位來確定需要寫回到什么位置
全寫法
當CPU對Cache寫命中時,必須把數(shù)據(jù)同時寫入Cache和主存,一般使用寫緩存,訪存次數(shù)增加,速度變慢,但是能保證數(shù)據(jù)的一致性,這里由于SRAM實現(xiàn)的寫緩沖,所以cpu與寫緩沖的交互式比與主存的交互要快的,并且有專門的控制電路控制下逐一寫回
寫不命中
多級Cache
知識回顧
3.6.1 頁式存儲
這個分頁 更多的上是邏輯上的劃分,而主存和Cache更多的是物理層面上的一個劃分
我們作為程序員只能是給出一個邏輯地址,而操作系統(tǒng)則可以根據(jù)這個邏輯地址去找相應的物理地址,下圖是首先根據(jù)邏輯地址前兩位找到相對應的操作系統(tǒng)被劃分的0號頁面,然后我們可以看出0號頁面被劃分到二號主存塊中,然后根據(jù)主存塊號,以及頁內地址的拼接 轉化成實際的物理地址,這個步驟中最重要的就是建立一個邏輯頁號到主存塊號之間的關系,操作系統(tǒng)會建立一個頁表,cpu執(zhí)行的機器指令中,使用的是“邏輯地址” 因此需要通過“頁表”將邏輯地址轉為物理地址,頁表的作用:記錄了每個邏輯頁面存放在哪個主存塊中,cpu中還會有一個重要的頁表基址寄存器,這個寄存器指明了頁表在主存中的存放地址,然后我們又知道每一個頁表項的大小是固定的,這樣我們就知道了每一個頁表項所在的位置
快表的引入
類似于主存設置一個Cache,這里我們可以將頁表中經(jīng)常使用的頁表項單獨存放于一張塊表中,可以加快地址的變換的速度,快表的作用是加快邏輯地址到物理地址的轉化,而Cache則是加快對數(shù)據(jù)的訪問
知識回顧文章來源:http://www.zghlxwxcb.cn/news/detail-420812.html
3.6.2 虛擬存儲器
段式虛擬存儲器
這里由于虛擬地址也是按照段號和段內地址來分的,但是由于段長不一樣,這里我們需要將段表加上段長,我們的主存不會再進行分塊或者分頁,所以我們需要記錄一下每一段的首地址
段頁式虛擬存儲器文章來源地址http://www.zghlxwxcb.cn/news/detail-420812.html
到了這里,關于計算機組成原理匯總的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!