如何閱讀深入理解計算機系統

在找工作順利結束之後,我又回顧了一下之前的標註,結合自己的筆試、面試經歷,重新修訂了一下。其中應試指標的評分主要是以我的求職目標(互聯網行業偏算法的軟件工程師)爲參照,和其他職位的要求會有些出入。

第一章 計算機系統漫遊 A Tour of Computer System

本章對計算機系統做了一個總體的介紹,用簡單明瞭的語言概括了一些後續章節將要重點展開的概念。

應試 ★★:在筆試中可能會碰到一些整體上的概念題。

修煉 ★:屬於計算機最基本的概念。

第二章 信息的表示和處理 Representing and Manipulating Information

本章介紹了信息在計算機中的表示形式,重點講述整數和浮點數的表示形式。

應試 ★:應試中很少會考到。

修煉 ★★★:有很多人可能寫了多年的代碼都不知道浮點數是如何用那4(8)個字節存儲的,不知道其實表達式(x-y<0)並不能替代(x<y)。< p="">

第三章 程序的機器級表示 Machine-Level Representation of Program
本章其實就是彙編語言課程的複習。

應試:重要程度依賴於求職目標,如果是和我一樣偏算法的工程師,彙編語言是不會考到的。

修煉 ★★★★★:理解彙編語言和寄存器結構是後面很多內容的基礎。

第四章 處理器體系結構 Processor Architecture

本章其實就是計算機體系結構課程的內容。主要介紹的內容有處理器結構,各種邏輯門、功能單元,指令集;指令的執行,指令執行的流水線等。

應試 ★: 對於軟件相關職位來說,很少會考到這麼底層的東西的。

修煉 ★★★: 對於從事軟件層面的技術人員來說,不用深入,但是也應該理解,知道是怎麼回事。

第五章 優化程序性能 Optimizing Program Performance

本章講述如何優化程序的執行效率,包括代碼的優化,編譯器的優化,以及CPU級別的優化。

5.1-5.6節 主要介紹了幾種能有效提高代碼性能的方法。

應試 ★★★★: 經常會有一些讓你尋找程序瑕疵的問題,如果你能看出代碼在哪些細節上可以優化,必定能加分不少。

修煉 ★★★★★: 你當然需要知道編譯器在什麼層面上能自動幫你優化代碼,在編譯器無法優化時你自己又如何在小細節上進行優化。

5.7節以後 主要介紹了CPU級別的優化,微指令的概念,功能單元上微指令的並行,程序分支的預測等。

應試 ★: 對於軟件相關職位來說,基本不會考這些東西的。

修煉 ★★★: 不用深入,但是應該知道並能夠理解。

第六章 存儲器層次結構 The Memory Hierarchy

本章詳細介紹了計算機系統中的存儲結構。

6.1 介紹了不同種類的存儲設備以及對應的存取數據的方式。

應試和修煉 ★: 很少會考到,瞭解一下即可。

6.2-6.7 介紹了存儲設備的組織形式,着重介紹了Cache及其工作方式,程序是如何和cache打交道的,不同的循環嵌套順序、遍歷方向等對cache命中的影響。

應試 ★★★★: 在面試中,經常會考到跟cache相關的題目;修改循環嵌套順序以提高cache命中率也是一些程序改錯題的高級玩法。

修煉 ★★★★: 存儲結構和cache是計算機中很基礎也很重要的概念。

第七章 鏈接 Linking

顧名思義,本章詳細講解了程序的鏈接過程,主要分爲靜態鏈接和動態鏈接,以及鏈接過程中使用到的技術如符號解析、重定位等。

應試 ★★:知道一些基本概念即可。

修煉 ★★★★★:一個軟件工程師應該懂得自己寫出來的程序是怎麼成爲一個可執行文件的,有的時候,你很可能會被一個鏈接錯誤折磨好幾天。

第八章 異常控制流 Exceptional Control Flow

顧名思義,本章主要講解異常控制,不過這裏的“異常”並不是Java或者C++裏狹義的異常,而是一個廣義的“Exceptions”的概念,包括中斷(Interrupt),陷阱(Trap),錯誤(Falut),中止(Abort)等。本章同時引入了進程的概念,介紹了進程級別的 Exception:信號(signal)以及操作系統處理這個異常的手段--上下文切換(context switch)。

應試 ★★: 主要掌握進程的概念即可。

修煉 ★★★: 知道異常控制流是怎麼回事,用戶程序和系統交互(如系統調用)的原理和方式即可,不用太深入。

第九章 虛擬存儲器 Virtual Memory

非常重要的一章,虛擬存儲機制是計算機實現多任務的一項重要技術。計算機正是通過時間片技術使得每個進程在執行時彷彿獨佔CPU,進而又通過虛擬存儲機制使得每一個進程在執行時彷彿獨佔內存。

10.1介紹了虛擬地址和物理地址,CPU進行尋址操作產生的是虛擬地址,通過存儲管理單元(memory management unit)轉換爲實際的物理內存地址。

10.3~10.5講述了虛擬存儲機制的優點:使得內存可以作爲硬盤的cache;能夠更方便的管理內存;能更好的提供內存保護機制。

10.6 介紹了虛擬地址如何轉換爲物理地址。

10.7 很精彩的一節,通過Intel Pentium和Linux的實例講述了整個存儲管理機制。記得以前上操作系統課的時候,各種理論、機制學了一大堆,但就是不知道實際的操作系統到底用的哪套方法,而本節內容正是通過實例讓你對剛學的理論機制有一個直觀的瞭解。

10.8~10.10 講述了存儲映射(Memory Mapping)、動態內存分配和垃圾回收機制。

10.11 很實用的一節,列舉了一些C編程中容易犯的內存引用錯誤。

應試 ★★★★★: 本章內容是操作系統課程的重點內容,如果考操作系統,幾乎肯定會考到;10.11節的知識也能幫你應對一些程序挑錯題。

修煉 ★★★★★: 操作系統中重要的基礎內容,即使你只使用Java這樣的高級編程語言,至少也應該弄懂垃圾回收機制吧。

第十章 系統級I/O System-Level I/O

介紹類Unix系統下的I/O讀寫,主要介紹系統層面的I/O接口。由於我們日常編程所用的I/O接口都是各種高級語言提供的經過封裝的標準接口,故而如果不進行底層開發的話這部分知識不是必須的,我便跳過沒讀。

第十一章 網絡編程 Network Progranmming

本章簡單介紹了網絡模型,TCP/IP協議,類Unix系統的socket接口等。

應試和修煉 ★★: 因爲篇幅限制,本章只做了簡單講解,要掌握網絡編程知識還需要參考專門的網絡技術書籍。

第十二章 併發編程 Concurrent Programming

本章簡單介紹了併發程序設計的內容,主要包括:

1.進程級別的併發,各子進程擁有不同的虛擬地址空間,需要IPC(InterProcess Communication)機制共享數據,切換開銷大。

2.I/O複用,事件驅動,單進程運行,共享虛擬地址空間,併發效果不理想。

3.線程,介於上述兩種中間,各子線程共享進程的虛擬地址空間,切換開銷較小。

另外介紹了併發編程中訪問共享變量的信號量機制,並給出了4類容易引起線程不安全的函數。

應試 ★★: 除應聘相關職位外,併發編程考的比較少,不過需要清楚鎖機制和信號量機制等。

修煉 ★★★: 多線程程序在現今的開發中還是很常見的,但是本章介紹的比較簡單,需要參考另外專門的書籍。

總的來說,我覺得這本書很適合在找工作之前讀一讀,因爲從網上流傳的各種筆試和麪試題中,我們就能看出各大IT公司在招聘工程師的時候是很看重基礎知識的,而對於像我這樣上了三年研究

生的同學來說,很多知識由於長時間沒用早就忘了,所以需再要再複習一下。但是我們可能沒有時間按照課程一門一門地去複習,即使一門一門去看了,也不一定能把知識都聯繫起來,而這本書正好提供了這樣一個視角,從程序員的角度把計算機專業最重要的基礎知識都串了起來,形成了一個完整的計算機系統的概念。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章