CSAPP 第一章 電腦系統漫遊

第一章 電腦系統漫遊

  1. C語言的起源:(系統級編程的首選)

    • C語言與Unix作業系統關係密切
    • C語言小而簡單:其設計由一個人掌控
    • C語言是為實踐目的設計的:其設計用來實現Unix作業系統
  2. C語言程式編譯的四個階段:

    • 預處理階段:預處理器(cpp),根據字元#開頭的命令,修改原始的C程式,hello.c -> hello.i
    • 編譯階段:編譯器(ccl),將預處理結果翻譯為彙編文件,hello.i -> hello.s
    • 彙編階段:彙編器(as),將彙編文件翻譯成機器語言指令,hello.s -> hello.o
    • 鏈接階段:鏈接器(ld),合併不同的*.o文件,生成可執行目標文件,hello.o + printf.o -> hello
  3. 了解編譯系統,有助於:

    • 優化程式性能
    • 理解鏈接時出現的錯誤
    • 避免安全漏洞
  4. 系統的硬體組成:

    • 匯流排:攜帶資訊位元組並負責在各個部件間傳遞
      • 字:匯流排上傳送的定長位元組塊
    • I/O設備:系統與外部世界的而聯繫通道
      • 控制器:I/O設備本身或者系統的主板上的晶片組
      • 適配器:插在主板插槽上的卡
    • 主存:臨時存儲設備,在處理器執行程式時,用來存放程式和程式處理的數據
    • 處理器:解釋(或執行)存儲在主存中指令的引擎
      • 核心:程式計數器,大小為一個
      • 指令集架構:描述每條機器程式碼指令的效果
      • 微體系結構:描述處理器實際上是如何實現的
  5. 高速快取存儲器(cache):數據暫時的集結區域,存放處理器近期可能會需要的資訊

    • L1高速快取:容量可達數萬位元組,訪問速度幾乎和訪問暫存器文件一樣快
    • L2高速快取:容量為數十萬到數百萬位元組,訪問時間比訪問L1高速快取長5倍,但仍比訪問主存快5~10倍
  6. 存儲器層次結構:從上至下,設備的訪問速度越來越慢,容量越來越大,並且每位元組的造價也越來越便宜

    • 主要思想:上一層的存儲器作為低一層存儲器的高速快取
  7. 作業系統:應用程式與硬體之間插入的一層軟體,所有應用程式對硬體的操作嘗試都必須通過作業系統

    • 主要功能:
      • 防止硬體被失控的應用程式濫用
      • 嚮應用程式提供簡單一致的機制來控制複雜而又通常大不相同的低級硬體設備
    • 基本抽象概念:
      • 進程:對處理器、主存和I/O設備的抽象表示
      • 虛擬記憶體:對主存和磁碟I/O設備的抽象表示
      • 文件:對I/O設備的抽象表示
  8. 進程:作業系統對一個正在運行的程式的一種抽象,製造一種假象,即某個程式的程式碼和數據是系統記憶體中唯一的對象

    • 並發運行:一個進程的指令和另一個進程的指令是交錯執行的
    • 上下文:跟蹤程式運行所需的所有狀態資訊(PC、暫存器文件的當前值、主存的內容等)
    • 上下文切換:一種進程間交錯執行的機制,保存當前進程的上下文,恢復新進程的上下文,將控制權傳遞到新進程
    • 作業系統內核:作業系統程式碼常駐主存的部分,是系統管理全部進程所用程式碼和數據結構的集合
      • 當應用程式需要作業系統的某些操作時,它就執行一條特殊的系統調用指令,將控制權傳遞給內核,然後內核執行被請求的操作並返回應用程式
  9. 執行緒:一個進程可由多個執行單元(執行緒)組成,每個執行緒都運行在進程的上下文中,並共享同樣的程式碼和全局數據

  10. 虛擬記憶體:為每個進程提供一種假象,即每個進程都在獨佔地使用主存

    • 記憶體地址空間

      • 程式程式碼和數據:在進程一開始運行時就被指定了大小,直接按照可執行文件的內容初始化
      • :可以在運行時動態地擴展和收縮(調用free、malloc等函數)
      • 共享庫:用來存放像C標準庫和數學庫這樣的共享庫的程式碼和數據
      • :實現函數調用,在程式執行期間可以動態地擴展和收縮(調用函數、函數返回)
      • 內核虛擬記憶體:為內核保留,不允許應用程式讀寫和直接調用
  11. 文件:位元組序列,每個I/O設備都可以看成是文件

    • 系統中所有輸入輸出都是通過使用Unix I/O系統函數調用讀寫文件來實現的
  12. Amdahl定律:

    • 主要思想:當我們對系統的某個部分加速時,其對系統整體性能的影響取決於該部分的重要性和加速程度

    • 總執行時間:

      $T_{new}=(1-\alpha)T_{old}+(\alpha T_{old})/k=T_{old}[(1-\alpha)+\alpha/k]$

      • $T_{old}$:(原來)系統執行某應用程式需要的時間
      • $T_{new}$:(加速後)系統執行某應用程式需要的時間
      • $\alpha$:系統某部分所需執行時間與$T_{old}$的比例
      • $k$:該部分性能提升比例
    • 加速比

      $S={T_{old}\over T_{new}}={1\over(1-\alpha)+\alpha/k}$

      • $S$:加速比
  13. 並發和並行:

    • 並發:指一個同時具有多個活動的系統

    • 並行:指用並發來使一個系統運行得更快

    • 三個層次:

      • 執行緒級並發:傳統意義上這種並發行為只是模擬出來的,是通過使一台電腦在它正在執行的進程間快速切換來實現的

        • 超執行緒:一項允許一個CPU執行多個控制流的技術
          • 涉及CPU某些硬體有多個備份:如程式計數器、暫存器文件
          • 其他的硬體部分只有一份:如執行浮點算術運算的單元
        • 多處理器:
          • 減少了在執行多個任務時模擬並發的需要
          • 可以使應用程式運行得更快
      • 指令級並行:現代處理器可以同時執行多條指令的屬性

        • 流水線:將執行一條指令所需要的活動劃分成不同的步驟,將處理器的硬體組織成一系列的階段,每個階段執行一個步驟。這些階段可以並行地操作,用來處理不同指令的不同部分
        • 超標量:處理器達到比一個周期一條指令更快的執行速率
      • 單指令、多數據並行:允許一條指令產生多個可以並行執行的操作(SIMD並行)

  14. 抽象: