關(guān)于我們
書單推薦
新書推薦
|
計(jì)算機(jī)底層的秘密 讀者對(duì)象:適合任何對(duì)計(jì)算機(jī)系統(tǒng)感興趣的同學(xué)、程序員,如果有一定的編程經(jīng)驗(yàn)效果更佳。
本書以圖解的方式通俗易懂的講解計(jì)算機(jī)系統(tǒng)中各項(xiàng)技術(shù)的本質(zhì),包括編程語(yǔ)言的本質(zhì)是什么、操作系統(tǒng)、進(jìn)程線程協(xié)程等的本質(zhì)是什么、到底什么是內(nèi)存、什么是堆區(qū)棧區(qū)、內(nèi)存分配等是怎么一回事、怎樣從晶體管構(gòu)建出CPU、I/O是如何實(shí)現(xiàn)的等等,從根源出發(fā),一步步講解一項(xiàng)技術(shù)到底是怎么來(lái)的,同時(shí)內(nèi)容可視化——輔助大量精心設(shè)計(jì)的插圖,幾乎做到了平均一頁(yè)有一圖,把對(duì)技術(shù)的理解門檻降到最低。
從根源出發(fā),探索計(jì)算機(jī)系統(tǒng)賦予程序員的超能力 像高手那樣,對(duì)每一行代碼產(chǎn)生的影響了如指掌 遇到棘手問(wèn)題時(shí)不再束手無(wú)策,直擊本質(zhì),瞬間化解 發(fā)現(xiàn)CPU、內(nèi)存、程序運(yùn)行、Cache、I/O背后的奧秘 341幅精心設(shè)計(jì)的插圖幫你越讀越輕松 前言 本書源自筆者的兩個(gè)疑問(wèn):我的代碼看上去能正常運(yùn)行,可這是為什么呢?計(jì)算機(jī)在執(zhí)行我寫的代碼時(shí)在底層發(fā)生了什么? 現(xiàn)代計(jì)算機(jī)系統(tǒng)的結(jié)構(gòu)就像一個(gè)漢堡包一樣,實(shí)際上是被層層抽象過(guò)的,程序員在最上層用高級(jí)語(yǔ)言編寫代碼時(shí)根本不用關(guān)心底層細(xì)節(jié),這極大地提高了開發(fā)效率,但有時(shí)遇到一些較為棘手的問(wèn)題,很多人往往束手無(wú)策,這其中大部分情況是因?yàn)閷?duì)底層了解不夠而導(dǎo)致的,我們有時(shí)甚至都不能理解產(chǎn)生的問(wèn)題本身,更何談解決問(wèn)題呢? 這些看上去很難解決的問(wèn)題在那些編程高手眼里往往不值一提,他們幾乎能脫口而出直指本質(zhì),你一兩天都搞不定的問(wèn)題在這些編程高手那里可能會(huì)被瞬間解決掉,因?yàn)樗麄儗?duì)自己寫下的每一行代碼到底會(huì)對(duì)計(jì)算機(jī)系統(tǒng)產(chǎn)生什么樣的影響了如指掌,如他們非常清楚地知道分配一塊內(nèi)存在底層發(fā)生的一系列故事等。英文中有一個(gè)詞很形象—— mental model (心智模型),本書更多地為你揭示那些編程高手的心智模型和計(jì)算機(jī)系統(tǒng) 底層的奧秘。 在講解方式上,首先筆者認(rèn)為內(nèi)容可視化非常重要,一圖抵千言,因此本書中有多達(dá)341張圖,以圖解的方式來(lái)講解所涉及的內(nèi)容;其次內(nèi)容的可讀性也很重要,本書會(huì) 以通俗易懂的方式從概念的起源開始講解,不僅告訴你是什么、為什么,還會(huì)告訴你這是怎么來(lái)的,把對(duì)內(nèi)容閱讀理解的門檻降到最低。 當(dāng)然,除了上述較為“功利”的目的,筆者認(rèn)為有趣的東西還是值得了解一下的,計(jì)算機(jī)系統(tǒng)其實(shí)就是這樣一個(gè)很有趣的東西,如果你不這么認(rèn)為的話,那么很可能是你 還不夠了解它。計(jì)算機(jī)系統(tǒng)中的許多設(shè)計(jì)是如此的有趣,即便是出于好奇,也應(yīng)該去了 解一下,就像 Linus 所說(shuō)的那樣——Just for fun !
本書配套資料 一款操作系統(tǒng)發(fā)布后往往需要打補(bǔ)丁、定時(shí)升級(jí),而一本書的出版往往與之類似,由于筆者能力有限,因此在本書出版后可能也需要打補(bǔ)丁,在微信公眾號(hào)“碼農(nóng)的荒島求生”后臺(tái)回復(fù)“補(bǔ)丁”二字可獲取筆者關(guān)于本書相關(guān)話題的擴(kuò)展內(nèi)容,相信這些內(nèi)容 可以更好地幫助讀者理解本書。
路線圖 本書分為6章: ● 第1章關(guān)注編程語(yǔ)言,重點(diǎn)闡述到底什么是編程語(yǔ)言、編譯器的工作原理,以及如何從代碼生成最終的可執(zhí)行程序。 ● 第2章重點(diǎn)講解程序運(yùn)行起來(lái)后,也就是運(yùn)行時(shí)的奧秘,包括程序到底是以什么樣的形式運(yùn)行起來(lái)的,操作系統(tǒng)、進(jìn)程、線程、協(xié)程到底是什么,我們?yōu)槭裁葱枰私膺@些概念,回調(diào)函數(shù)、同步、異步、阻塞、非阻塞又是怎么一回事,這些又能賦予程序員什么樣的能力等。 ● 第3章將帶你認(rèn)識(shí)內(nèi)存。程序的運(yùn)行離不開內(nèi)存,因此我們要了解內(nèi)存的本質(zhì)是什么,到底什么是指針,為什么會(huì)有堆區(qū)、棧區(qū),函數(shù)調(diào)用的實(shí)現(xiàn)原理是什么,申請(qǐng)內(nèi)存時(shí)底層到底發(fā)生了什么,該怎樣實(shí)現(xiàn)一個(gè)自己的malloc內(nèi)存分配器等。 ● 第4章介紹計(jì)算機(jī)系統(tǒng)中最重要的CPU,CPU的實(shí)現(xiàn)原理是什么,怎樣一步步打造出CPU,CPU是如何認(rèn)識(shí)數(shù)字的,CPU空閑時(shí)在干什么,以及CPU是如何演變進(jìn)化的,為什么會(huì)出現(xiàn)復(fù)雜指令集及精簡(jiǎn)指令集,如何利用CPU與棧的組合實(shí)現(xiàn)函數(shù)調(diào)用、中斷處理、線程切換及系統(tǒng)調(diào)用等機(jī)制。 ● 第5章講解計(jì)算機(jī)系統(tǒng)中的cache,為什么需要cache,以及程序員該如何編 寫出對(duì)cache 友好的代碼。 ● 第6章關(guān)注I/O,計(jì)算機(jī)系統(tǒng)是如何實(shí)現(xiàn)I/O的,程序員調(diào)用read函數(shù)時(shí)在底層是如何一步步讀取到文件內(nèi)容的,程序員該如何高效處理I/O等。
勘誤 由于筆者水平有限,書中難免會(huì)有疏漏之處,懇請(qǐng)廣大讀者批評(píng)指正。 在微信公眾號(hào)“碼農(nóng)的荒島求生”底部菜單欄中有一項(xiàng)關(guān)于本書勘誤的菜單入口,讀者可通過(guò)此渠道查看本書的bug或者反饋問(wèn)題。 致謝 首先感謝微信公眾號(hào)“碼農(nóng)的荒島求生”的忠實(shí)讀者,是你們讓我一直堅(jiān)持到現(xiàn)在,是你們讓我能感受到自己做的事情是有價(jià)值的,是你們讓本書出版成為可能。 其次特別感謝我的愛人,是你的鼓勵(lì)讓我踏上了寫作之路,在此之前我從沒想過(guò)自己此生會(huì)與寫作有什么關(guān)聯(lián),是你讓我發(fā)現(xiàn)了全新的自己,這無(wú)異于重生。 最后感謝我的父母,是你們的辛苦付出讓我遠(yuǎn)離生活瑣事。“當(dāng)你輕裝上陣時(shí)必定 有人為你負(fù)重前行”,我無(wú)以為報(bào),謹(jǐn)將此書獻(xiàn)給你們。
陸小風(fēng)(@碼農(nóng)的荒島求生),碩士畢業(yè)于北京航空航天大學(xué)計(jì)算機(jī)學(xué)院,先后就職于VMware和京東,具有多年軟件系統(tǒng)研發(fā)經(jīng)驗(yàn),擅長(zhǎng)用通俗易懂的語(yǔ)言講解計(jì)算機(jī)技術(shù)。
第 1 章 從編程語(yǔ)言到可執(zhí)行程序,這是怎么一回事 / 1
1.1 假如你來(lái)發(fā)明編程語(yǔ)言 / 2 1.1.1 創(chuàng)世紀(jì): CPU 是個(gè)聰明的笨蛋 / 3 1.1.2 匯編語(yǔ)言出現(xiàn)了 / 3 1.1.3 底層的細(xì)節(jié) vs 高層的抽象 / 4 1.1.4 套路滿滿:高級(jí)編程語(yǔ)言的雛形 / 6 1.1.5 《盜夢(mèng)空間》與遞歸:代碼的本質(zhì) / 7 1.1.6 讓計(jì)算機(jī)理解遞歸 / 9 1.1.7 優(yōu)秀的翻譯官:編譯器 / 9 1.1.8 解釋型語(yǔ)言的誕生 / 10 1.2 編譯器是如何工作的 / 12 1.2.1 編譯器就是一個(gè)普通程序,沒什么大不了的 / 12 1.2.2 提取出每一個(gè)符號(hào) / 13 1.2.3 token 想表達(dá)什么含義 / 14 1.2.4 語(yǔ)法樹是不是合理的 / 14 1.2.5 根據(jù)語(yǔ)法樹生成中間代碼 / 15 1.2.6 代碼生成 / 15 1.3 鏈接器不能說(shuō)的秘密 / 16 1.3.1 鏈接器是如何工作的 / 17 1.3.2 符號(hào)決議:供給與需求 / 18 1.3.3 靜態(tài)庫(kù)、動(dòng)態(tài)庫(kù)與可執(zhí)行文件 / 20 1.3.4 動(dòng)態(tài)庫(kù)有哪些優(yōu)勢(shì)及劣勢(shì) / 25 1.3.5 重定位:確定符號(hào)運(yùn)行時(shí)地址 / 27 1.3.6 虛擬內(nèi)存與程序內(nèi)存布局 / 29 1.4 為什么抽象在計(jì)算機(jī)科學(xué)中如此重要 / 32 1.4.1 編程與抽象 / 32 1.4.2 系統(tǒng)設(shè)計(jì)與抽象 / 33 1.5 總結(jié) / 34 第 2 章 程序運(yùn)行起來(lái)了,可我對(duì)其一無(wú)所知 / 35 2.1 從根源上理解操作系統(tǒng)、進(jìn)程與線程 / 36 2.1.1 一切要從 CPU 說(shuō)起 / 36 2.1.2 從 CPU 到操作系統(tǒng) / 37 2.1.3 進(jìn)程很好,但還不夠方便 / 40 2.1.4 從進(jìn)程演變到線程 / 41 2.1.5 多線程與內(nèi)存布局 / 44 2.1.6 線程的使用場(chǎng)景 / 44 2.1.7 線程池是如何工作的 / 45 2.1.8 線程池中線程的數(shù)量 / 46 2.2 線程間到底共享了哪些進(jìn)程資源 / 47 2.2.1 線程私有資源 / 47 2.2.2 代碼區(qū):任何函數(shù)都可放到線程中執(zhí)行 / 49 2.2.3 數(shù)據(jù)區(qū):任何線程均可訪問(wèn)數(shù)據(jù)區(qū)變量 / 49 2.2.4 堆區(qū):指針是關(guān)鍵 / 50 2.2.5 棧區(qū):公共的私有數(shù)據(jù) / 50 2.2.6 動(dòng)態(tài)鏈接庫(kù)與文件 / 52 2.2.7 線程局部存儲(chǔ): TLS / 53 2.3 線程安全代碼到底是怎么編寫的 / 55 2.3.1 自由與約束 / 55 2.3.2 什么是線程安全 / 56 2.3.3 線程的私有資源與共享資源 / 57 2.3.4 只使用線程私有資源 / 58 2.3.5 線程私有資源 + 函數(shù)參數(shù) / 58 2.3.6 使用全局變量 / 60 2.3.7 線程局部存儲(chǔ) / 61 2.3.8 函數(shù)返回值 / 62 2.3.9 調(diào)用非線程安全代碼 / 63 2.3.10 如何實(shí)現(xiàn)線程安全代碼 / 64 2.4 程序員應(yīng)如何理解協(xié)程 / 65 2.4.1 普通的函數(shù) / 65 2.4.2 從普通函數(shù)到協(xié)程 / 66 2.4.3 協(xié)程的圖形化解釋 / 68 2.4.4 函數(shù)只是協(xié)程的一種特例 / 69 2.4.5 協(xié)程的歷史 / 69 2.4.6 協(xié)程是如何實(shí)現(xiàn)的 / 70 2.5 徹底理解回調(diào)函數(shù) / 71 2.5.1 一切要從這樣的需求說(shuō)起 / 72 2.5.2 為什么需要回調(diào) / 73 2.5.3 異步回調(diào) / 74 2.5.4 異步回調(diào)帶來(lái)新的編程思維 / 75 2.5.5 回調(diào)函數(shù)的定義 / 77 2.5.6 兩種回調(diào)類型 / 78 2.5.7 異步回調(diào)的問(wèn)題:回調(diào)地獄 / 79 2.6 徹底理解同步與異步 / 80 2.6.1 辛苦的程序員 / 80 2.6.2 打電話與發(fā)郵件 / 81 2.6.3 同步調(diào)用 / 83 2.6.4 異步調(diào)用 / 84 2.6.5 同步、異步在網(wǎng)絡(luò)服務(wù)器中的應(yīng)用 / 86 2.7 哦!對(duì)了,還有阻塞與非阻塞 / 91 2.7.1 阻塞與非阻塞 / 92 2.7.2 阻塞的核心問(wèn)題: I/O / 92 2.7.3 非阻塞與異步 I/O / 93 2.7.4 一個(gè)類比:點(diǎn)比薩 / 94 2.7.5 同步與阻塞 / 95 2.7.6 異步與非阻塞 / 96 2.8 融會(huì)貫通:高并發(fā)、高性能服務(wù)器是如何實(shí)現(xiàn)的 / 97 2.8.1 多進(jìn)程 / 97 2.8.2 多線程 / 98 2.8.3 事件循環(huán)與事件驅(qū)動(dòng) / 99 2.8.4 問(wèn)題 1 :事件來(lái)源與 I/O 多路復(fù)用 / 100 2.8.5 問(wèn)題 2:事件循環(huán)與多線程 / 101 2.8.6 咖啡館是如何運(yùn)作的: Reactor 模式 / 102 2.8.7 事件循環(huán)與 I/O / 103 2.8.8 異步與回調(diào)函數(shù) / 103 2.8.9 協(xié)程:以同步的方式進(jìn)行異步編程 / 106 2.8.10 CPU、線程與協(xié)程 / 107 2.9 計(jì)算機(jī)系統(tǒng)漫游:從數(shù)據(jù)、代碼、回調(diào)、閉包到容器、虛擬機(jī) / 108 2.9.1 代碼、數(shù)據(jù)、變量與指針 / 108 2.9.2 回調(diào)函數(shù)與閉包 / 110 2.9.3 容器與虛擬機(jī)技術(shù) / 112 2.10 總結(jié) / 114 第 3 章 底層?就從內(nèi)存這個(gè)儲(chǔ)物柜開始吧 / 115 3.1 內(nèi)存的本質(zhì)、指針及引用 / 116 3.1.1 內(nèi)存的本質(zhì)是什么??jī)?chǔ)物柜、比特、字節(jié)與對(duì)象 / 116 3.1.2 從內(nèi)存到變量:變量意味著什么 / 117 3.1.3 從變量到指針:如何理解指針 / 120 3.1.4 指針的威力與破壞性:能力與責(zé)任 / 122 3.1.5 從指針到引用:隱藏內(nèi)存地址 / 123 3.2 進(jìn)程在內(nèi)存中是什么樣子的 / 124 3.2.1 虛擬內(nèi)存:眼見未必為實(shí) / 125 3.2.2 頁(yè)與頁(yè)表:從虛幻到現(xiàn)實(shí) / 125 3.3 棧區(qū):函數(shù)調(diào)用是如何實(shí)現(xiàn)的 / 127 3.3.1 程序員的好幫手:函數(shù) / 128 3.3.2 函數(shù)調(diào)用的活動(dòng)軌跡:棧 / 128 3.3.3 棧幀與棧區(qū):以宏觀的角度看 / 130 3.3.4 函數(shù)跳轉(zhuǎn)與返回是如何實(shí)現(xiàn)的 / 131 3.3.5 參數(shù)傳遞與返回值是如何實(shí)現(xiàn)的 / 133 3.3.6 局部變量在哪里 / 134 3.3.7 寄存器的保存與恢復(fù) / 134 3.3.8 Big Picture:我們?cè)谀睦? / 134 3.4 堆區(qū):內(nèi)存動(dòng)態(tài)分配是如何實(shí)現(xiàn)的 / 136 3.4.1 為什么需要堆區(qū) / 136 3.4.2 自己動(dòng)手實(shí)現(xiàn)一個(gè) malloc 內(nèi)存分配器 / 137 3.4.3 從停車場(chǎng)到內(nèi)存管理 / 138 3.4.4 管理空閑內(nèi)存塊 / 139 3.4.5 跟蹤內(nèi)存分配狀態(tài) / 141 3.4.6 怎樣選擇空閑內(nèi)存塊:分配策略 / 142 3.4.7 分配內(nèi)存 / 144 3.4.8 釋放內(nèi)存 / 146 3.4.9 高效合并空閑內(nèi)存塊 / 149 3.5 申請(qǐng)內(nèi)存時(shí)底層發(fā)生了什么 / 150 3.5.1 三界與 CPU 運(yùn)行狀態(tài) / 150 3.5.2 內(nèi)核態(tài)與用戶態(tài) / 151 3.5.3 傳送門:系統(tǒng)調(diào)用 / 152 3.5.4 標(biāo)準(zhǔn)庫(kù):屏蔽系統(tǒng)差異 / 153 3.5.5 堆區(qū)內(nèi)存不夠了怎么辦 / 154 3.5.6 向操作系統(tǒng)申請(qǐng)內(nèi)存: brk / 155 3.5.7 冰山之下:虛擬內(nèi)存才是終極 BOSS / 156 3.5.8 關(guān)于分配內(nèi)存完整的故事 / 156 3.6 高性能服務(wù)器內(nèi)存池是如何實(shí)現(xiàn)的 / 157 3.6.1 內(nèi)存池 vs 通用內(nèi)存分配器 / 158 3.6.2 內(nèi)存池技術(shù)原理 / 158 3.6.3 實(shí)現(xiàn)一個(gè)極簡(jiǎn)內(nèi)存池 / 159 3.6.4 實(shí)現(xiàn)一個(gè)稍復(fù)雜的內(nèi)存池 / 160 3.6.5 內(nèi)存池的線程安全問(wèn)題 / 161 3.7 與內(nèi)存相關(guān)的經(jīng)典 bug / 162 3.7.1 返回指向局部變量的指針 / 163 3.7.2 錯(cuò)誤地理解指針運(yùn)算 / 163 3.7.3 解引用有問(wèn)題的指針 / 164 3.7.4 讀取未被初始化的內(nèi)存 / 165 3.7.5 引用已被釋放的內(nèi)存 / 166 3.7.6 數(shù)組下標(biāo)是從 0 開始的 / 167 3.7.7 棧溢出 / 167 3.7.8 內(nèi)存泄漏 / 168 3.8 為什么 SSD 不能被當(dāng)成內(nèi)存用 / 169 3.8.1 內(nèi)存讀寫與硬盤讀寫的區(qū)別 / 169 3.8.2 虛擬內(nèi)存的限制 / 171 3.8.3 SSD 的使用壽命問(wèn)題 / 171 3.9 總結(jié) / 171 第 4 章 從晶體管到 CPU,誰(shuí)能比我更重要 / 173 4.1 你管這破玩意叫 CPU / 174 4.1.1 偉大的發(fā)明 / 174 4.1.2 與、或、非: AND 、OR、NOT / 174 4.1.3 道生一、一生二、二生三、三生萬(wàn)物 / 175 4.1.4 計(jì)算能力是怎么來(lái)的 / 175 4.1.5 神奇的記憶能力 / 176 4.1.6 寄存器與內(nèi)存的誕生 / 177 4.1.7 硬件還是軟件?通用設(shè)備 / 178 4.1.8 硬件的基本功:機(jī)器指令 / 179 4.1.9 軟件與硬件的接口:指令集 / 179 4.1.10 指揮家,讓我們演奏一曲
你還可能感興趣
我要評(píng)論
|