深入理解計算機系統-筆記-第一章-計算機系統漫遊

     深入理解計算機系統 算是一本非常經典的教材。之前看了一些但又放在了一邊,這次重寫開始讀這本書,並通過摘記書中重要知識點的方式來加深自己的印象。希望能堅持寫完

     由於我的目標是成爲一名算法工程師,所以對這本書的閱讀也有所側重,主要參考了一篇文章:評《深入理解計算機系統》

     這本書的勘誤見:http://www.yiligong.org/csapp2e/


1. 編譯文件的基本過程

  1. gcc -o hello hello.c
其中hello.c是源程序文件,而hello是可執行文件。編譯過程主要包括如下幾個步驟

  • 預處理階段:預處理器cpp根據#開頭的命令修改原始代碼,比如會將#include的內容直接插入到程序文本中
  • 編譯階段:編譯器ccl將修改過的源程序修改爲彙編指令程序
  • 彙編階段:彙編器as將彙編程序翻譯成機器語言指令,並打包爲“可重定位目標程序”
  • 鏈接階段:鏈接器ld,將鏈接的一些函數合併到hello程序中,得到的hello就是可執行文件

2. 瞭解編譯系統工作方式的重要性
  • 優化程序性能:瞭解一些編譯器的知識能讓人知道如何編寫程序能讓程序跑的更快
  • 理解鏈接時發生的錯誤:感覺這個是平時寫代碼時最常遇到的問題之一了。包括靜態和動態庫的區別,編譯時鏈接各個庫的順序的影響等等。
  • 避免安全漏洞:緩衝區溢出是最常見的安全漏洞的原因

3. 系統的基本硬件組成
以Intel Pentium系統產品系統模型爲例(顯然奔騰cpu已經很老了,此外圖中也沒有現在常見的獨立顯卡)
  • 總線:貫穿整個系統,攜帶信息在各個部件之間傳遞。總線通常被設計成傳送定長的字節塊,也就是字(word)。字中的字節數(字長)是一個基本的系統參數。常見的包括4字節(32位)和8字節(64位)。這就是我們平常說的64位系統的含義,現在新的電腦通常都是64位了。注意:32位系統最大隻能表達4GB的儲存器地址,即最大隻能用4GB內存。
  • I/O設備:常用的I/O設備包括鍵盤,鼠標,顯示器,磁盤(硬盤和軟盤等)以及音箱啊遊戲手柄之類的。每個I/O設備都通過控制器或者適配器與I/O總線相連接,兩者區別在於其封裝方式
    • 控制器:置於I/O設備本身的或者系統的主印製電路板(主板)上的芯片組
    • 適配器:插在主板上的一塊卡
  • 主存:即我們平常所指的內存(RAM)。注意Cache不屬於主存,而是屬於CPU的一部分。當前常用的主存技術爲DDR3 / DDR4
  • CPU:CPU通常包括PC(程序計數器),ALU(算術/邏輯單元),寄存器文件以及高速緩存等部分。能執行 加載,儲存,操作,跳轉等基本指令。

4. 高速緩存器
由於CPU和主存的速度存在很大的差異,所以一般採用高速緩存作爲暫時的數據集結區域。高速緩存的空間較小,但速度很快
 
 
5. 操作系統管理硬件
操作系統有兩個主要功能:
  • 防止硬件被失控的應用程序濫用
  • 嚮應用程序提供簡單一致的機制來控制複雜而又通常大相徑庭的低級硬件設備
操作系統通過幾個基本抽象概念(進程,虛擬儲存器,文件)來實現這兩個功能
  • 進程
    • 進程是操作系統對一個正在運行的程序的一種抽象。也可認爲進程是對處理器、主存和I/O設備的抽象表示。
    • 傳統處理器一個時刻只能處理一個程序,但卻可以運行多個進程。這些進程看起來是同時獨立運行的,而實際上是通過處理器在進程之間切換來實現的,這種機制被稱爲“上下文切換”
  • 線程
    • 現代系統中,一個進程實際上可以由多個稱爲線程的執行單元組成。
    • 多線程之間比多進程之間更容易共享數據
    • 線程一般來說比進程更加高效
    • 當有多核處理器時,多線程可以加速程序
  • 虛擬存儲器
    • 虛擬存儲器是對主存和磁盤I/O的抽象表示。
    • 虛擬存儲器爲每個進程提供一個假象:每個進程都在獨佔地使用主存。每個進程看到的是一致的存儲器——虛擬地址空間
    • 地址從下往上是增加的
    • 程序代碼與數據:代碼和數據區是直接按照可執行目標文件的內容初始化的。其大小在一開始運行的時候就確定了
    • 堆:堆的大小可以動態地擴展和收縮,比如使用malloc和free時
    • 共享庫:包括C標準庫和math庫等,與動態鏈接的概念相關
    • 用戶棧:編譯器用其實現函數的調用,調用一個函數是棧會增長,從函數返回時棧會收縮
    • 內核虛擬存儲器:爲內核保留,不允許應用程序讀寫此區域內容或是直接調用內核代碼定義的函數
  • 文件
    • 文件是對I/O設備的抽象。磁盤,鍵盤,顯示器等等都可以看作是文件。(感覺在Linux下能很好的體現這一點)    

6. 併發和並行
  • 併發:指一個同時具有多個活動的系統
  • 並行:指用併發使一個系統運行的更快
  • 線程級併發
    • 單處理器系統:單處理器的併發通過快速切換正在執行的進程實現
    • 多核處理器:擁有多個核,還有超線程技術,下圖爲intel core i7處理器結構的示意圖
    • 超線程:也稱“同時多線程”,是一項允許一個CPU執行多個控制流的技術。i7中一個核可以執行2個線程(即常說的雙核4線程,四核8線程)。原理:CPU的某些硬件有多個備份,比如PC和寄存器文件,某些硬件只有一個,比如ALU。常規的處理器需要20000哥始終週期做線程之間的轉換,而超線程處理器可以在單個週期的基礎上決定要執行哪一個線程。
  • 指令級並行
    • 指可以同時執行多條指令的屬性稱爲指令級並行
    • 早期處理器,比如8086,需要3-10個時鐘週期才能執行一條指令
    • 若處理器可以達到比一個週期一條指令更快的執行速率,則稱之爲超標量處理器
    • 流水線pipelining是一種加快指令執行速率的策略
  • 單指令,多數據並行
    • 許多現代處理器擁有特殊的硬件,允許一條指令產生多個可以並行執行的操作,即單指令多數據——SIMD並行


 
發佈了33 篇原創文章 · 獲贊 225 · 訪問量 50萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章