1. 程式人生 > >CSAPP-C1-計算機系統漫遊

CSAPP-C1-計算機系統漫遊

概念 clas 獲得 連接 打包成 進行 硬件 實現 重要

第1章-計算機系統漫遊

程序被其他程序翻譯成不同的格式

  • GCC編譯器驅動程序讀取源程序文件,並把它翻譯成一個可執行目標文件。這個翻譯過程可分為4個階段(預處理階段,編譯階段,匯編階段,鏈接階段)完成,這4個階段的程序(預處理器,編譯器,匯編器,鏈接器)一起構成了編譯系統。
  • 預處理階段。預處理器(cpp)根據以字符#開頭的命令,修改原始的C程序。經過預處理器處理的文件以.i作為文件擴展名。
    • 可以通過gcc -E hello.c -o hello.i獲取預處理後的文件。
  • 編譯階段。編譯器(ccl)講文本文件hello.i翻譯成文本文件hello.s,包含一個匯編語言程序。
    • 可以通過gcc -S hello.i -o hello.s
      獲取編譯後的匯編文件。
  • 匯編階段。匯編器(as)將hello.s翻譯成機器語言指令,把這些機器語言指令打包成一種==可重定位目標程序(relocatable object program)==的格式,並將結果保存到目標文件hello.ohello.o文件是一個二進制文件。
    • 可以通過gcc -c hello.s -o hello.o獲取匯編後的二進制文件。
  • 鏈接階段。鏈接器(ld)負責合並了將printf.o文件合並到hello.o程序中,結果得到了hello文件,它是一個==可執行目標文件==,可以被加載到內存中,由系統執行
    • 可以通過gcc hello.o -o hello獲得鏈接後的可執行文件

處理器讀並解釋存儲在內存的指令

系統的硬件組成

  • 總線,它攜帶信息字節並負責在各個部件間傳遞。
    • 總線常常被設計為傳送定長的字節塊,也就是字(word)。字中的字節數(即字長)是一個基本的系統參數,各個系統都不盡相同。
    • 現在大多數機器字長要麽是4個字節,要麽是8個字節。
  • I/O設備,是系統於外部時間聯系的通道。
    • 每個I/O設備都通過一個控制器或適配器與I/O總線相連。
  • 主存,它是一個臨時存儲設備。
    • 從物理上來說,主存是一個由一組動態隨機存取存儲器(DRAM)芯片組成的。
    • 從邏輯上來說,存儲器是一個線性的字節數組,每個字節都有其唯一的地址(數組索引)。
  • 處理器(中央處理單元),是解釋存儲在主存中指令的引擎,處理器的核心是一個大小為一個字的存儲設備(或寄存器),稱為程序計數器(PC)。
    • 任何時刻,PC都指向主存中的某條機器語言指令(即含有該條指令的地址)。
    • 寄存器文件是一個小的存儲設備,由一些單個字長的寄存器組成,每個寄存器都有唯一的名字。邏輯單元(ALU)計算新的數據和地址值。
    • CPU在指令的要求下可能會執行下列操作
      • 加載:從主存復制一個字節或一個字到寄存器,以覆蓋原來的內容。
      • 存儲:從寄存器復制一個字節或者一個字到主存的某個位置,以覆蓋這個位置上原來的內容。
      • 操作:把兩個寄存器的內容復制到邏輯單元(ALU),ALU對這兩個字做算術運算,並將結果放到一個寄存器中,以覆蓋該寄存器中原來的內容。
      • 跳轉:從指令本身中抽取一個字,並將這個字復制到程序計數器(PC)中,以覆蓋PC中原來的值。

高速緩存至關重要

  • 針對處理器與主存之間的差異,系統設計者采用了更小更快的存儲設備,稱為高速緩存存儲器(cache memory),簡稱高速緩存。
  • 位於處理器芯片上的L1高速緩存的容量可以達到數萬字節,訪問速度幾乎和訪問寄存器文件一樣快。
  • 一個容量為數十萬到數百萬字節的更大的L2高速緩存通過一條特殊的總線連接到處理器。進程通過訪問L2高速緩存的時間要比訪問L1高速緩存的時間長5倍,但這仍比訪問主存的時間快5~10倍。
  • L1和L2高速緩存是用一種叫做靜態隨機訪問存儲器(SRAM)的硬件技術實現的。

操作系統管理硬件

  • 操作系統有兩個基本功能
    • 防止硬件被失控的應用程序濫用。
    • 向應用程序提供簡單一致的機制來控制復雜而又通常大不相同的低級硬件設備。
  • 操作系統通過幾個基本的抽象概念來實現這兩個功能。
    • 進程:對處理器、主存和I/O設備的抽象表示。
    • 虛擬內存:對主存和磁盤I/O設備的抽象表示。
    • 文件:文件是對I/O設備的抽象表示。

進程

  • 進程是操作系統對一個正在運行的程序的一種抽象。
  • 一個系統上可以運行多個進程,而每個進程都好像在獨占使用硬件。
  • 並發運行,則是說一個進程的指令和另一個進程的指令是交錯執行的。
  • 無論是在單核還是多核系統中,一個CPU看上去都像是在並發地執行多個進程,這是處理器在進程間切換來實現的。
  • 操作系統實現這種交錯執行的機制稱為==上下文切換==。
  • 操作系統保持和跟蹤==進程運行所需的所有狀態信息==。這種狀態,稱為==上下文==。
  • 在任何一個時刻,單處理器系統都只能執行一個進程的代碼。
  • 當操作系統決定要把控制權從當前進程轉移到某個新進程時,就會進行==上下文切換==,即保存當前進程的上下文,恢復新進程的上下文,然後將控制權傳遞到新進程。
  • 從一個進程到另一個進程的轉換是由==操作系統的內核(kernel)==管理的。
  • 內核是操作系統代碼常駐主存的部分,當應用程序需要操作系統的某些操作時,比如讀寫文件,它就是執行一條特殊的系統調用(system call)指令,將控制權傳遞給內核,然後內核執行被請求的操作並返回應用程序。
  • 內核不是一個獨立的進程,它是系統管理全部進程所用代碼和數據結構的集合。

線程

  • 在現代操作系統中,一個進程實際上可以由多個稱為線程的執行單元組成。
  • 每個線程都運行在==進程的上下文==中,並==共享同樣的代碼和全局數據==。

虛擬內存

  • 虛擬內存是一個抽象概念,它為每個進程提供了一個假象,即每個進程都在獨占地使用主存。
  • 每個進程看到的內存都是一致的,稱為==虛擬 地址空間==。
  • 進程的虛擬地址空間
    • 程序代碼和數據。
    • 堆。
    • 共享庫。
    • 棧,位於用戶虛擬地址空間頂部是用戶棧,編譯器用它來實現函數調用。
    • 內核虛擬內存。地址空間頂部的區域是為內核保留的。不允許應用程序讀寫這個區域的內容或者直接調用內核代碼定義的函數。

文件

  • 文件就是字節序列。
  • 每個I/O設備,包括磁盤,鍵盤,顯示器甚至網絡,都可以看成是文件。

重要主題

Amdahl定律

  • 對系統的某個部分加速時,其對系統整體性能的影響取決於==該部分的重要性和加速程度==。

  • 若系統執行某應用程序所需時間為\(T_{old}\)。假設系統某部分所需執行時間與系統所需執行時間的比例為a,而該部分性能提升比例為k。即該部分初始所需執行時間為\(aT_{old}\),系統其他部分所需執行時間為\((1-a)T_{old}\)。該部分現在所需的時間為\(aT_{old}/k\)。因此,總的執行時間為
    \[ T_new = (1 - a)T_{old} + (aT_{old}) / k = T_{old}[ (1 - a) + a/k ] \]

  • 由此,計算加速比\(S = T_{old} / T_{new}\)
    \[ S = \frac{1}{(1 - a) + a/k} \]

並發和並行

  • 並發(concurrency)指一個同時具有多個活動的系統。
  • 並行(parallelism)指的是使用並發來使一個系統運行得更快。並行可以在計算機系統的多個抽象層次上使用。
  • 多核處理器是將多個CPU(稱為核)集成到一個集成電路芯片上。每個核都有自己的L1和L2高速緩存。
  • 超線程,有時候稱為多線程(simultaneous multi-threading)是一項允許一個CPU執行多個控制流的技術。
  • 多核處理器的使用可以從兩方面提高系統性能。
    • 它減少了在執行多個任務時模擬並發的需要。
    • 它可以使應用程序運行得更快,要求程序以多線程方式來書寫。
  • 在較低的抽象層次上,現代處理器可以同時執行多條指令的屬性稱為指令級並行。
  • 如果處理器可以達到比一個周期一條指令更快的執行速率,就稱之為超標量(super-scalar)處理器。
  • 在最低層次上,許多現代處理器擁有特殊的硬件,允許一條指令產生多個可以並行執行的操作,這種方式稱為單指令、多數據,即SIMD並行。

計算機系統中抽象的重要性

  • 文件是對I/O設備的抽象。
  • 虛擬內存是對程序存儲器的抽象。
  • 進程是對一個正在運行的程序的抽象。
  • 虛擬機是對整個計算機的抽象,包括操作系統、處理器和程序。

CSAPP-C1-計算機系統漫遊