主頁 > 軟體設計 > 《深入理解計算機系統》到底怎樣學?

《深入理解計算機系統》到底怎樣學?

2021-10-28 08:29:40 軟體設計

原文鏈接 :被 CSAPP 虐了

最近兩個周末去圖書館刷 CSAPP 完全停不下來啊,這種看不懂卻還是強忍著痛苦硬逼著自己去看的感覺,真讓我著迷,

image-20211025202910686

這本書從真正意義上讓我體會到了什么叫做看書五分鐘,休息倆小時,

不過大家可千萬別學我,我相信在坐的各位絕對比我牛批,為什么?因為后面我給你推薦了一款神器,那么首先我們先來介紹一下這本書,

image-20211025203724031

這本書總共分成十二個章節,我給你繪制了一個思維導圖,比較簡單明了,

image-20211025225218317

第一章是提綱挈領性質的一章,從一個 hello world 程式來引出 C、引出 UNIX、Linux ,引出 C 語言程式的編譯程序,引出高速快取、系統的硬體組成、存盤結構、虛擬記憶體、網路編程、并發編程,非常 cool,第一章的內容雖然不難理解,卻是能讓人漲自信心的一章,這一章能讓你產生一種激動的心情,因為內容不難,但是卻能夠開拓你的思路,把你的知識體系串聯起來,

第一部分

第二章的內容比較枯燥,我個人認為需要一定的 C 語言基礎,雖然這本書的簡介中說如果你有 Java 基礎的話,,,,,,

image-20211025230317641

還是有點難頂的,所以建議學一波 C ,

別擋我,C 語言我來了,這里推薦兩本 C 語言的書吧,第一本書 《C Primer Plus》 這本書是把 C 語言揉碎了手把手教你,另外《C 程式設計語言》也不錯,

第二章主要講的是計算機中資料的存盤方式,基本的資料型別和各種補碼、反碼的表示方式,總之看這一章如果不了解 C 的話,有點昏昏欲睡(原因是可能不太懂),但實際上第二章寫的很不錯,當你閱讀了本書的第二章之后,也許會發現,你所謂的(懂)只是你的一廂情愿而已,數值系統遠沒有你想象的那么簡單,

第三章是程式的機器級表示,如果你把 C 學的差不多了之后(其實如果單看第二章的話,把 C 語言資料型別惡、運算惡補一下即可),那么恭喜你,接下來你要學習一下匯編了,否則你根本看不懂第三章在說什么(別問我為什么知道的,因為我也看不懂),你可能想知道諸如 pushq、movq、call、popq、ret%rbx、%rdx 等等都是干嘛的,還有匯編是如何撰寫的,而且你還要懂 C 語言,

這么看來這本書根本就不是一本為初學者準備的書,也可以說是初學者的勸退書,

第四章又是一個打開新世界大門的一章,這章會直接從各種電路開始搞起,這 TM 馬上就直接奔硬體了!主要講了 Y86-64 體系、各種門電路、引出計算機流水線的設計,畢竟現代微處理器可以稱得上是人類創造出的最復雜的系統之一,也會給你講解各種指令集的區別,

與這一章節相關的書籍,可以看看《計算機組成與設計:軟體/硬體介面》還有《編碼》這兩本書,都非常好,非常透徹,

這一章也會和你聊聊指令集架構,這些架構和宏觀意義上的應用層架構不一樣,非常復雜,比如下面這個 ARM 架構

image-20211026083152130

這本書是一個值得熟讀 N 遍的一本書,

第五章:優化程式性能,現在普遍意義上提到的各種優化,不論是架構層優化、指令集優化等核心都離不開這一章所介紹的內容,優化的難點在于你需要對系統有充分理解,當然了在你做優化之前首先要保證原始程式功能正確(并且有回歸測驗),否則一切都是徒勞,比如你需要了解現在系統存在的性能瓶頸,才能系統性的進行優化,你才能夠撰寫高效的程式,

撰寫高效程式需要做到下面這幾點:

  • 選擇適當的資料結構和演算法,
  • 撰寫出編譯器能夠有效優化以轉換成可執行代碼的源代碼,
  • 任務拆分,采用并行計算的方式,

第六章:存盤器層次結構,這一章會向你介紹存盤技術的發展,磁盤、主存、高速快取的性能差距到底有多大,然后介紹區域性原理,一項非常強大的快取技術,高速快取讀寫是如何映射的,高速快取不同引數的性能影響,如何撰寫高速快取又好的代碼,存盤器山是個什么概念,以及你會見到封面的插圖,

看這一章的時候強烈建議把 Ulrich Drepper 撰寫的長達 114 頁的經典論文 What Every Programmer Should Know About Memory 看了,

以上就是 CSAPP 的第一部分,第一部分主要介紹了程式和硬體之間的互動關系,

而第二部分則專注于程式和作業系統之間的互動關系,你會學到如何使用作業系統提供的服務來構建系統級程式,

第二部分

第七章:鏈接,我們使用 Linux 的時候,很多情況下會出現很多難以理解的錯誤,其中很多都是鏈接錯誤,鏈接分為靜態鏈接和動態鏈接,我們寫的 C 程式在執行的程序中都會經過鏈接階段,

image-20211026162805480

除了這一章內容之外,大家也可以看一下一本把鏈接講的非常透徹的一本書:《程式員的自我修養 – 鏈接, 裝載與庫》,主要講授代碼指令是如何保存的,庫檔案如何與應用程式代碼靜態鏈接,應用程式如何被裝載到記憶體中并開始運行,動態鏈接如何實作,C/C++運行庫的作業原理,以及作業系統提供的系統服務是如何被呼叫的,非常好的一本國產書,

第八章:例外控制流,世界上不會存在完美運行的程式,任何程式都會出錯,這些錯誤可能是執行緒執行程序中出錯、可能是系統呼叫例外、頁面映射錯誤等等,這一章會向你介紹各種例外出現之后,作業系統是如何處理的,

第九章:虛擬記憶體,虛擬記憶體其實是存盤器層次結構的衍生,至于為什么單獨拿一章來說,因為虛擬記憶體太重要了,這一章會向你介紹為什么我們的計算機記憶體只有 8G(或其他)卻能夠運行自身數倍以上的程式,虛擬記憶體有的時候也是面試官比較愛問的一個點:虛擬記憶體是如何映射的,什么是頁框、頁表諸如此類,

第三部分

第三部分主要介紹程式間的相互通信,主要包括 IO、網路編程和并發編程,

IO 這部分介紹類 Unix 系統下的 I/O 讀寫,主要介紹系統層面的 I/O 介面,

今天互聯網中的大千世界都立足于 TCP/IP 協議之上,Socket 甚至已經成為了網路編程的同義詞,這部分主要向你介紹了網路的變遷,什么客戶端-服務器編程模型、Web 服務器,最后再帶你寫一個 Web 服務器,

網路這部分內容遠比這一章節介紹的復雜,網路這部分內容給大家推薦幾本書:《計算機網路:自頂向下方法》、《TCP/IP 詳解》,《UNIX 網路編程》,

你一定要知道的是 W. Richard Stevens,他的個人網站 http://www.kohala.com/start/

并發這一章節主要介紹了 C 中如何撰寫并發程式,如何榨干 CPU ,讓其發揮峰值性能,

推薦一個網站

讀 csapp 這本書還是需要一定基礎的,而且讀起來不是那么容易(起碼對于我來說是這樣的),

不過,業界還是有一些好資源,能讓你更快的深入這本書,

給大家推薦一個網站,https://fengmuzi2003.gitbook.io/csapp3e/

這個網站可以理解為是 CSAPP 的導讀網站,對每一章都進行了介紹,而且推薦了一些不錯的資源,

比如他分享的深入理解計算機系統的 B 站課程,

image-20211026170441694

看到這里有沒有心潮澎湃的要馬上學起來呢?

還有一些電子書的下載渠道:

image-20211026170730582

CSAPP 不管是中英版本都有一些勘誤,有一些已經改正了,有一些還沒改,大家可以在 http://www.yiligong.org/csapp3e/ 反饋你見到的勘誤,有一些是影響閱讀的,但是有一些是影響理解的,

這里給大家一個小提示,我粗略過了一遍,就拿中文版的《深入理解計算機系統》來說,大家可以看一下最開頭處的印刷時間,然后針對這些勘誤的提出時間進行比較,在印刷之前的很多勘誤已經得到修正了,

也就是說,對于這個網站的使用方法,大家可以從后往前看,

image-20211026171149888

總結

上面只是我對這本書一個粗俗的理解,書我還沒看完,不過我已經有相關 C 語言、匯編語言的學習計劃了,另外,知乎上有一個對 《如何閱讀深入淺出計算機系統》 的一個總結性回答,https://www.zhihu.com/question/20402534/answer/1670374116 我認為還是非常好的,

這個回答里面有練習題的答案,還有學習這本書需要的前置知識,這個回答給我的感覺是答主已經刷過幾遍了,作為過來人的經驗還是值得學習的,

最最最重要的就是做實驗,你可以在 http://csapp.cs.cmu.edu/3e/labs.html 上找到 csapp 的所有實驗,

最后給大家推薦一下我自己的 Github https://github.com/crisxuan/bestJavaer ,里面有非常多的硬核文章,絕對會對你有幫助,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/339219.html

標籤:其他

上一篇:2021-10-25計科ACM新生培訓第六次培訓題解

下一篇:shell腳本經典題之函式應用

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more