CSAPP筆記-第一章

快速連接:

編譯系統數組

hello程序的運行過程緩存

高速緩存器網絡

操做系統數據結構

計算機系統的抽象多線程

Amdahl加速比定律公式架構

併發與並行併發

  • 這一章術語(請ctrl+F正文內查找):

位,字節,字符,文本,ASCII, 文本文件,二級制文件,機器指令,可執行目標程序,編譯器GCC(缺省),編譯系統,預處理器,編譯器,彙編器,連接,總線,I/O,主板,適配器,控制器,主存,DRAM,邏輯,處理器,程序計數器,寄存器,ALU,加載,存儲,操做,跳轉,指令集,高速緩存,操做系統,抽象,進程,多核,併發,上下文切換,內核,系統調用,控制權,線程,虛擬內存,虛擬地址空間,堆(缺省),共享庫(缺省),用戶棧(缺省),內核虛擬內存(缺省),加速比,Amdahl定律,並行,併發,線程級併發,多核,超線程,指令集併發,SIMD並行,虛擬機函數


一個hello world程序的生命週期

#include <stdio.h>

int main(){
    printf("hello, world\n");
    return 0;
}

編譯系統:

  • 編譯hello程序的過程

    (1) 預處理階段:插入頭文件

    (2) 編譯階段:編譯器翻譯,包含main函數定義的彙編語言程序

main:
    subq    $8, %rsp #一條低級機器語言指令
    movl    $.LCO, %edi
    call    puts
    movl    $0, %eax
    addq    $8, %rsp
    ret
(3) 彙編階段:彙編器翻譯成機器語言指令,打包成可重定位目標程序(relocatable object program), 保存爲二進制文件

(4) 連接階段:連接器合併調用的printf函數,獲得可執行目標文件
  • shell: 命令行解釋器;運行hello程序,\(> ./hello\)

  • 系統硬件組成

  1. 總線:總線傳送定長的字節塊(字,word),字長是基本的系統參數:32位系統是4個字節,64位系統是8個字節

  2. I/O設備:每一個I/O設備都經過一個控制器(設備/系統主板上的芯片組)/適配器(插在設備/系統主板插槽上的卡)與I/0總線相連

  3. 主存:由一組動態隨機存取存儲器(DRAM)芯片組成。邏輯上,是一個線性字節數組。

  4. 處理器 (CPU):
    模型 - 指令集架構。
    下一條指令不必定和內存中剛執行的指令相鄰。

    4.1 核心 - 大小爲一個字的寄存器,成爲程序計數器(PC),PC指向主存中某條機器語言指令(的地址)。

    4.2 寄存器文件(register file): 一個小的存儲設備,每一個寄存器單個字長

    4.3 算數/邏輯單元 (ALU): 計算新的數據和地址值

    4.4 CPU在PC中指令要求下執行的操做:

    加載 - 主存 -> 寄存器;
    存儲 - 寄存器到主存;
    操做 - 兩個寄存器 -> ALU運算 -> 一個寄存器;
    跳轉 - 指令複製到PC

hello程序的運行過程 (省略細節)

高速緩存存儲器 (cache memory)

加快從主存中複製到寄存器的速度。

多級高速緩存:L1, L2, (L3), ...

能夠利用高速緩存將程序的性能提升一個數量級

  • 存儲設備的層次:使用上一層存儲器做爲低一層存儲器的高速緩存

操做系統:應用程序 <--> 硬件

操做系統兩個基本功能:

(1)防止硬件被失控的應用程序濫用
(2)嚮應用程序提供簡單一致的機制來控制複雜的低級硬件設備

所以,操做系統有如下抽象:

  • 進程:操做系統對一個正在運行的程序的一種抽象。
    • 併發運行 - 一個進程的指令和另外一個進程的指令交錯執行。進程數多於CPU個數。CPU經過處理器在進程間的切換來實現併發。
    • 這種交錯執行的機制稱爲上下文切換 - 保持跟蹤運行的狀態信息,即上下文(PC,寄存器當前值,主存內容等)。
    • 內核(kernel, 操做系統代碼常駐主存的部分,系統關係所有進程所用代碼和數據結構的集合)管理進程到進程的轉換。
      應用程序執行一條system call指令,將控制權傳遞給內核/操做系統。
      操做系統保留當前進程的上下文,建立應用程序的新進程以及上下文。
      操做系統將控制權傳給新進程(執行請求,返回應用程序)。
  • 線程
    一個進程由多個線程執行單元組成。線程運行在進程的上下文中(?),共享代碼和全局數據。

  • 虛擬內存
    一個抽象概念。進程的虛擬地址空間以下(每一個進程看到的內存都是一致的):

地址由下往上增大。

  • 文件
    就是字節序列。每一個I/O設備均可以當作文件。系統輸入輸出經過使用一組Unix I/O系統函數調用讀寫文件來實現。

系統之間的網絡通訊

簡而言之,網絡能夠視爲一個I/O設備。

Amdahl law

實際加速比的計算:\(S = T_{old} / T_{new}, T_{new} = (1-\alpha)T_{old} + \alphaT_{old}/k\)

併發(concurrency)和並行(parallelism)

併發:通用概念,指同時具備多個活動的系統
並行:用併發使一個系統運行得更快

系統層次結構中由高到低的三個並行層次:

  1. 線程級(進程級?):多核處理器, 超線程/同時多線程

  2. 指令集並行:處理器同時執行多條指令 - 超標量(super-scalar)處理器

  3. 單指令、多數據(SIMD並行):可能是爲了提升處理影像、聲音和視頻數據應用的執行速度。;編譯器支持用特殊的向量數據類型來寫程序。

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

如,爲一組函數規定一個簡單的應用程序接口(API)

計算機系統提供的一些抽象(在上述介紹的基礎上增長"虛擬機"抽象):

Other glossary

  • 8個位(比特) -> 1個字節 -> 程序中某個字符

  • ASCII標準:用惟一的單字節大小的整數值來表示每一個字符

  • 文本文件:只由ASCII字符構成的文件。

  • 二進制文件:不是文本文件的全部其餘文件

Unsolved

  • 線程運行在進程的上下文中
  • 線程級併發 - 進程級併發?

練習題答案

(略)

相關文章
相關標籤/搜索