http://book.douban.com/subject/1230413/
另一個:http://book.douban.com/review/5627139/
Chapter 1
A Tour of Computer System
一個對電腦系統總體的介紹,簡單明了。
應試 ★★★:可能在筆試中會有一些整體上的概念題。
修鍊 ★: 屬於電腦最基本的概念。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
chapter 2
Representing and Manipulating Information
資訊在電腦中的表示形式。分別包括整數和浮點數的表示形式。
應試 ★: 應試中很少會考到。
修鍊 ★★★★:有很多人可能寫了多年的代碼都不知道浮點數是如何用那4(8)個位元組儲存的。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
chapter 3
Machine-Level Representation of Program
組合語言的複習。
修鍊 ★★★★★:理解組合語言和寄存器結構是後面很多內容的基礎。
應試:
3.7 Procedures ★★★★★:程序呼叫,尤其是程序呼叫(包括遞迴調用)中堆棧的使用方式是經常會考到的。
3.10 Alignment ★★★★★:資料在記憶體中的“對齊”方式,也是經常出現在考題中的。比如定義一個結構體數組,列印出其中一個元素的地址,問這個地址相對數組起始地址有多少個位元組的距離。
others ★★★: 彙編在應試中考的還是比較少的(除專門的職位)。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
chapter 4
Processor Architecture
電腦體繫結構的內容。
處理器結構,各種邏輯門、功能單元,指令集,指令的執行,指令執行的流水線等。
應試 ★: 對於軟體相關職位來說,很少會考到這麼底層的東西的。
修鍊 ★★★: 對於從事軟體層面的技術人員來說,不用深入,但是也應該理解,知道是怎麼回事。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
chapter 5
Optimizing Program Performance
如何最佳化程式的執行效率,包括代碼的最佳化,編譯器的最佳化,及CPU層級的最佳化。
5.1-5.6
應試 ★★★★: 經常會有一些讓你尋找程式瑕疵的問題,你能看出代碼在哪些細節上可以最佳化嗎?
修鍊 ★★★★★: 你當然需要知道編譯器能在什麼層面上自動幫你最佳化代碼,在編譯器無法最佳化時你自己如何在小細節上最佳化代碼。
5.7以後
CPU層級的最佳化,微指令的概念,功能單元上微指令的並行,程式分支的預測等。
應試 ★: 對於軟體相關職位來說,不會考這些東西的。
修鍊 ★★★: 不用深入,但是應該知道並能夠理解。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
chapter6
The Memory Hierarchy
詳細介紹了電腦系統中的儲存結構。
6.1 介紹了不同種類的存放裝置以及對應的存取資料的方式。
應試 ★: 很少會考到這麼底層的東西
修鍊 ★★: 知道就好了。
6.2-6.5 介紹了存放裝置的組織形式,著重介紹了Cache及其工作方式。
應試 ★★★★: 在面試中,經常會考到跟cache相關的題目。
修鍊 ★★★★: 儲存結構和cache是電腦中很基礎也很重要的概念。
6.6-6.7 介紹了程式如何和cache打交道,不同的迴圈嵌套順序、遍曆方向等對cache命中的影響。
應試 ★★: 很少會考到這些東西。
修鍊 ★★★★: 你當然希望在寫多重迴圈的時候知道什麼樣的嵌套順序效率最高。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
chapter 7
Linking
顧名思義,詳細講解了程式的連結過程,主要分為靜態連結和動態連結,以及連結過程中使用到的技術。
應試 ★★★:需要知道連結的基本概念,尤其是動態連結可能會考到。
修鍊 ★★★★★:有的時候,你很可能會被一個連結錯誤折磨好幾天。另外,動態連結程式庫的應用現在也是很普遍的。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
chapter 8
Exceptional Control Flow
顧名思義,本章主要講解異常控制,不過這裡的“異常”並不是Java或者C++裡的狹義的異常,而是一個廣義的“Exceptions”的概念,包括中斷(Interrupt,硬體層面,主要是I/O中斷),陷阱(Trap,主動產生的異常,主要用於使用者程式和系統核心間的互動,如系統調用),錯誤(Falut,如除0錯誤;頁錯誤:在虛擬記憶體中,所請求頁面並不在記憶體中,需要從硬碟讀取等。錯誤可能恢複),中止(Abort,致命錯誤,無法恢複,如硬體問題等)。
在介紹異常處理的同時,引入了進程的概念,對進程式控制制也進行了詳細介紹,以及進程層級的Exception:訊號(signal),這個層級的異常處理由作業系統完成,通常叫做環境切換(context switch)。
應試 ★★: 主要掌握進程的概念即可。
修鍊 ★★★: 知道異常控制流程是怎麼回事,使用者程式和系統互動(如系統調用)的原理和方式即可,不用太深入。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
chapter 9
Measuring Program Execution Time
本章介紹了如何儘可能準確的測配量序執行的時間。在實際編程中,我們極少會需要進行如此精確的測量,所以我跳過本章不讀。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
chapter 10
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這樣的進階程式設計語言,至少也應該弄懂記憶體回收機制吧。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
chapter 11
System-Level I/O
介紹類Unix系統下的I/O讀寫,主要介紹系統層面的I/O介面。由於我們日常編程所用的I/O介面都是各種進階語言提供的經過封裝的標準介面,故而如果不進行嵌入式編程的話這部分知識不是必須的,我跳過沒讀。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
chapter 12
Network Progranmming
簡單介紹了網路模型,TCP/IP協議,類Unix系統的socket介面等。
應試和修鍊 ★★: 因為篇幅限制,本章只做了簡單講解,要掌握網路編程知識還需要參考專門的網路技術書籍。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
chapter 13
Concurrent Programming
本章簡單介紹了並發程式設計的內容,主要包括:
進程層級的並發,各子進程擁有不同的虛擬位址空間,需要IPC(InterProcess Communication)機制共用資料,進程之間切換開銷大。
I/O複用,事件驅動,單進程運行,共用虛擬位址空間,並發效果不理想。
線程,介於上述兩種中間,各子線程共用進程的虛擬位址空間,線程間切換開銷較小。
另外介紹了並發編程中訪問共用變數的訊號量機制。給出了4類容易引起線程不安全的函數。
應試 ★★: 除應聘相關職位外,並發編程考的比較少,不過需要清楚鎖機制和訊號量機制等。
修鍊 ★★★: 多線程程式在現今的開發中還是很常見的,但是本章介紹的比較簡單,需要參考另外專門的書籍。