最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

深入理解計(jì)算機(jī)系統(tǒng)-CAEer視角(上)

2022-04-12 15:23 作者:電磁CAEer  | 我要投稿

說在前面

寫作目的

僅僅依賴于CAE商用軟件的仿真計(jì)算以及設(shè)計(jì)師的手動(dòng)調(diào)參或者相對(duì)低層次掃參功能,越來越難以支撐起卓越的硬件設(shè)計(jì)。學(xué)習(xí)和掌握最前沿的設(shè)計(jì)理念、優(yōu)化策略,依靠扎實(shí)的數(shù)理基礎(chǔ)將問題轉(zhuǎn)化為數(shù)理模型,并依托堅(jiān)實(shí)的編程素養(yǎng)將定性的設(shè)計(jì)理念數(shù)字化、程序化,為硬件的設(shè)計(jì)過程注入靈魂,會(huì)給卓越的硬件設(shè)計(jì)帶來更多可能。該公眾號(hào)也正是基于這一理念進(jìn)行展開的。

作為計(jì)算機(jī)門外漢的作者,學(xué)習(xí)計(jì)算機(jī)系統(tǒng)的過程大致是這樣的:學(xué)習(xí)始于2021年11月初的B站《計(jì)算機(jī)科學(xué)速成課》、《從0到1設(shè)計(jì)一臺(tái)計(jì)算機(jī)》科普視頻的系統(tǒng)學(xué)習(xí),結(jié)合日本計(jì)算機(jī)科普作家矢澤久雄的兩本科普讀物《計(jì)算機(jī)是怎么跑起來的》、《程序是怎么跑起來》,完成了計(jì)算機(jī)硬件系統(tǒng)的入門。

https://player.bilibili.com/player.html?bvid=BV1EW411u7th

https://player.bilibili.com/player.html?bvid=BV1wi4y157D3

隨后,依托B站考研視頻《計(jì)算機(jī)組成原理》的系統(tǒng)學(xué)習(xí),結(jié)合高分計(jì)算機(jī)經(jīng)典黑皮書《深入理解計(jì)算機(jī)系統(tǒng)》(作者Randal E. Bryant)深入學(xué)習(xí),完成了計(jì)算機(jī)硬件系統(tǒng)的深入學(xué)習(xí),在此基礎(chǔ)上進(jìn)行消化-吸收-輸出,最終完成計(jì)算機(jī)系統(tǒng)知識(shí)體系的初步搭建。

https://player.bilibili.com/player.html?bvid=BV1BE411D7ii

理論體系建立完畢后,通過對(duì)筆記本主板的拆解和再認(rèn)識(shí),完成了對(duì)知識(shí)體系的初步實(shí)踐。文中所涉學(xué)術(shù)經(jīng)典和專業(yè)論文的電子版可以通過文末的“閱讀原文”,自行下載,提取碼:。


這篇文章將兼顧體系和細(xì)節(jié),兼顧科普與專業(yè),兼顧理論與實(shí)踐,系統(tǒng)而通俗的介紹關(guān)于計(jì)算機(jī)硬件系統(tǒng)的種種,希望能夠助力電磁CAE設(shè)計(jì)師入門。受限于作者專業(yè)和認(rèn)知水平,文中所述如有偏頗,還請(qǐng)斧正。

內(nèi)容涉及

本文將從三個(gè)方面展開:

1.底層認(rèn)知:計(jì)算機(jī)系統(tǒng)大致是這樣組成的,底層為計(jì)算機(jī)硬件(計(jì)算機(jī)組成原理),其上為操作系統(tǒng),在上面就是各種軟件應(yīng)用(算法與數(shù)據(jù)結(jié)構(gòu)),這樣就構(gòu)成了一臺(tái)功能完整的計(jì)算機(jī),而計(jì)算機(jī)之間的連接則通過計(jì)算機(jī)網(wǎng)絡(luò)實(shí)現(xiàn)。本文作為縮水版的“計(jì)算機(jī)系統(tǒng)”,將著重介紹上層以高級(jí)語言編寫的“代碼”在運(yùn)行的過程中,計(jì)算機(jī)的底層“軟/硬件”的實(shí)現(xiàn)過程。

2.深入理解:完成了計(jì)算機(jī)組成原理的底層認(rèn)知的闡述后,想要更加深入了解的同學(xué),就需要將計(jì)算機(jī)組件的封裝打開,更加具體的探索構(gòu)成計(jì)算機(jī)系統(tǒng)的各子系統(tǒng)的結(jié)構(gòu)組成、功能以及實(shí)現(xiàn)機(jī)理。這部分內(nèi)容始終圍繞“硬”“軟”兩個(gè)方面進(jìn)行闡述,“硬”的部分將深入計(jì)算機(jī)內(nèi)部,詳細(xì)介紹計(jì)算機(jī)的硬件系統(tǒng)架構(gòu)以及其中各硬件分系統(tǒng)(存儲(chǔ)系統(tǒng)、中央處理系統(tǒng)、總線系統(tǒng)以及I/O系統(tǒng))的結(jié)構(gòu)組成和運(yùn)行機(jī)理;“軟”的部分則要詳細(xì)介紹以“0/1”二進(jìn)制為基礎(chǔ)的信息表示和處理方法、控制計(jì)算機(jī)硬件協(xié)調(diào)工作的“指令系統(tǒng)”構(gòu)造方式以及運(yùn)行機(jī)理以及各硬件分系統(tǒng)內(nèi)部維持其有序工作的“規(guī)則”“策略”

如果將計(jì)算機(jī)系統(tǒng)比作為一家公司的話,那么“硬”的部分就類似于由基本要素“人”(類似晶體管)構(gòu)成的各職能部門(類似硬件分系統(tǒng))以及將這些職能部門框起來的“組織架構(gòu)”;“軟”的部分則類似于建構(gòu)于“核心理念”之上的各種“規(guī)章制度”。硬和軟共同保障了公司的有序經(jīng)營。


3.認(rèn)識(shí)主板:理論體系與現(xiàn)實(shí)之間必然存在著巨大鴻溝,鴻溝只能通過不斷的實(shí)踐和時(shí)間的積累取填平,通過筆記本主板的拆解,通過對(duì)主板上各計(jì)算機(jī)子系統(tǒng)(中央處理系統(tǒng)、圖像處理系統(tǒng)、存儲(chǔ)系統(tǒng)、總線、I/O系統(tǒng)、供電系統(tǒng))的識(shí)別和分析,完善對(duì)計(jì)算機(jī)體系的理解。

底層認(rèn)知

什么是計(jì)算機(jī)系統(tǒng)

計(jì)算機(jī)是迄今為止最為復(fù)雜的一個(gè)系統(tǒng)之一,其作用在于按照確定的順序完成認(rèn)類預(yù)設(shè)好的指令,而這些預(yù)設(shè)好的指令就是我們所熟知的程序。

所謂復(fù)雜系統(tǒng),一方面因?yàn)槠錁?gòu)成元素的晶體管數(shù)量十分巨大,一顆指甲蓋大小的CPU核心就包含數(shù)以億級(jí)的晶體管,另一方面在于其功能十分強(qiáng)大,簡(jiǎn)單的堆數(shù)量并不能成就強(qiáng)大的系統(tǒng),計(jì)算機(jī)系統(tǒng)的強(qiáng)大源于其將海量的晶體管進(jìn)行互連、按照嚴(yán)密的組織規(guī)則讓其分工、協(xié)作,從而實(shí)現(xiàn)了遠(yuǎn)超個(gè)體能力的復(fù)雜功能。這與細(xì)胞-器官-智慧生命的實(shí)現(xiàn)邏輯一致。計(jì)算機(jī)系統(tǒng)正是關(guān)注這個(gè)復(fù)雜系統(tǒng)的搭建過程以及工作機(jī)理:1)硬件層面,晶體管-計(jì)算機(jī)組件-功能完善的計(jì)算機(jī);2)軟件層面,0/1二進(jìn)制-信息的表示與處理-指令系統(tǒng)。

計(jì)算機(jī)的基本組成

現(xiàn)在我們自頂而下開始簡(jiǎn)單認(rèn)識(shí)一下計(jì)算機(jī)硬件系統(tǒng)的具體組成。計(jì)算機(jī)硬件系統(tǒng)的基本組成包括兩個(gè)部分:1)主機(jī)(計(jì)算機(jī)核心部分);2)I/O設(shè)備(鍵盤、鼠標(biāo)、顯示器、光驅(qū)等)。其中主機(jī)由CPU和主存組成,CPU則主要包括運(yùn)算器(執(zhí)行邏輯、算術(shù)運(yùn)算)和控制器(指揮程序的運(yùn)行),主存用以存放程序和數(shù)據(jù)。

打開任意筆記本的銷售頁面,配置參數(shù)表都介紹了該計(jì)算機(jī)的主要性能參數(shù),其中最主要的參數(shù)為:1)CPU型號(hào);2)內(nèi)存(即主存)容量;3)硬盤容量(即輔存容量)。

CPU的主要功能就是執(zhí)行指令,結(jié)構(gòu)組成包括運(yùn)算器和控制器,各組件的功能為:

  • 運(yùn)算器:就像是搬磚的,主要工作就是埋頭執(zhí)行各種算數(shù)運(yùn)算和邏輯運(yùn)算,主要組成有:1)算術(shù)邏輯單元:用以執(zhí)行各種算術(shù)和邏輯運(yùn)算;2)通用寄存器,用以存放待運(yùn)算的操作數(shù);3)累加器,用以存放操作數(shù)和運(yùn)算結(jié)果;4)乘商寄存器,用以輔助乘商計(jì)算。

  • 控制器:就像是工頭,主要工作就是指揮運(yùn)算器執(zhí)行各種指令,主要組成有:1)控制單元:分析指令,給出控制信號(hào);2)指令寄存器:用以存放待執(zhí)行指令;3)程序計(jì)數(shù)器:用以存放下一條指令的地址。

? ?

主存儲(chǔ)器就是一個(gè)臨時(shí)貨柜,用以存放待運(yùn)行程序翻譯而成的各種指令(數(shù)據(jù)),組成包括三個(gè)部分:1)存儲(chǔ)體,其如同貨柜一樣存放著海量的程序或數(shù)據(jù);2)MAR,地址寄存器,臨時(shí)存放待取程序或數(shù)據(jù)的地址(如同取件碼);3)MDR,數(shù)據(jù)寄存器,臨時(shí)存放待取程序或數(shù)據(jù)(就如同待取包裹)。

計(jì)算機(jī)的組織形式

復(fù)雜、龐大的系統(tǒng)想要運(yùn)行有序,就必須要一套科學(xué)合理的組織架構(gòu)保駕護(hù)航,就如同大公司的組織架構(gòu),計(jì)算機(jī)各部組件相互之間分工協(xié)作需要通過計(jì)算機(jī)硬件架構(gòu)來進(jìn)行保障。計(jì)算機(jī)硬件的組織形式主要分為兩種:1)馮 諾伊曼結(jié)構(gòu);2)現(xiàn)代計(jì)算機(jī)結(jié)構(gòu)。

  • 馮 諾伊曼結(jié)構(gòu)

計(jì)算機(jī)科學(xué)家馮諾依曼確立了現(xiàn)代計(jì)算的基本組成以及組織架構(gòu),即“馮諾依曼結(jié)構(gòu)”,結(jié)構(gòu)組成包括運(yùn)算器、控制器、存儲(chǔ)器、輸入設(shè)備以及輸出設(shè)備五大部分,組織結(jié)構(gòu)如下圖所示,結(jié)構(gòu)特點(diǎn)是以CPU為中心的組織形式,所有數(shù)據(jù)流動(dòng)、程序運(yùn)行以及結(jié)果輸出均由CPU執(zhí)行和居中協(xié)調(diào)。

如果將計(jì)算機(jī)比作一個(gè)公司的話(出處),五大部件大抵可以做如下類比,運(yùn)算器就如同生產(chǎn)部門,存儲(chǔ)器就如同倉儲(chǔ)部門,所有的采購原材料以及加工好產(chǎn)品的產(chǎn)品都需要經(jīng)過生產(chǎn)部門,再送達(dá)倉儲(chǔ)部門等相關(guān)部門,這顯然讓生產(chǎn)部門做了很多職責(zé)范圍外的活,降低了生產(chǎn)效率。因此現(xiàn)代計(jì)算機(jī)結(jié)構(gòu)對(duì)五大部件的組織形式進(jìn)行了優(yōu)化,那便是“現(xiàn)代計(jì)算機(jī)結(jié)構(gòu)”。

  • 現(xiàn)代計(jì)算機(jī)結(jié)構(gòu)

現(xiàn)代計(jì)算機(jī)結(jié)構(gòu)以存儲(chǔ)器為核心,所有輸入的數(shù)據(jù)/程序以及輸出的計(jì)算結(jié)果,均先存入存儲(chǔ)器,然后在被送往CPU進(jìn)行執(zhí)行或送至輸出設(shè)備?,F(xiàn)代計(jì)算機(jī)結(jié)構(gòu)有效的為CPU減負(fù),讓CPU更加專注的進(jìn)行指令執(zhí)行,大幅提高了效率。

計(jì)算機(jī)的運(yùn)行過程

以上,我們就基本完成了一個(gè)計(jì)算機(jī)硬件系統(tǒng)的搭建,那么這個(gè)系統(tǒng)是如何工作的,各部組件之間又是如何分工協(xié)作,確保預(yù)先設(shè)置的指令暢通無阻的運(yùn)行的。

過程大致是這樣的:當(dāng)你打開手機(jī)上的某個(gè)APP時(shí),后臺(tái)其實(shí)是用高級(jí)語言編寫的代碼在運(yùn)行,這些代碼經(jīng)過一個(gè)叫編譯器的東西翻譯成計(jì)算機(jī)硬件認(rèn)識(shí)的機(jī)器語言(一行行二進(jìn)制代碼),然后經(jīng)由I/O裝入主存的存儲(chǔ)體中。

當(dāng)以機(jī)器語言表示的指令和數(shù)據(jù)裝入主存后,CPU就開始訪問主存提取指令并開始進(jìn)行執(zhí)行,具體過程如下所示:

step1:程序計(jì)數(shù)器PC指向當(dāng)前指令地址#01,并將地址送至主存的地址寄存器MAR

step2:存儲(chǔ)體根據(jù)MAR的取件碼,將對(duì)應(yīng)位置的數(shù)據(jù)發(fā)給數(shù)據(jù)寄存器MDR;

step3:MDR將指令發(fā)給控制器的指令寄存器IR,進(jìn)行指令分析;

step4:IR將指令的操作碼發(fā)給控制單元CU,將地址碼發(fā)MAR,CU依據(jù)操作碼通知運(yùn)算器要進(jìn)行何種操作;

step5:存儲(chǔ)體根據(jù)MAR的取件碼,將#04地址對(duì)應(yīng)的數(shù)據(jù)經(jīng)由MDR傳給運(yùn)算器的ACC進(jìn)行運(yùn)算。

如此這般,就大致了解了計(jì)算機(jī)的各硬件是如何協(xié)作,完成程序的順利運(yùn)行的。

深入理解

信息的表示與處理

二進(jìn)制是信息科學(xué)的基礎(chǔ),就如同晶體管是計(jì)算機(jī)硬件系統(tǒng)的基礎(chǔ)?,F(xiàn)代計(jì)算機(jī)存儲(chǔ)和處理以二值信號(hào)表示的信息。這些普通的二進(jìn)制數(shù)字,或者位(bit),形成了數(shù)字革命的基礎(chǔ)。

我們熟悉的數(shù)學(xué)理論是建立在關(guān)于十進(jìn)制的信息表示和處理的理論基礎(chǔ)之上的,但是十進(jìn)制的每一個(gè)位狀態(tài)包含10種(0~9),狀態(tài)過多,不利于工程實(shí)現(xiàn),然而二進(jìn)制的一個(gè)位狀態(tài)只包含兩種(0,1),存儲(chǔ)和處理信息的機(jī)器時(shí),二進(jìn)制值工作得更好。二值信號(hào)能夠很容易地表示、存儲(chǔ)和傳輸,例如,可以表示為穿孔卡片上有洞或無洞、導(dǎo)線上的高電壓或低電壓,或者磁場(chǎng)引起的順時(shí)針或逆時(shí)針。

本章主要分為三部分內(nèi)容:1)信息存儲(chǔ),主要介紹關(guān)于二進(jìn)制理論基礎(chǔ)的一些基本概念;2)整數(shù)的表示與計(jì)算,介紹利用無符號(hào)數(shù)和二進(jìn)制補(bǔ)碼對(duì)整數(shù)進(jìn)那個(gè)表示和運(yùn)算的理論基礎(chǔ);3)浮點(diǎn)數(shù)的表示與運(yùn)算,介紹利用二進(jìn)制版本的科學(xué)記數(shù)法表示實(shí)數(shù)的方法及其相關(guān)運(yùn)算性質(zhì)。

信息存儲(chǔ)

進(jìn)位計(jì)數(shù)制

我們生活的現(xiàn)實(shí)世界是建立在十進(jìn)制基礎(chǔ)之上的,而計(jì)算機(jī)硬件卻只能讀懂0/1二進(jìn)制語言,兩個(gè)世界要建立緊密的聯(lián)系就離不開各種進(jìn)制之間的轉(zhuǎn)換。最常見的就是十進(jìn)制、二進(jìn)制、8進(jìn)制以及16進(jìn)制之間的相互轉(zhuǎn)化。其中十進(jìn)制、8進(jìn)制以16進(jìn)制與二進(jìn)制之間相互轉(zhuǎn)化方式如下,十進(jìn)制、8進(jìn)制以及16進(jìn)制三者之間的相互轉(zhuǎn)化可以通過二進(jìn)制中轉(zhuǎn)實(shí)現(xiàn)。

大多數(shù)計(jì)算機(jī)使用8位的塊,或者叫做字節(jié),來作為最小的可尋址的存儲(chǔ)單位,而不是對(duì)存儲(chǔ)器中的每一個(gè)位(bit)進(jìn)行訪問,存儲(chǔ)器的存儲(chǔ)體可以被視為一個(gè)非常大的字節(jié)數(shù)組,稱之為虛擬存儲(chǔ)器的每一個(gè)字都有一個(gè)“門牌號(hào)”,即為地址。所有地址組成的集合為虛擬內(nèi)存地址空間,空間的大小就是計(jì)算機(jī)的字長(zhǎng),如32位計(jì)算機(jī),虛擬地址的空間限制為4GB,64位就是8GB。

數(shù)據(jù)大小

常用的數(shù)據(jù)類型有這么幾種,字符型、整數(shù)型以及浮點(diǎn)型,其中字符型一般用來存儲(chǔ)字符串中的單個(gè)字符,整數(shù)型則用來存儲(chǔ)各種長(zhǎng)度的整數(shù),浮點(diǎn)型則是用來存儲(chǔ)不同精度的浮點(diǎn)數(shù)。

尋址和字節(jié)順序

如果一個(gè)數(shù)據(jù)跨越多個(gè)存儲(chǔ)字節(jié),那么就必須要對(duì)數(shù)據(jù)的存放順序進(jìn)行規(guī)定,幾乎所有機(jī)器,多字節(jié)對(duì)象都被儲(chǔ)存在連續(xù)的字節(jié)序列中。對(duì)表示一個(gè)對(duì)象的字節(jié)序列排序,由兩種通用的規(guī)則:1)大端模式;2)小端模式。

如圖所示,在地址#1~#4所指向的內(nèi)存中,存儲(chǔ)16進(jìn)制數(shù)據(jù)01234567H,其中“01”表示數(shù)據(jù)的高有效位(8bit),“67”表示數(shù)據(jù)的低有效位,則將高有效位放在前面為大端模式;將高有效位放在后面為小端模式。

字符串

字符串是由一個(gè)個(gè)字符組成的,而在計(jì)算機(jī)中,每一個(gè)字符與“0/1”建立聯(lián)系是通過ASCII編碼(8bit)的方式來實(shí)現(xiàn)的,其中ASCII值為16進(jìn)制表示。

常見運(yùn)算

  1. 位級(jí)運(yùn)算

所謂位運(yùn)算,即以二進(jìn)制表示的數(shù)據(jù)的每一位可以作為一個(gè)個(gè)體進(jìn)行相應(yīng)的布爾運(yùn)算,主要運(yùn)算為與&、或|、非~以及異或^,可以參與位運(yùn)算的數(shù)據(jù)類型為任意“整型”(如char、int、short int、long int和unsigned int)。

  1. 邏輯運(yùn)算

邏輯運(yùn)算(或||、與&&、非?。┑倪\(yùn)算性質(zhì)與位級(jí)運(yùn)算顯著不同,功能也完全不同,邏輯運(yùn)算認(rèn)為所有的非零數(shù)據(jù)均為TRUE,而數(shù)據(jù)零為FALSE,運(yùn)算的結(jié)果為1或0,代表TRUE或FALSE。

  1. 移位運(yùn)算

移位運(yùn)算,以向左或者向右移動(dòng)位模式。左移表示為x<<k,丟棄左端的k位,低位補(bǔ)0;右移表示為x>>k,但是右移的具體操作則份兩種情況:1)邏輯右移為高位補(bǔ)0;2)算術(shù)右移為高位補(bǔ)最高有效位,具體操作如下圖所示。對(duì)于無符號(hào)數(shù)據(jù),右移必須為邏輯的,對(duì)于有符號(hào)數(shù)據(jù),幾乎所有的機(jī)器都默認(rèn)算術(shù)移位。

整數(shù)的表示與運(yùn)算

本節(jié)將介紹整數(shù)的兩種表示方式,一種只能表示非負(fù)數(shù),另一種則能夠表示負(fù)數(shù)、零和正數(shù)。其數(shù)學(xué)屬性與后續(xù)的機(jī)器級(jí)實(shí)現(xiàn)有很強(qiáng)的關(guān)聯(lián)。

整型數(shù)據(jù)類型

無符號(hào)數(shù)與二進(jìn)制補(bǔ)碼

所謂無符號(hào)數(shù),就是沒有“+/-”號(hào)的數(shù),其只能表示非負(fù)數(shù),其二進(jìn)制編碼表示與真值之間的映射關(guān)系為:

B2U_%7Bw%7D(%5Cvec%7Bx%7D)%5Cdoteq%20%5Csum_%7Bi%3D0%7D%5E%7Bw-1%7Dx_%7Bi%7D2%5E%7Bi%7D

即w位的無符號(hào)二進(jìn)制編碼,其真值可以上述公式進(jìn)行計(jì)算,其建立了二進(jìn)制編碼

%5B0%2C1%5D_%7Bw%7D%20(類似w維向量)與真值(類似w維向量的模)的一一映射的關(guān)系,公式看似復(fù)雜,其實(shí)就是前面二進(jìn)制轉(zhuǎn)十進(jìn)制所用到的冪乘求和法。

對(duì)于有符號(hào)數(shù)(即包含“+/-”號(hào)),則需要給符號(hào)位編碼,以區(qū)分正負(fù)數(shù)。具體執(zhí)行有兩種方案:

  1. 原碼(S)表示,將最高有效位作為符號(hào)位,其真值計(jì)算可表示為B2S,由下圖可知,最高有效位(符號(hào)位)決定了真值的正負(fù),其他位僅決定絕對(duì)值的大小

  1. 補(bǔ)碼(T)表示,將最高有效位定義為負(fù)權(quán),其真值的計(jì)算可以表示為B2T,由下圖可知,其真值結(jié)果表示為負(fù)數(shù)+正數(shù),其中負(fù)數(shù)有無取決于最高有效位(負(fù)權(quán)位),而正數(shù)的大小則取決于其他位。

需要說明的是,原碼在表示有符號(hào)數(shù)的時(shí)候存在一些先天缺陷,如下圖所示:+5和-5的原碼定義下的二進(jìn)制表示相加后結(jié)果為-10,顯然與實(shí)際不相符,而使用補(bǔ)碼定義,則計(jì)算結(jié)果為0,與實(shí)際吻合。因此,有符號(hào)數(shù)的表示絕大部分情況下都是用補(bǔ)碼方案。

不同類型的數(shù)據(jù)的二進(jìn)制表示以及其真值的計(jì)算方法如下圖所示,其中有符號(hào)數(shù)的反碼定義為原碼到補(bǔ)碼轉(zhuǎn)換的過渡形式,實(shí)際沒什么作用。

有符號(hào)數(shù)與無符號(hào)數(shù)之間的轉(zhuǎn)化

所謂有符號(hào)數(shù)和無符號(hào)數(shù)的轉(zhuǎn)化,其實(shí)并沒有改變二進(jìn)制的位表示,只是因?yàn)槎M(jìn)制數(shù)每一個(gè)“位”的解釋因?yàn)橛蟹?hào)數(shù)和無符號(hào)數(shù)的定義的不同而不同,從而導(dǎo)致二進(jìn)制數(shù)所表示的真值發(fā)生變化。


從二進(jìn)制補(bǔ)碼到無符號(hào)數(shù)的轉(zhuǎn)換,通過公式和圖示,分別如下圖所示:

T2U_%7Bw%7D(x)%3D%5Cbegin%7Bcases%7D%0Ax%2B2%5E%7Bw%7D%20%26%20%5Ctext%7B%7D%20x%3C0%20%5C%5C%0A%20x%20%26%20%5Ctext%7B%7D%20%20x%5Cgeqslant%200%20%0A%5Cend%7Bcases%7D

從無符號(hào)數(shù)轉(zhuǎn)換到二進(jìn)制補(bǔ)碼,則正好反過來,公式和圖示分別如圖所示:

U2T_%7Bw%7D(x)%3D%5Cbegin%7Bcases%7D%0Ax%20%26%20%5Ctext%7B%7D%20x%3C2%5E%7Bw-1%7D%20%5C%5C%0A%20x-2%5E%7Bw%7D%20%26%20%5Ctext%7B%7D%20%20x%5Cgeqslant%202%5E%7Bw-1%7D%20%0A%5Cend%7Bcases%7D

數(shù)字的擴(kuò)展與截?cái)?/span>

常見的運(yùn)算比如不同字長(zhǎng)的整數(shù)之間進(jìn)行轉(zhuǎn)換,字長(zhǎng)短的二進(jìn)制數(shù)轉(zhuǎn)換至字長(zhǎng)長(zhǎng)的二進(jìn)制數(shù),則需要擴(kuò)展位,字長(zhǎng)長(zhǎng)的數(shù)轉(zhuǎn)換至字長(zhǎng)短的數(shù),則需要進(jìn)行截?cái)唷?/span>

二進(jìn)制補(bǔ)碼和無符號(hào)數(shù)的擴(kuò)展的方式也有所不同:1)無符號(hào)數(shù)的擴(kuò)展為高位補(bǔ)0;2)二進(jìn)制補(bǔ)碼的擴(kuò)展則是高位補(bǔ)最高有效位。這種擴(kuò)展規(guī)則的制定,是保證擴(kuò)展前后的二進(jìn)制所表示的真值沒有發(fā)生變化。

截?cái)鄷?huì)改變二進(jìn)制所表示的真值,對(duì)于無符號(hào)數(shù)字x,截?cái)嗨絢位的結(jié)果就相當(dāng)于計(jì)算xmod2%5Ek(即真值對(duì)2%5Ek取模),總之無符號(hào)數(shù)和二進(jìn)制補(bǔ)碼的截?cái)嘟Y(jié)果可以分別表示為如下形式:

B2U_%7Bk%7D%5Bx_%7Bk%7D%2Cx_%7Bk-1%7D%2C%5Ccdots%20%2Cx_%7B0%7D%5D%3DB2U_%7Bw%7D(%5Bx_%7Bw%7D%2Cx_%7Bw-1%7D%2C%5Ccdots%20%2Cx_%7B0%7D%5D)mod2%5E%7Bk%7D

B2T_%7Bk%7D%5Bx_%7Bk%7D%2Cx_%7Bk-1%7D%2C%5Ccdots%20%2Cx_%7B0%7D%5D%3DU2T_%7Bk%7D(B2T_%7Bw%7D(%5Bx_%7Bw%7D%2Cx_%7Bw-1%7D%2C%5Ccdots%20%2Cx_%7B0%7D%5D)mod2%5E%7Bk%7D)

整數(shù)運(yùn)算

整數(shù)的運(yùn)算主要圍繞無符號(hào)數(shù)和二進(jìn)制補(bǔ)碼展開的,常用的運(yùn)算主要有:1)加法運(yùn)算;2)非運(yùn)算;3)乘法運(yùn)算;4)乘以2的冪運(yùn)算;5)除以2的冪運(yùn)算。

對(duì)于加法運(yùn)算,我們通常關(guān)心計(jì)算結(jié)果有無溢出的情況,對(duì)于無符號(hào)數(shù)和二進(jìn)制補(bǔ)碼,其加法計(jì)算結(jié)果如下所示:

x%2B_%7Bw%7D%5E%7Bu%7Dy%5Ctextrm%7B%7D%3D%5Cbegin%7Bcases%7D%0Ax%2By%20%26%20%5Ctext%7B%7D%20x%2By%3C2%5E%7Bw%7D%20%5C%5C%0A%20x%2By-2%5E%7Bw%7D%20%26%20%5Ctext%7B%7D%20%202%5E%7Bw%7D%5Cleqslant%20x%2By%3C%202%5E%7Bw%2B1%7D%20%0A%5Cend%7Bcases%7D%0A

對(duì)于乘法運(yùn)算,我們可以看到,無論是無符號(hào)數(shù)亦或是二進(jìn)制補(bǔ)碼運(yùn)算,乘法運(yùn)算都可等效的通過“位”截?cái)鄟韺?shí)現(xiàn),無需添加專門的乘法器即可實(shí)現(xiàn),體現(xiàn)出了極大的便利性。其中無符號(hào)數(shù)和二進(jìn)制補(bǔ)碼的乘法運(yùn)算結(jié)果分別如下所示:

x*_%7Bw%7D%5E%7Bu%7Dy%5Ctextrm%7B%7D%3D(x%5Ccdot%20y)mod2%5E%7Bw%7D

x*_%7Bw%7D%5E%7Bt%7Dy%5Ctextrm%7B%7D%3DU2T_%7Bw%7D((x%5Ccdot%20y)mod2%5E%7Bw%7D)

對(duì)于乘以2的冪和除以2的冪運(yùn)算,計(jì)算過程可以通過移位運(yùn)算來實(shí)現(xiàn),從而大幅提高了運(yùn)算便利性。其中:1)乘以2%5Ek,無論對(duì)于無符號(hào)數(shù)還是二進(jìn)制補(bǔ)碼,可以通過左移k位來等效實(shí)現(xiàn);2)除以2%5Ek%0A,對(duì)于無符號(hào)數(shù)還是二進(jìn)制補(bǔ)碼,則是通過算術(shù)右移k等效實(shí)現(xiàn)(其中無符號(hào)數(shù)高位補(bǔ)0,二進(jìn)制補(bǔ)碼高位補(bǔ)最高位)。

浮點(diǎn)數(shù)的表示和運(yùn)算

浮點(diǎn)數(shù)表示

浮點(diǎn)數(shù)表示形式為V%3D(%EF%BC%8D1)%5E%7Bs%7D%5Ctimes%20M%5Ctimes2%5E%7BE%7D的有理數(shù)進(jìn)行編碼。其中s為符號(hào)位(1位,只有兩種狀態(tài)0/1,表示+/-),M為有效數(shù)(n位,f_%7Bn-1%7Df_%7Bn-2%7D...f_%7B1%7Df_%7B0%7D),E為指數(shù)(k位,e_%7Bk%EF%BC%8D1%7De_%7Bk%EF%BC%8D2%7D...e_%7B1%7De_%7B0%7D),對(duì)于二進(jìn)制表示,僅需要對(duì)這三個(gè)數(shù)進(jìn)行編碼即可。對(duì)于單精度浮點(diǎn)格式(float,32位),k=8,n=23;對(duì)于雙精度格式(double,64位),k=11,n=52。已知浮點(diǎn)數(shù)的二進(jìn)制編碼表示,求解浮點(diǎn)數(shù)的真值,計(jì)算結(jié)果如下。

需要說明的是:針對(duì)指數(shù)的編碼是否為全0/1,浮點(diǎn)數(shù)編碼對(duì)應(yīng)的真值存在兩種計(jì)算方法:

  1. 指數(shù)編碼既不是全0也不是全1時(shí),此時(shí)浮點(diǎn)數(shù)為規(guī)格化值,其中指數(shù)域E%3De%EF%BC%8DBias,e為無符號(hào)數(shù),位表示為e_%7Bk%EF%BC%8D1%7De_%7Bk%EF%BC%8D2%7D...e_%7B1%7De_%7B0%7D,Bias%3D2%5E%7Bk%EF%BC%8D1%7D%EF%BC%8D1%0A;小數(shù)域M%3D1%2Bf,其中f%3D0.f_%7Bn%EF%BC%8D1%7Df_%7Bn%EF%BC%8D2%7D...f_%7B1%7Df_%7B0%7D;

  2. 當(dāng)指數(shù)編碼全為0時(shí),浮點(diǎn)數(shù)為非規(guī)格化值,此時(shí)E%3D1%EF%BC%8DBias,M%3Df%3D0.f_%7Bn-1%7Df_%7Bn-2%7D...f_%7B1%7Df_%7B0%7D;

  3. 當(dāng)指數(shù)編碼全為1時(shí),浮點(diǎn)數(shù)為特殊值,當(dāng)小數(shù)域?yàn)槿珵?時(shí),表示無窮,s=0,為%2B%5Cinfty;s=1,為-%5Cinfty;當(dāng)小數(shù)域非0時(shí),為NaN。

  • 浮點(diǎn)數(shù)運(yùn)算

浮點(diǎn)數(shù)的加法運(yùn)算,不同于整數(shù)的加法運(yùn)算性質(zhì),缺失了很多屬性(比如不滿足結(jié)合律和分配律)。這里就不再贅述。

小結(jié)

“十進(jìn)制”是現(xiàn)代所有和“數(shù)字”相關(guān)理論的基礎(chǔ),其是我們表征世界最熟悉的一種“方式”,而作為信息世界的基礎(chǔ),“二進(jìn)制”則提供了另外一種“方式”,因此建立兩種“方式”的聯(lián)系必不可少(進(jìn)制轉(zhuǎn)化),同時(shí)需要基于“二進(jìn)制”,來表征各種數(shù)字(無符號(hào)數(shù)、有符號(hào)數(shù)、定點(diǎn)數(shù)、浮點(diǎn)數(shù)等)并闡明各類數(shù)學(xué)運(yùn)算的性質(zhì),而這些就是第一章所要介紹的全部。

存儲(chǔ)系統(tǒng)

存儲(chǔ)系統(tǒng)就如同計(jì)算機(jī)系統(tǒng)中的“倉庫”,用于存放程序、指令、數(shù)據(jù)等各類信息,將分為三個(gè)部分展開:1)什么是“存儲(chǔ)系統(tǒng)”,介紹存儲(chǔ)器的抽象模型以及基于存取速度梯度而成的層次結(jié)構(gòu);2)為什么稱之為“系統(tǒng)”,介紹紛繁多樣的存儲(chǔ)技術(shù),并基于“局部性原理”的存儲(chǔ)系統(tǒng)的金字塔結(jié)構(gòu);3)“存儲(chǔ)系統(tǒng)”如何運(yùn)行,重點(diǎn)介紹存儲(chǔ)系統(tǒng)結(jié)構(gòu)組成以及其中最為重要的“主存”和“高速緩存”,闡述它們是如何與CPU協(xié)調(diào)共事,順利完成數(shù)據(jù)存取。

什么是“存儲(chǔ)系統(tǒng)”

抽象層面的認(rèn)識(shí)

如上圖所示,到目前為止,在我們對(duì)計(jì)算機(jī)系統(tǒng)的研究中,我們依賴于一個(gè)簡(jiǎn)單的計(jì)算機(jī)系統(tǒng)模型,CPU執(zhí)行指令,而存儲(chǔ)器為CPU存放指令和數(shù)據(jù)。在這個(gè)簡(jiǎn)單模型中,存儲(chǔ)器系統(tǒng)是一個(gè)線性的字節(jié)數(shù)組,而CPU能夠在一個(gè)常數(shù)時(shí)間內(nèi)訪問每個(gè)存儲(chǔ)器位置。再具體一點(diǎn),就如下圖所示,其包含一個(gè)存儲(chǔ)體(用以存放數(shù)據(jù)),然后就是兩個(gè)接口(地址接口,數(shù)據(jù)接口),雖然至今為止這都是一個(gè)有效的具體模型,但是它沒有反映現(xiàn)代系統(tǒng)實(shí)際工作的方式。

層次結(jié)構(gòu)

實(shí)際上,存儲(chǔ)器系統(tǒng)(memory system)是一個(gè)具有不同容量、成本和訪問時(shí)間的存儲(chǔ)(storage)設(shè)備的層次結(jié)構(gòu)。CPU寄存器保存著最常用的數(shù)據(jù)。靠近CPU的小的、快速的高速緩存存儲(chǔ)器(cache)的緩沖區(qū)域。主存暫時(shí)存放存儲(chǔ)在較大的慢速磁盤上的數(shù)據(jù),而這些磁盤常常又作為存儲(chǔ)在通過網(wǎng)絡(luò)連接的其他機(jī)器的磁盤或磁帶上的數(shù)據(jù)的緩沖區(qū)域。

為什么稱之為“系統(tǒng)”

存儲(chǔ)技術(shù)的多樣性

信息技術(shù)發(fā)展至今,存儲(chǔ)技術(shù)日新月異,如何存儲(chǔ)二進(jìn)制信息,方式也十分豐富。

按照存儲(chǔ)介質(zhì)的類型,存儲(chǔ)器可以分為:1)半導(dǎo)體存儲(chǔ)器(主要用于主存和Cache);2)磁表面存儲(chǔ)器(主要有磁盤和磁帶);3)光存儲(chǔ)器(主要有光盤等)。

其中,半導(dǎo)體存儲(chǔ)器發(fā)展迅速,也有很多分類:

SRAM為靜態(tài)隨機(jī)訪問存儲(chǔ)器:其存儲(chǔ)單位為一個(gè)雙穩(wěn)態(tài)電路,每個(gè)單元用用6個(gè)晶體管電路實(shí)現(xiàn),只要有電,其可以無限期的保持兩個(gè)電壓配置或穩(wěn)定狀態(tài),電路復(fù)雜度相對(duì)較高,因此成本相對(duì)較高,一般用于高速緩存和CPU中的寄存器;

DRAM為動(dòng)態(tài)隨機(jī)防蚊存儲(chǔ)器:其每一個(gè)位的存儲(chǔ)元器件位電容,通過電容的充放電來表征二進(jìn)制0/1狀態(tài),DRAM的存儲(chǔ)單元對(duì)對(duì)干擾非常敏感,成本較SRAM便宜很多,一般用于主存(內(nèi)存條)。

ROM(read only memory)只讀存儲(chǔ)器,只能讀,不能寫。不同于RAM(斷電之后,DRAM和SRAM存儲(chǔ)的信息就會(huì)丟失),ROM屬于非易失性存儲(chǔ)器,即使關(guān)掉電源,其存儲(chǔ)的信息也不會(huì)丟失。存儲(chǔ)在ROM設(shè)備中的程序通常被稱為固件(firmware),當(dāng)計(jì)算機(jī)通電后,它會(huì)運(yùn)行存儲(chǔ)在ROM中固件。一些系統(tǒng)在固件中提供了少量最基本的輸入輸出函數(shù)(如BIOS例程),復(fù)雜設(shè)備,如圖形卡和磁盤驅(qū)動(dòng)器,也依賴固件翻譯來自CPU的I/O請(qǐng)求。

? ?

磁盤

磁盤的結(jié)構(gòu)組成包括盤片(存儲(chǔ)數(shù)據(jù))、主軸(帶動(dòng)盤片旋轉(zhuǎn))以及讀寫頭(讀取盤片上的信息)。盤片位磁盤的核心部件,上面劃分為了許多同心圓(磁道),磁道上交替分布了許多扇區(qū)(扇區(qū)之間使用間隙進(jìn)行分割),磁盤以扇區(qū)位為單位進(jìn)行數(shù)據(jù)存儲(chǔ)。

存儲(chǔ)器的搭建原則

以上,我們知道二進(jìn)制0/1信息的存儲(chǔ)方式由許多種,在計(jì)算機(jī)系統(tǒng)的搭建時(shí),我們?cè)撊绾稳ミx擇這些存儲(chǔ)器呢?

誠如上面所介紹的那樣,雖然以上的設(shè)備都可以存儲(chǔ)信息,但是它們的性能和成本卻相去甚遠(yuǎn)。

正因如此,為了兼顧計(jì)算機(jī)系統(tǒng)的成本、容量(存儲(chǔ)字?jǐn)?shù)*字長(zhǎng))以及速度(數(shù)據(jù)寬度/存儲(chǔ)周期),計(jì)算機(jī)存儲(chǔ)設(shè)備不是簡(jiǎn)單的選擇哪一種技術(shù)體制,而是依據(jù)存儲(chǔ)設(shè)備距離計(jì)算機(jī)大腦(CPU)的遠(yuǎn)近,按照傳輸速度的由快至慢來布局存儲(chǔ)系統(tǒng)。從而形成了“金字塔結(jié)構(gòu)”的存儲(chǔ)系統(tǒng)布局設(shè)計(jì)。

如圖所示,以我的筆記本電腦的存儲(chǔ)系統(tǒng)為例,其基本組成為:1)CPU中配備了三級(jí)高速緩存(L1/L2/L3),容量分別為256KB、1.0MB和 6.0MB,依次增大;2)電腦主存為7.9GB的DRAM;3)輔存磁盤為239GB的SSD(固態(tài)硬盤)??梢钥闯觯鎯?chǔ)設(shè)備越遠(yuǎn)離CPU,存儲(chǔ)容量越大。

局部性原理(可行性基礎(chǔ))

如上文所說,為了平衡容量、成本和傳輸速度,我們?cè)O(shè)計(jì)了一個(gè)“金字塔形式”的存儲(chǔ)系統(tǒng)層次結(jié)構(gòu),這樣的結(jié)構(gòu)能否實(shí)現(xiàn)數(shù)據(jù)在存儲(chǔ)系統(tǒng)各存儲(chǔ)設(shè)備之間順暢的“上上下下”,保證計(jì)算機(jī)系統(tǒng)的暢通運(yùn)行?

“局部性原理”為這個(gè)結(jié)構(gòu)的合理性提供了理論基礎(chǔ)。所謂局部性原理,即一個(gè)編寫良好的計(jì)算機(jī)程序傾向于引用的數(shù)據(jù)項(xiàng)臨近于其他最近引用過的數(shù)據(jù)項(xiàng),或是臨近于自我引用的數(shù)據(jù)項(xiàng)。這一原理對(duì)軟件系統(tǒng)和硬件系統(tǒng)的設(shè)計(jì)都有著極大的影響。局部性通常由兩種形式:1)時(shí)間局部性,即被引用過一次的存儲(chǔ)器位置可能在不遠(yuǎn)的將來被多次引用;2)空間局部性,即一個(gè)存儲(chǔ)器位置被引用了一次,那么程序可能在不遠(yuǎn)的將來引用附近的存儲(chǔ)器位置。

局部性原理在工程中有著現(xiàn)實(shí)的需求,比如說硬件層面,計(jì)算機(jī)通過引入高速緩存,提前將主存中位置相鄰的數(shù)據(jù)集拷貝至高速緩存,從而利用高速緩存的速度優(yōu)勢(shì),提高數(shù)據(jù)傳輸速度。

“存儲(chǔ)系統(tǒng)”如何運(yùn)行

系統(tǒng)結(jié)構(gòu)組成

上面,我們知道了存儲(chǔ)系統(tǒng)中的各設(shè)備是按照其與CPU的“遠(yuǎn)近親疏”,層次漸進(jìn)的構(gòu)成了一個(gè)“金字塔結(jié)構(gòu)”布局。本節(jié),我們將深入了解這些存儲(chǔ)設(shè)備相互之間以及與CPU 之間究竟是如何連接以及分工寫作的。

如上圖所示,數(shù)據(jù)在存儲(chǔ)系統(tǒng)的運(yùn)行過程大致是這樣的:1)各種應(yīng)用APP都被安裝在計(jì)算機(jī)的C盤/D盤(ROM)中,由于ROM的非易失性,即使斷電,安裝在里面的APP也不會(huì)被刪除;2)當(dāng)你打開電腦,啟動(dòng)微信APP時(shí),相關(guān)運(yùn)行程序就會(huì)被拷貝到主存中,開始運(yùn)行;3)高速緩存載從主存中拷貝數(shù)據(jù)/程序子集,以備CPU及時(shí)調(diào)用;4)CPU從高速緩存中取指令、數(shù)據(jù)進(jìn)行處理,輸出預(yù)期的結(jié)果給使用者。

主存

以上的敘述,我們還是將主存作為一個(gè)抽象的黑匣子進(jìn)行分析,現(xiàn)在我們將要深入主存內(nèi)部,去一探主存的組成和運(yùn)行機(jī)理。

  • 主存的基本組成

由上文可知,主存的基本組成包括三部分:1)存放數(shù)據(jù)的存儲(chǔ)體,其類似于貨柜,一個(gè)個(gè)數(shù)據(jù)如同包裹;2)地址寄存器,用以存放CPU待取數(shù)據(jù)的地址,就如同取包裹時(shí)的取件碼;3)數(shù)據(jù)寄存器,用以臨時(shí)存放CPU待取數(shù)據(jù),就如同待取的包裹。三者之間的有序開展有賴于時(shí)序控制邏輯協(xié)調(diào)。

繼續(xù)深入存儲(chǔ)體的結(jié)構(gòu)細(xì)節(jié),就是密密麻麻的集成電路組成,其基本組成如下圖所示:存儲(chǔ)體被綠色縱線和紅色橫線劃分成很多小方塊(構(gòu)成存儲(chǔ)矩陣),每個(gè)小方塊就是一個(gè)存儲(chǔ)“位”,它由一個(gè)MOS管和一個(gè)電容構(gòu)成,其中電容就相當(dāng)于“蓄水池”,可以存水,亦可以放水,有水就是“1”,沒水就是“0”;MOS管則相當(dāng)于水管閥門,控制是否存水或防水,對(duì)應(yīng)的就是是否“寫入”“讀出”電容里的數(shù)據(jù)。因此連接水管出水口的“綠線”就是寫入或者讀出存儲(chǔ)單元里面的數(shù)據(jù),將8個(gè)存儲(chǔ)“位”就構(gòu)成一個(gè)存儲(chǔ)“字”,而連接開關(guān)閥門G的“紅線”就決定是否允許相應(yīng)的單元被寫入或讀出數(shù)據(jù),將紅線統(tǒng)一連接到地址寄存器,就可以通過地址寄存器的數(shù)據(jù)控制哪個(gè)位置的數(shù)據(jù)被選通。

其實(shí)將“紅線”直接連接地址寄存器(MAR)是相當(dāng)浪費(fèi)的,因位紅色控制線終究只有一根線導(dǎo)通(對(duì)應(yīng)“1”),而其他線均關(guān)閉(對(duì)應(yīng)“0”),所以n條地址線僅僅確定了n個(gè)狀態(tài),這遠(yuǎn)低于2%5En個(gè)狀態(tài),資源浪費(fèi),通過橋接一個(gè)譯碼器,就可以通過n位地址線控制2%5En個(gè)狀態(tài),從而充分利用資源。通過讀寫控制線確定當(dāng)前存儲(chǔ)器的讀寫狀態(tài)。

忽略電路細(xì)節(jié),主存就是一個(gè)包含著一組地址線引腳和數(shù)據(jù)線引腳的封裝芯片,外加讀寫控制線引腳,以及片選線引腳(由于主存芯片由多個(gè)芯片并行而成,片選線控制使用哪一個(gè)存儲(chǔ)芯片)。

存儲(chǔ)器的總?cè)萘?存儲(chǔ)單元數(shù)*存儲(chǔ)字長(zhǎng)(存儲(chǔ)單元包含的位數(shù)),如8KB,其中1B(字)=8bit(位),所以8KB=8K*1B=2%5E%7B13%7D%20%20*8bit,即地址線有13位,數(shù)據(jù)線8位。

  • 主存與CPU的連接

以上,我們算是把主存剖析清楚了,那么主存又是如何與CPU進(jìn)行連接的,實(shí)現(xiàn)CPU自由讀取貯存在中的數(shù)據(jù)呢。其實(shí)很簡(jiǎn)單,數(shù)據(jù)線連數(shù)據(jù)線,地址線連地址線即可。

如果主存的容量無法滿足CPU的需求,可以通過存儲(chǔ)器擴(kuò)展來解決,擴(kuò)展的方式有兩種:

  • 主存的位數(shù)不夠(相當(dāng)于快遞柜的尺寸太小,放不下大包裹),則可以通過位擴(kuò)展的方式(快遞柜擴(kuò)容)實(shí)現(xiàn);

  • 主存的字?jǐn)?shù)不夠(存儲(chǔ)單元的數(shù)目不夠,相當(dāng)于快遞柜數(shù)目太少,放不了太多包裹,則可以通過字?jǐn)U展的方式實(shí)現(xiàn)。


高速緩存

高速緩存的產(chǎn)生的背景是計(jì)算機(jī)技術(shù)的快速發(fā)展致使主存?zhèn)鬏敂?shù)據(jù)的速度越來越無法匹配CPU的運(yùn)算速度,從而嚴(yán)重影響了計(jì)算機(jī)的運(yùn)行速度。

解決方法就是,CPU和主存之間增加一個(gè)傳輸速度更快的高速緩存,用以拷貝主存中即將執(zhí)行的程序,以備CPU運(yùn)算調(diào)用。這一策略就如同京東快遞和其他快遞的區(qū)別,京東快遞通過在每個(gè)城市自建倉儲(chǔ),用以提前存放商品,買家下單后,商品通常是直接從倉儲(chǔ)發(fā)貨,而不是產(chǎn)地發(fā)貨,從而實(shí)現(xiàn)了“當(dāng)天達(dá)”這樣的高效。

  • 高速緩存與主存的映射關(guān)系

計(jì)算機(jī)主存相當(dāng)于一個(gè)大蓄水池,而高速緩存就相當(dāng)于一個(gè)小蓄水池,主存事先將數(shù)據(jù)拷貝至高速緩存,如果將主存看作為一個(gè)數(shù)據(jù)集合的話,高速緩存就是這個(gè)集合的子集,因此必須要明確子集與原集合的映射關(guān)系,如此,CPU在從高速緩存中獲取數(shù)據(jù)的時(shí)候才不至于混亂。

既然高速緩存Cache相當(dāng)于主存的一個(gè)子集,那就必須要先明確子集與原集合之間的映射關(guān)系,高速緩存與主存之間的映射關(guān)系主要分為三種:

  1. 全相聯(lián)映射:1)映射方式,主存和緩存之間的數(shù)據(jù)傳遞是以塊為單位的,每個(gè)塊包含多個(gè)字的數(shù)據(jù),全相聯(lián)映射中,如下圖所示:Cache中#0~#7行均可以接收主存#0塊,即主存中塊可以存放在Cache中的任意位置,沒有限制;2)訪存方式,如下圖所示,假設(shè)內(nèi)存容量為16*4B,主存的地址包括4位塊號(hào)以及2位塊內(nèi)地址,CPU帶著待取數(shù)據(jù)的主存地址(如001110)去問Cache要數(shù)據(jù),Cache于是對(duì)著主存地址去挨個(gè)塊核對(duì)標(biāo)記有效位,發(fā)現(xiàn)#2行標(biāo)記和主存塊號(hào)一致,且標(biāo)記位為1(說明塊內(nèi)有數(shù)據(jù)),則通知CPU“我有你想要的東西”,即為命中;

  1. 直接映射:1)映射方式,主存中塊只能按照一定的次序排隊(duì)放入放到Cache中的某一行,因此,Cache塊號(hào)=主存塊號(hào)%(取余)Cache總塊數(shù);2)訪存方式,CPU帶著地址碼001110去找Cache要數(shù)據(jù),Cache用主存塊號(hào)對(duì)行數(shù)8取余結(jié)果為#3,于是就去#3行核對(duì)標(biāo)記和有效位,發(fā)現(xiàn)有效位雖然為1,但標(biāo)記卻是1011,與主存塊號(hào)不一致,于是通知CPU“我沒有你想要的東西”,即為不命中;

  1. 組相聯(lián)映射,1)映射方式,介于1)和2)映射方式之間,Cache中的塊可以事先分組,主存中的塊必須要按照一定次序放入Cache中的某一組,但是在組內(nèi)可以隨意放;2)訪存方式,CPU帶著地址碼001110去找Cache要數(shù)據(jù),Cache用主存塊號(hào)對(duì)組數(shù)4取余結(jié)果為#3組(即塊號(hào)后兩位),于是就去#3組(#6行,#7行)核對(duì)標(biāo)記和有效位,發(fā)現(xiàn)#7行標(biāo)記為0011一致,且有效位為1,于是通知CPU“我有你想要的東西”,即為命中;

三種映射方式總結(jié)和優(yōu)缺點(diǎn)對(duì)比如下:

  • 高速緩存的替換策略

前面,介紹了高速緩存與主存的映射方式以及不同映射方式下,CPU的訪存方式,訪存結(jié)果根據(jù)CPU是否獲得“想要的數(shù)據(jù)”而分為命中和不命中兩種情況,命中就皆大歡喜,這里介紹一下不命中會(huì)怎么樣。不命中也分兩種情況:

  • 有空位置存放數(shù)據(jù),直此時(shí)接將內(nèi)存塊地址對(duì)應(yīng)數(shù)據(jù)Copy至此即可;

  • 沒有空位置存放數(shù)據(jù)(即待放入位置被原數(shù)據(jù)塊占據(jù)了),此時(shí)就需要對(duì)兩個(gè)塊進(jìn)行位置替換,確保計(jì)算機(jī)的正常運(yùn)行,三種不同的映射方式的替換前提有所不同,區(qū)別如下:1) 全相聯(lián)不挑食,除非Cache全滿,否則就可以見縫插針;2)直接映射最專一,必須對(duì)應(yīng)行非空,否則就替換;2)組相聯(lián)比較中庸,介于二者之間,對(duì)應(yīng)的組滿了,才替換。

實(shí)際替換時(shí),也有著不同的策略,主要有四種:1)隨機(jī)算法(RAND),在滿足要求的塊中,隨機(jī)選一個(gè)塊進(jìn)行替換,效果較差;2)先進(jìn)先出算法(FIFO),優(yōu)先替換最新被調(diào)入Cache的主存塊;3)近期最少用(LRU),將最久沒有被使用的主存塊替換掉,基于“局部性原理”,命中率較高;4)最近不常用(LFU),將被訪問次數(shù)最少的主存塊替換掉。

  • 高速緩存的寫策略

以上介紹了CPU從高速緩存中讀數(shù)據(jù)時(shí)的一些策略,但同時(shí)CPU的運(yùn)算結(jié)果也要同時(shí)寫回高速緩存以及主存,以備后續(xù)使用,這時(shí)候也有著不同的策略,針對(duì)寫命中和寫不命中兩種情況,處理策略也不盡相同。

  1. 寫命中時(shí):1)全寫法,即寫命中后需要將結(jié)果同時(shí)寫入高速緩存和主存;2)寫回法,即寫命中后,只是將結(jié)果寫入高速緩存,當(dāng)高速緩存中相應(yīng)位置的數(shù)據(jù)要被替換時(shí),才將結(jié)果寫回主存;

  2. 寫不命中:1)寫分配法,當(dāng)CPU對(duì)高速緩存寫不命中時(shí),把主存中的塊調(diào)入高速緩存,在高速緩存中修改,通常搭配寫回法使用;2)非寫分配法,當(dāng)CPU對(duì)高速緩存寫不命中時(shí),只寫入主存,不調(diào)入高速緩存,通常搭配全寫法使用。

小結(jié)

本章更加深入的介紹了存儲(chǔ)系統(tǒng),相繼介紹了豐富多樣的存儲(chǔ)技術(shù)、不同存儲(chǔ)方式因速度和成本的區(qū)別分別司職于計(jì)算機(jī)的不同部位,從而形成了“金字塔”形式的層次結(jié)構(gòu)、以及詳細(xì)介紹了層次結(jié)構(gòu)的中主存和高速緩存Cache的結(jié)構(gòu)組成、運(yùn)行機(jī)理以及與CPU之間協(xié)調(diào)機(jī)制。

指令系統(tǒng)

如下圖所示,我們知道計(jì)算機(jī)系統(tǒng)構(gòu)成層次結(jié)構(gòu)是這樣的:晶體管是構(gòu)成計(jì)算機(jī)系統(tǒng)的基本元素,其通過高/低電平的切換實(shí)現(xiàn)自己的價(jià)值;大量晶體管通過不斷套娃構(gòu)成了超大規(guī)模的集成電路,這些集成電路由于功能的不同可以分飾不同的角色(存儲(chǔ)器、CPU、輸入/輸出等),把這些不同功能的集成電路組合起來就構(gòu)成了計(jì)算機(jī)硬件系統(tǒng),然而這個(gè)硬件系統(tǒng)只認(rèn)識(shí)0和1組成的機(jī)器語言,其與程序員所編寫的程序(高級(jí)語言)有著天壤之別,它們之間需要經(jīng)過編譯器的翻譯才能互通。這些0和1構(gòu)成的數(shù)據(jù)串就指令,其為計(jì)算機(jī)運(yùn)行的最小功能單位,而這些可以實(shí)現(xiàn)各種功能的指令所組成的集合就是指令系統(tǒng)。

經(jīng)過編譯器編譯的指令序列被放入主存的存儲(chǔ)體中,CPU在程序計(jì)數(shù)器PC的控制下,一條條的從主存中取出指令,由CPU的控制器進(jìn)行指令分析,并指揮CPU運(yùn)算器按照指令要求完成相應(yīng)的運(yùn)算處理,具體的運(yùn)行過程可以參考前文所述。

指令系統(tǒng)一章將從三個(gè)方面展開:1)指令格式,介紹一條指令的基本組成以及按照不同標(biāo)準(zhǔn)的分類;2)指令/數(shù)據(jù)尋址,指令運(yùn)行前需要總主存中提取出來,這就需要尋址,分別介紹指令尋址以及數(shù)據(jù)(指令的被操作數(shù))尋址的各種方式;3)CISC與RISC,介紹兩種主流的指令系統(tǒng)(復(fù)雜指令集與精簡(jiǎn)指令集),簡(jiǎn)單闡明二者的本質(zhì)區(qū)別、優(yōu)缺點(diǎn)以及典型應(yīng)用。

指令格式

指令的格式如下圖所示,由操作碼和地址碼構(gòu)成,其中操作碼規(guī)定了對(duì)操作對(duì)象的操作類型(求和、移位等),而地址嗎則指明了操作對(duì)象的位置。

由于操作任務(wù)的種類不同,指令地址嗎的數(shù)目也有所不同,主要分為:1)零地址指令;2)一地址指令;2)二地址指令;3)三地址指令;4)四地址指令。

  • 零地址指令

一種情況是不需要操作數(shù),如空操作、停機(jī)、關(guān)中斷等指令;另一種情況是堆棧計(jì)算機(jī),兩個(gè)操作數(shù)隱含存放在棧頂和次棧頂,計(jì)算結(jié)果亞輝棧頂。

  • 一地址指令

一種情況是只需要單操作數(shù),如加1、減1、取反、求補(bǔ)等操作;另一種是需要兩個(gè)操作數(shù),但是有一個(gè)操作數(shù)隱含在某個(gè)寄存器(如ACC)。

  • 二地址指令

常用于需要兩個(gè)操作數(shù)的算術(shù)運(yùn)算、邏輯運(yùn)算相關(guān)指令。

  • 三地址指令

常用于需要兩個(gè)操作數(shù)的算術(shù)運(yùn)算、邏輯運(yùn)算相關(guān)指令,并將計(jì)算結(jié)果寫入A3。

  • 四地址指令

常用于需要兩個(gè)操作數(shù)的算術(shù)運(yùn)算、邏輯運(yùn)算相關(guān)指令,并將計(jì)算結(jié)果寫入A3,同時(shí)告知下個(gè)執(zhí)行指令的地址。

指令的分類還可以按照長(zhǎng)度和類型進(jìn)行區(qū)分:1)定長(zhǎng)指令字結(jié)構(gòu),即指令系統(tǒng)中所有指令的長(zhǎng)度都是一樣的;2)變長(zhǎng)指令字結(jié)構(gòu),即指令系統(tǒng)中的各種指令的長(zhǎng)度不等。

按照操作類型進(jìn)行分類:1)數(shù)據(jù)傳送類,進(jìn)行主存和CPU之間的數(shù)據(jù)傳遞(如LOAD:把存儲(chǔ)器中的數(shù)據(jù)放到寄存器中;STORE:把寄存器中的數(shù)據(jù)放入到存儲(chǔ)器);2)算術(shù)/邏輯操作,其中算術(shù)操作包括加、減、乘、除、增1、減1、求補(bǔ)、浮點(diǎn)運(yùn)算、十進(jìn)制運(yùn)算等,邏輯運(yùn)算包括與、或、非、異或、位操作、位測(cè)試、位清除、位求反等;3)移位操作,包括算術(shù)移位、邏輯移位、循環(huán)移位等;4)轉(zhuǎn)移操作,包括無條件轉(zhuǎn)移JMP、條件轉(zhuǎn)移(JZ:結(jié)果為0;JO:結(jié)果溢出;JC:結(jié)果有進(jìn)位)、調(diào)用和返回(CALL和RETURN)、陷阱(Trap)與陷阱指令;5)輸入/輸出操作,CPU寄存器與IO端口之間的數(shù)據(jù)傳遞(端口即IO接口中的寄存器)。

指令/數(shù)據(jù)尋址

指令尋址的目的在于如何確定下一條指令的存放位置,主要有兩種類型:1)順序?qū)ぶ?,通過程序計(jì)數(shù)器PC不斷加1,順序執(zhí)行存儲(chǔ)器中的指令;2)跳躍尋址,由轉(zhuǎn)移指令(JMP)指出。兩種指令尋址的運(yùn)行過程如下圖所示。

相較于指令尋址,數(shù)據(jù)尋址的種類則要豐富很多。數(shù)據(jù)尋址的主要任務(wù)是確定本條指令的地址碼指明的真實(shí)地址。

以一地址指令為例,地址碼的構(gòu)成包括兩個(gè)部分(尋址特征+形式地址),操作數(shù)的的有效地址EA(真實(shí)地址)需要通過形式地址按照尋址特征規(guī)定的操作進(jìn)行處理才能獲得。尋址特征規(guī)定了數(shù)據(jù)尋址的方式,種類繁多,如下圖所示。

  • 立即尋址

無需尋址,形式地址即為操作數(shù)(一般用補(bǔ)碼形式表示)。

優(yōu)點(diǎn)為無需訪存,速度快,缺點(diǎn)為形式地址的位數(shù)限制了操作數(shù)的范圍。

  • 直接尋址

指令中的形式地址A就是操作數(shù)的真實(shí)地址,即EA=A。

優(yōu)點(diǎn)是指令結(jié)構(gòu)簡(jiǎn)單,指令執(zhí)行僅一次訪存,缺點(diǎn)是A的位數(shù)決定了尋址的范圍,操作數(shù)地址不易修改。

  • 間接尋址

指令的地址字段給出的形式地址不是操作數(shù)的真正地址,而是操作數(shù)有效地址所在存儲(chǔ)單元的地址,即EA=(A)。

優(yōu)點(diǎn)是可以擴(kuò)大尋址范圍(有效地址EA的位數(shù)大于形式地址A的位數(shù)),缺點(diǎn)為指令執(zhí)行過程中需要多次尋址。

  • 隱含尋址

不是明顯的給出操作數(shù)的地址,而是在指令中隱含著操作數(shù)的地址。

優(yōu)點(diǎn)是有利于縮短指令字長(zhǎng),缺點(diǎn)為需要增加存儲(chǔ)操作數(shù)或隱含地址的硬件。

  • 寄存器尋址

在指令字中直接給出操作數(shù)所在的寄存器編號(hào),即EA=Ri,其操作數(shù)在有Ri所指的寄存器內(nèi)。

優(yōu)點(diǎn)為指令在執(zhí)行階段不用訪問主存,只訪問寄存器,指令字短且執(zhí)行速度快,支持向量/矩陣運(yùn)算,缺點(diǎn)為寄存器價(jià)格昂貴,計(jì)算器中寄存器個(gè)數(shù)有限。

  • 寄存器間接選址

寄存器Ri中給出的不是一個(gè)操作數(shù),而是操作數(shù)所在主存單元的地址,EA=(Ri)。

特點(diǎn)是比一般的間接尋址速度更快,但指令的執(zhí)行階段需要訪問主存(因?yàn)椴僮鲾?shù)在主存中)。

  • 基址尋址

將CPU中的基址寄存器(BA)的內(nèi)容加上指令格式中的形式地址A,而形成操作數(shù)的有效地址,即為EA=(BR)+A。

優(yōu)點(diǎn)是便于程序“浮動(dòng)”,方便實(shí)現(xiàn)多道程序并發(fā)運(yùn)行。

  • 變址尋址

有效地址EA等于指令字中的形式地址A與變址寄存器IX的內(nèi)容相加之和,即EA=(IX)+A,其中IX可謂編制寄存器(專用),也可用通用寄存器作為變址寄存器。與基址尋址的方式的區(qū)別在于IX可以被用戶修改。

優(yōu)點(diǎn):在數(shù)組處理過程中,可設(shè)定A為數(shù)組的首地址,不斷改變編制寄存器IX的內(nèi)容,便可以很容易形成數(shù)組中任一數(shù)據(jù)的地址,特別適合編制循環(huán)程序。

  • 相對(duì)尋址

把程序計(jì)數(shù)器PC的內(nèi)容加上指令格式中的形式地址A而形成操作數(shù)的有效地址,即EA=(PC)+A,其中A為相對(duì)于PC所指地址的位移量,可證可負(fù),補(bǔ)碼表示。

優(yōu)點(diǎn):操作數(shù)的地址不是固定的,它隨著PC值的變化而變化,并且于指令地址之間總是相差一個(gè)固定值,便于程序浮動(dòng)。

  • 堆棧尋址

操作數(shù)存放在堆棧中,隱含使用堆棧指針(SP)作為操作數(shù)地址。其中的堆棧是存儲(chǔ)器中一塊特定的按“后進(jìn)先出(LIFO)”原則管理的存儲(chǔ)區(qū),該存儲(chǔ)區(qū)中被讀/寫單元的地址使用一個(gè)特定的寄存器給出的,該寄存器稱為堆棧指針(SP)(類似于程序計(jì)數(shù)器PC)。

基于堆棧尋址,下圖所示為一個(gè)加法運(yùn)算的過程:

step1:堆棧指針SP指向R0,對(duì)應(yīng)數(shù)據(jù)0001出棧進(jìn)入ACC,SP指向R1

step2:SP對(duì)應(yīng)數(shù)據(jù)1001出棧進(jìn)入寄存器X,SP指向R2;

step3:ALU計(jì)算ACC與X的和(為1010),送至寄存器Y;

step4:計(jì)算結(jié)果入棧,SP指向R1,將Y1010)送至堆棧寄存器R1

依據(jù)堆棧數(shù)據(jù)存放位置可分為硬堆棧和軟堆棧,硬堆棧使用寄存器存放操作數(shù),成本較高,但速度快;軟堆棧使用主存存放操作數(shù),成本低,但速度相對(duì)較慢。

不同尋址方式的有效地址的計(jì)算方法以及訪存次數(shù)匯總?cè)缦卤恚?/span>



CISC與RISC

指令集的設(shè)計(jì),有兩個(gè)主流的方向,一個(gè)是以X86架構(gòu)為代表的CISC(Complex Instruction Set Computer),即復(fù)雜指令集,另一個(gè)則是以ARM架構(gòu)為代表的RISC(Reduced Instruction Set Computer),即精簡(jiǎn)指令集。兩者的設(shè)計(jì)思路向左。

  • CISC:設(shè)計(jì)思路為一條指令完成一個(gè)復(fù)雜的基本功能,一條指令可以由一個(gè)專門的電路完成,比較復(fù)雜的指令則通過“存儲(chǔ)程序”(微程序)的設(shè)計(jì)思路,由一個(gè)比較通用的電路配合存儲(chǔ)部件完成。典型應(yīng)用為X86架構(gòu),主要應(yīng)用于筆記本、臺(tái)式電腦等;

  • RISC:設(shè)計(jì)思路為一條指令至完成一個(gè)基本“動(dòng)作”多條指令組合完成復(fù)雜的基本功能。典型應(yīng)用為ARM架構(gòu),主要應(yīng)用于手機(jī)、平板等。

如果說“指令”就是計(jì)算機(jī)硬件系統(tǒng)的語言的話,那么CISC和RISC就是兩種語言系統(tǒng)規(guī)范,其中CISC以“單詞”為元素構(gòu)建語言系統(tǒng),每一個(gè)單詞就可以表達(dá)一個(gè)意思,而表達(dá)復(fù)雜的意思,就可以將單詞組合,優(yōu)點(diǎn)在于簡(jiǎn)單,缺點(diǎn)就是單詞可能會(huì)很多;而RISC則是以“字母”為元素構(gòu)建語言系統(tǒng),每個(gè)字母無法表達(dá)確切的含義,需要將很多字母組合起來,才能表達(dá)豐富多樣含義,其優(yōu)點(diǎn)在于“元素”的數(shù)目較少,只有26個(gè),缺點(diǎn)在于表達(dá)任何一個(gè)含義,都需要將很多字母組合起來方可。

兩種指令集的對(duì)比如下圖所示:


小結(jié)

本章詳細(xì)介紹了指令系統(tǒng)的相關(guān)內(nèi)容,相繼介紹了什么事指令系統(tǒng)以及其在計(jì)算機(jī)系統(tǒng)中的作用、一條指令的構(gòu)成(指令格式)、指令以及數(shù)據(jù)是如何尋址的(尋址方式)以及兩種典型指令系統(tǒng)(CISC和RISC)。



深入理解計(jì)算機(jī)系統(tǒng)-CAEer視角(上)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
枣强县| 荥经县| 乐昌市| 新闻| 皋兰县| 同仁县| 景德镇市| 南木林县| 长丰县| 安图县| 周宁县| 朝阳区| 奉节县| 夏河县| 昌图县| 胶州市| 阜康市| 二连浩特市| 博白县| 皮山县| 绩溪县| 宝鸡市| 永寿县| 张掖市| 黎平县| 临武县| 日照市| 伊川县| 徐水县| 崇阳县| 昌吉市| 吉木乃县| 乐都县| 花莲市| 淄博市| 鹤壁市| 韩城市| 图木舒克市| 潍坊市| 东兰县| 石屏县|