www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 單片機(jī) > 小林coding
[導(dǎo)讀]大家好,我是小林。很早之前分享過(guò)我學(xué)計(jì)算機(jī)網(wǎng)絡(luò)和操作系統(tǒng)的心得,詳見(jiàn):怎么學(xué)操作系統(tǒng)和計(jì)算機(jī)網(wǎng)絡(luò)呀?期間一直有不少讀者問(wèn)計(jì)算機(jī)組成原理怎么學(xué),大部分人覺(jué)得這個(gè)學(xué)科跟硬件有關(guān)系就非常怕。計(jì)算組成原理確實(shí)是分為兩個(gè)方向,一個(gè)是硬件電路的,一個(gè)是軟件程序的。我自己本身是干開(kāi)發(fā)的,所以我...

大家好,我是小林。很早之前分享過(guò)我學(xué)計(jì)算機(jī)網(wǎng)絡(luò)和操作系統(tǒng)的心得,詳見(jiàn):怎么學(xué)操作系統(tǒng)和計(jì)算機(jī)網(wǎng)絡(luò)呀?

期間一直有不少讀者問(wèn)計(jì)算機(jī)組成原理怎么學(xué),大部分人覺(jué)得這個(gè)學(xué)科跟硬件有關(guān)系就非常怕。

計(jì)算組成原理確實(shí)是分為兩個(gè)方向,一個(gè)是硬件電路的,一個(gè)是軟件程序的。

我自己本身是干開(kāi)發(fā)的,所以我這次分享的機(jī)組資料是跟軟化程序有關(guān)的,不會(huì)涉及到硬件電路的東西,即使你不會(huì)數(shù)字電路、微機(jī)原理也是可以直接學(xué)習(xí)的。

好了,不多廢話(huà),直接開(kāi)車(chē)了!

學(xué)計(jì)組有什么用?

我猜應(yīng)該很多人都有這樣的困惑,就是覺(jué)得學(xué)計(jì)組有什么用?感覺(jué)實(shí)際工作過(guò)程中用不到,感覺(jué)理論學(xué)了個(gè)寂寞。

這個(gè)困惑很正常,因?yàn)閷W(xué)計(jì)組這東西主要是為了搞懂計(jì)算機(jī)是如何工作的,計(jì)算機(jī)怎么工作的都是被前輩們實(shí)現(xiàn)好的,我們一般也不會(huì)參與到造計(jì)算機(jī)這種工作中。

但是學(xué)了計(jì)組后,你能看到的視角是和別人不一樣的,而這個(gè)不一樣的視角就能在一些關(guān)鍵的問(wèn)題上得到突破。

我這里舉個(gè)簡(jiǎn)單例子,你覺(jué)得下面這兩個(gè)?for?循環(huán)哪個(gè)效率會(huì)更高呢?為什么會(huì)更高呢?

這個(gè)問(wèn)題的關(guān)鍵在于,大家知不知道 CPU Cache 這個(gè)東西。

我自己曾經(jīng)在還沒(méi)有學(xué)計(jì)組的時(shí)候,只覺(jué)得存儲(chǔ)設(shè)備就是我們常見(jiàn)的內(nèi)存和硬盤(pán),學(xué)了后我才發(fā)現(xiàn)還有 CPU Cache 這個(gè)東西,而能不能充分利用到這個(gè)東西,就決定你程序的性能。

CPU Cache 是 CPU 內(nèi)部的一個(gè)緩存,它的讀寫(xiě)速度遠(yuǎn)高于內(nèi)存,所以它充當(dāng)內(nèi)存的緩存角色,當(dāng) CPU 要訪問(wèn)的數(shù)據(jù)命中了 CPU Cache,就不用去從內(nèi)存上找數(shù)據(jù),就像 MySQL 和 Redis 之間的關(guān)系。

CPU Cache 一般會(huì)分為三層,分別是 L1 Cache、L2 Cache、L3 Cache ,其中 L1 Cache 是各個(gè) CPU 核心獨(dú)立的,剩下的 L2 Cache、L3 Cache 是各個(gè)核心共享的。

CPU Cache 的數(shù)據(jù)是從內(nèi)存中讀取過(guò)來(lái)的,它是以一小塊一小塊讀取數(shù)據(jù)的,而不是按照單個(gè)數(shù)組元素來(lái)讀取數(shù)據(jù)的,在 CPU Cache 中的,這樣一小塊一小塊的數(shù)據(jù),稱(chēng)為 Cache Line(緩存塊)。?

如果 L1 Cache Line 大小是 64 字節(jié),也就意味著 L1 Cache 一次載入數(shù)據(jù)的大小是 64 字節(jié)。

比如,有一個(gè) int array[100] 的數(shù)組,當(dāng)載入 array[0] 時(shí),由于這個(gè)數(shù)組元素的大小在內(nèi)存只占 4 字節(jié),不足 64 字節(jié),CPU 就會(huì)順序加載數(shù)組元素到 array[15] ,意味著 array[0]~array[15] 數(shù)組元素都會(huì) 被緩存在 CPU Cache 中了,因此當(dāng)下次訪問(wèn)這些數(shù)組元素時(shí),會(huì)直接從 CPU Cache 讀取,而不用再?gòu)膬?nèi) 存中讀取,大大提高了 CPU 讀取數(shù)據(jù)的性能。

CPU Cache 的概念簡(jiǎn)單介紹完了,再來(lái)說(shuō)說(shuō)剛才的 for 循環(huán)問(wèn)題。

我直接說(shuō)答案:形式一?array[i][j]?執(zhí)行時(shí)間比形式二?array[j][i]?快好幾倍。

之所以有這么大的差距,是因?yàn)槎S數(shù)組?array?所占用的內(nèi)存是連續(xù)的,比如長(zhǎng)度?N?的指是?2?的話(huà),那么內(nèi)存中的數(shù)組元素的布局順序是這樣的:

形式一用?array[i][j]?訪問(wèn)數(shù)組元素的順序,正是和內(nèi)存中數(shù)組元素存放的順序一致。當(dāng) CPU 訪問(wèn)?array[0][0]?時(shí),由于該數(shù)據(jù)不在 Cache 中,于是會(huì)「順序」把跟隨其后的 3 個(gè)元素從內(nèi)存中加載到 CPU Cache,這樣當(dāng) CPU 訪問(wèn)后面的 3 個(gè)數(shù)組元素時(shí),就能在 CPU Cache 中成功地找到數(shù)據(jù),這意味著緩存命中率很高,緩存命中的數(shù)據(jù)不需要訪問(wèn)內(nèi)存,這便大大提高了代碼的性能。

而如果用形式二的?array[j][i]?來(lái)訪問(wèn),則訪問(wèn)的順序就是:

你可以看到,訪問(wèn)的方式跳躍式的,而不是順序的,那么如果 N 的數(shù)值很大,那么操作?array[j][i]?時(shí),是沒(méi)辦法把?array[j 1][i]?也讀入到 CPU Cache 中的,既然?array[j 1][i]沒(méi)有讀取到 CPU Cache,那么就需要從內(nèi)存讀取該數(shù)據(jù)元素了。很明顯,這種不連續(xù)性、跳躍式訪問(wèn)數(shù)據(jù)元素的方式,可能不能充分利用到了 CPU Cache 的特性,從而代碼的性能不高。

那訪問(wèn)?array[0][0]?元素時(shí),CPU 具體會(huì)一次從內(nèi)存中加載多少元素到 CPU Cache 呢?這個(gè)問(wèn)題,在前面我們也提到過(guò),這跟 CPU Cache Line 有關(guān),它表示?CPU Cache 一次性能加載數(shù)據(jù)的大小,可以在 Linux 里通過(guò)?coherency_line_size?配置查看 它的大小,通常是 64 個(gè)字節(jié)。

也就是說(shuō),當(dāng) CPU 訪問(wèn)內(nèi)存數(shù)據(jù)時(shí),如果數(shù)據(jù)不在 CPU Cache 中,則會(huì)一次性會(huì)連續(xù)加載 64 字節(jié)大小的數(shù)據(jù)到 CPU Cache,那么當(dāng)訪問(wèn)?array[0][0]?時(shí),由于該元素不足 64 字節(jié),于是就會(huì)往后順序讀取?array[0][0]~array[0][15]?到 CPU Cache 中。順序訪問(wèn)的?array[i][j]?因?yàn)槔昧诉@一特點(diǎn),所以就會(huì)比跳躍式訪問(wèn)的?array[j][i]?要快。

因此,遇到這種遍歷數(shù)組的情況時(shí),按照內(nèi)存布局順序訪問(wèn),將可以有效的利用 CPU Cache 帶來(lái)的好處,這樣我們代碼的性能就會(huì)得到很大的提升,

CPU Cache 的內(nèi)容遠(yuǎn)不止于我說(shuō)的這些,還有緩存一致性協(xié)議、偽共享、write through 和 write back 的方式等,這些都是非常重要的知識(shí)。

計(jì)組怎么學(xué)?

計(jì)算機(jī)組成原理會(huì)有兩個(gè)方向深入的點(diǎn),一個(gè)是面向硬件電路,一個(gè)是面向軟件開(kāi)發(fā)的。

我自己本身就是個(gè)開(kāi)發(fā)者,所以下面分享的學(xué)習(xí)資料都是偏向軟件開(kāi)發(fā)點(diǎn)計(jì)組原理,對(duì)于硬件電路這塊的資料不做介紹,因此不會(huì)涉及到數(shù)字電路、微機(jī)原理等這些課程。

計(jì)算機(jī)組成原理主要有四大塊內(nèi)容。

第一大塊,計(jì)算機(jī)的基本組成,主要包含:

  • 硬件設(shè)備組成:CPU、主板、內(nèi)存、硬盤(pán)、顯示器等;

  • 馮諾依曼體系結(jié)構(gòu):運(yùn)算器、控制器、存儲(chǔ)器、輸入設(shè)備、輸出設(shè)備;

  • 計(jì)算機(jī)性能:CPU 主頻、響應(yīng)時(shí)間、吞吐率

第二塊,計(jì)算機(jī)的指令和運(yùn)算,主要包含:

  • 計(jì)算機(jī)指令:機(jī)器碼(編譯 -> 匯編 -> 機(jī)器碼、指令格式和跳轉(zhuǎn)、函數(shù)調(diào)用和程序棧)、程序的編譯、鏈接、裝載和執(zhí)行;

  • 計(jì)算機(jī)運(yùn)算:二進(jìn)制編碼(整數(shù)、反碼、補(bǔ)碼、浮點(diǎn)數(shù)、定點(diǎn)數(shù))、數(shù)字電路(門(mén)電路、加法器、乘法器);

第三塊,處理器設(shè)計(jì),主要包含:

  • CPU:建立數(shù)據(jù)通路、面向流水線(xiàn)和設(shè)計(jì)、控制冒險(xiǎn)和數(shù)據(jù)冒險(xiǎn)、分支預(yù)測(cè)、異常和中斷、并行計(jì)算

第四塊,存儲(chǔ)器和 I/O 系統(tǒng),主要包含:

  • 存儲(chǔ)器的層次結(jié)構(gòu):SRAM 存儲(chǔ)技術(shù)、寄存器、CPU 高速緩存、內(nèi)存、固態(tài)硬盤(pán)、機(jī)械硬盤(pán);

  • 存儲(chǔ)器和 I/O 系統(tǒng):虛擬內(nèi)存、CPU和內(nèi)存的通信、DMA技術(shù)、訪問(wèn)輸入輸出設(shè)備;

  • CPU 高速緩存:局部性原理、緩存一致性協(xié)議、偽共享問(wèn)題、write through 和 write back;

  • 虛擬存儲(chǔ):缺頁(yè)異常、TLB 加速地址轉(zhuǎn)化、MMU 虛擬地址和物理地址轉(zhuǎn)換;

其中第一、第二、第四是對(duì)開(kāi)發(fā)者而言是比較重要的內(nèi)容,而第三部分處理器的設(shè)計(jì)如果沒(méi)時(shí)間可以先不用去了解。

別看這些內(nèi)容很多,就被嚇到了。

建議你在學(xué)習(xí)計(jì)算機(jī)原理的時(shí)候,心里要帶著一個(gè)核心的問(wèn)題去學(xué)習(xí):「我們寫(xiě)的程序是如何在計(jì)算機(jī)里跑起來(lái)的?

帶著這個(gè)問(wèn)題去學(xué)你就不知覺(jué)的會(huì)把知識(shí)點(diǎn)給串起來(lái)了,一層層的深入下去,一個(gè)知識(shí)點(diǎn)一個(gè)知識(shí)展開(kāi)。

如果把這個(gè)問(wèn)題能解釋出來(lái),那你對(duì)計(jì)算機(jī)組成原理有了一定的認(rèn)識(shí)了。

計(jì)組 - 入門(mén)學(xué)習(xí)

計(jì)算機(jī)科學(xué)速成課

先極力推薦 b 站的《計(jì)算機(jī)科學(xué)速成課》,這個(gè)課程是國(guó)外錄制的,內(nèi)容真的是好,視頻的動(dòng)畫(huà)很精美,講課的時(shí)候不會(huì)很死板,反正就是不看后悔、相見(jiàn)很晚系列。

對(duì)于入門(mén)計(jì)算機(jī)組成,可以先看前 10 個(gè)視頻,看完這 10 個(gè)視頻也就不到 2 個(gè)小時(shí),看完前 10 個(gè)視頻對(duì)計(jì)算機(jī)的工作方式就有一個(gè)基本的了解了。

看完前 10 個(gè)視頻就可以開(kāi)始看書(shū)了。

《計(jì)算機(jī)是怎么樣跑起來(lái)》和《程序是怎么跑起來(lái)的》
講真,不太建議小白一上來(lái)就看那些厚的不行的計(jì)算機(jī)組成原理的黑皮書(shū),這些書(shū)是經(jīng)典的沒(méi)錯(cuò),也正是由于它們是經(jīng)典的,所以這些書(shū)的知識(shí)體系很全、很多、很厚。

但是這樣很容易讓初學(xué)者迷失在里頭,可能剛興致勃勃看幾十頁(yè)就放棄了,于是這些厚的不行的書(shū)就成為了你們的墊書(shū)神器,知識(shí)沒(méi)學(xué)多少,頸椎病倒是治好了。

對(duì)于初學(xué)者,我推薦兩本書(shū)《計(jì)算機(jī)是怎么樣跑起來(lái)》和《程序是怎么跑起來(lái)的》,這兩本很薄而且圖文并茂,作者都是用大白話(huà)的方式來(lái)闡述知識(shí),這點(diǎn)對(duì)初學(xué)者非常友好。

這兩本不用 1 個(gè)月就能看完,因?yàn)樵诳催@兩本書(shū)的時(shí)候,你會(huì)看的很順暢,相比學(xué)習(xí)的心態(tài),你更多的是會(huì)帶著「好奇心」的心態(tài)去讀。

其中《程序是怎么跑起來(lái)的》是一個(gè)「微縮版本」的計(jì)算機(jī)組成原理,你可以只選擇看這一本。

從這本書(shū)的名字也可以知道,它是從計(jì)算機(jī)是怎么運(yùn)行程序的視角來(lái)講的,然后把涉及到的計(jì)算機(jī)硬件和它們之間是如何協(xié)作的一點(diǎn)一點(diǎn)的給大家?guī)С鰜?lái),讓大家能瞬間明白這些計(jì)算機(jī)硬件的作用。

這本僅僅是入門(mén)級(jí)別,主要的作用是讓初學(xué)者明白計(jì)算機(jī)組成原理這門(mén)課是學(xué)什么的,以及梳理主要的知識(shí)體系,用了這本書(shū)的概念后,在去深入計(jì)算機(jī)組成的時(shí)候,就不會(huì)雨里霧里的。

《編碼》

編碼:隱匿在計(jì)算機(jī)軟硬件背后的語(yǔ)言》這本書(shū)也很不錯(cuò),是本科普類(lèi)的書(shū),非常適合非科班的同學(xué)。

主要講是計(jì)算機(jī)工作的原理(二進(jìn)制編碼、加減法運(yùn)算、計(jì)算機(jī)部件、浮點(diǎn)數(shù)定點(diǎn)數(shù)、處理器等),也就是跟計(jì)組息息相關(guān)的知識(shí),它的內(nèi)容很有趣味性,并不想教科書(shū)那樣晦澀難懂,絲毫不會(huì)讓你感到生硬,讀起來(lái)很暢快。

計(jì)組 - 深入學(xué)習(xí)

《計(jì)算機(jī)組成與設(shè)計(jì):硬件 / 軟件接口》
想要深入學(xué)習(xí)計(jì)算機(jī)組成原理的同學(xué),我首先推薦《計(jì)算機(jī)組成與設(shè)計(jì):硬件 / 軟件接口》這本書(shū),

這本書(shū)確實(shí)很厚,差不多 500 多頁(yè),但是書(shū)從來(lái)沒(méi)有人規(guī)定一定要從頭讀到尾,一頁(yè)頁(yè)的讀的。重要的不是看完一本書(shū),而是從書(shū)上學(xué)到多少,解決了什么問(wèn)題。

大家可以挑這幾個(gè)章節(jié)看,跟開(kāi)發(fā)者關(guān)系比較大的章節(jié):

  • 第一章:計(jì)算機(jī)抽象以及相關(guān)技術(shù),這個(gè)章節(jié)主要是介紹了計(jì)算機(jī)組成的思想,可以簡(jiǎn)單快讀看,不用重點(diǎn)讀;

  • 第二章:指令,大體上講的是計(jì)算機(jī)是如果識(shí)別和運(yùn)行指令的,以及代碼到指令的過(guò)程;

  • 第三章:計(jì)算機(jī)的算數(shù)運(yùn)算,介紹的是計(jì)算機(jī)是如何進(jìn)行加減乘除法的,以及浮點(diǎn)數(shù)的運(yùn)算;

  • 第五章:層次化存儲(chǔ),講的是計(jì)算機(jī)的存儲(chǔ)層次結(jié)構(gòu),而且重點(diǎn)講的是 CPU Cahe。

計(jì)算機(jī)組成原理視頻課程
看書(shū)覺(jué)得很累,也可以結(jié)合視頻一起看,這里推薦哈工大的《計(jì)算機(jī)組成原理》視頻,在 b 站就可以直接看,大家自己去搜索就可以。

看書(shū)和看視頻可以相互結(jié)合的,比如你看視頻看了計(jì)算機(jī)指令的內(nèi)容,然后你可以不用繼續(xù)往下看,可以回到一本書(shū)上,看書(shū)上對(duì)應(yīng)這個(gè)章節(jié)的內(nèi)容,這是個(gè)很好的學(xué)習(xí)方法,視頻和書(shū)籍相輔相成。

你要是覺(jué)得哈工大的計(jì)組課程太難,你可以看王道考研的計(jì)算機(jī)組成原理的視頻課程,同樣 b 站就可以看。

這個(gè)視頻雖然是針對(duì)考研的,但是也是可以作為學(xué)習(xí)計(jì)組的資料,講的內(nèi)容不會(huì)太深,適合你快速建立計(jì)算機(jī)組成原理體系,和梳理計(jì)組知識(shí)的脈絡(luò)。

《深入理解計(jì)算系統(tǒng)》
另外,在推薦一本《深入理解計(jì)算系統(tǒng)》這本書(shū),人稱(chēng) CSAPP。

可能大家以為這本書(shū)是講操作系統(tǒng)的,我最開(kāi)始也以為是這樣。后面當(dāng)我開(kāi)始啃這本書(shū)的時(shí)候,發(fā)現(xiàn)我大錯(cuò)特錯(cuò),它遠(yuǎn)不止我想的那樣。

這本書(shū)是從程序員的角度學(xué)習(xí)計(jì)算機(jī)系統(tǒng)是如何工作的,通過(guò)描述程序是如何映射到計(jì)算機(jī)系統(tǒng)上,程序是如何執(zhí)行的,以及程序效率低下的原因,這樣的方式可以讓大家能更好的知道「程序與計(jì)算機(jī)系統(tǒng)」的關(guān)系。

CSAPP 涵蓋的內(nèi)容非常多,有計(jì)算機(jī)組成 操作系統(tǒng) 匯編 C語(yǔ)言 Linux系統(tǒng)編程,涉獵的領(lǐng)域比較多,是一本綜合性的書(shū),更是一本程序員修煉內(nèi)功的指引書(shū)。

CSAPP 主要包括以下內(nèi)容:

  • 信息表示(如何使用二進(jìn)制表示整型、浮點(diǎn)數(shù)等);

  • C 和匯編語(yǔ)言的學(xué)習(xí)(通過(guò)匯編語(yǔ)言更深入地理解C語(yǔ)言是什么);

  • 計(jì)算機(jī)體系結(jié)構(gòu)(存儲(chǔ)層次結(jié)構(gòu)、局部性原理、處理器體系結(jié)構(gòu));

  • 編譯鏈接(C語(yǔ)言如何從文本變成可執(zhí)行文件、靜態(tài)鏈接、動(dòng)態(tài)鏈接);

  • 操作系統(tǒng)的使用(異常控制流、虛擬內(nèi)存、多個(gè)系統(tǒng)調(diào)用介紹);

  • 網(wǎng)絡(luò)及并發(fā)編程(并發(fā)的基本概念、網(wǎng)絡(luò)相關(guān)的系統(tǒng)調(diào)用的介紹)。

你會(huì)發(fā)現(xiàn)有部分內(nèi)容和《計(jì)算機(jī)組成與設(shè)計(jì):硬件 / 軟件接口》這本書(shū)重合了,重合的部分就是重中之重的計(jì)算機(jī)組成原理知識(shí)了,而且內(nèi)容都是差不多的,你可以看完一本書(shū)的內(nèi)容,然后跳到另外一本看相同章節(jié)的內(nèi)容,多本書(shū)的結(jié)合可以讓我們更加容易理解。

這兩本書(shū)有個(gè)區(qū)別:

  • 《計(jì)算機(jī)組成與設(shè)計(jì):硬件 / 軟件接口》講的指令格式是 RISC 的;

  • 《深入理解計(jì)算系統(tǒng)》講的指令格式是 x86 的;

其他重合的計(jì)組知識(shí)都大同小異。

CSAPP 的視頻課程是國(guó)外老師錄制的,但是在 b 站已經(jīng)有好人幫我們做了中文字幕,看了這視頻,相當(dāng)于在國(guó)外上了一門(mén)計(jì)算機(jī)課的感覺(jué)。

如果你是在校生,有了一定 C 語(yǔ)言基礎(chǔ)后,非常建議你就開(kāi)始看這本書(shū),有精力也可以做做 CSAPP 的 lab。越早開(kāi)始看,你的收益就越大,因?yàn)楫?dāng)計(jì)算機(jī)體系搭建起來(lái)后,你后面再深入每一個(gè)課程的時(shí)候,你會(huì)發(fā)現(xiàn)學(xué)起來(lái)會(huì)比較輕松些。

對(duì)于已經(jīng)工作了,但是計(jì)算機(jī)系統(tǒng)沒(méi)有一個(gè)清晰認(rèn)識(shí)的讀者,也可以從這本書(shū)開(kāi)始一點(diǎn)一點(diǎn)學(xué)起來(lái),這本書(shū)是很厚,但是并不一定要把書(shū)完完看完,每個(gè)章節(jié)的知識(shí)點(diǎn)還是比較獨(dú)立的,有關(guān)硬件的章節(jié)我們可以選擇跳過(guò)。

這就是我學(xué)計(jì)組的心得啦。

沒(méi)學(xué)過(guò)計(jì)組的同學(xué),可以找個(gè)時(shí)間補(bǔ)補(bǔ)了,提高下自己的「內(nèi)功」。

干就完啦!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉