第一章 計算機系統漫遊
-
C語言的起源:(系統級程式設計的首選)
- C語言與Unix作業系統關係密切
- C語言小而簡單:其設計由一個人掌控
- C語言是為實踐目的設計的:其設計用來實現Unix作業系統
-
C語言程式編譯的四個階段:
- 預處理階段:前處理器(cpp),根據字元#開頭的命令,修改原始的C程式,hello.c -> hello.i
- 編譯階段:編譯器(ccl),將預處理結果翻譯為彙編檔案,hello.i -> hello.s
- 彙編階段:彙編器(as),將彙編檔案翻譯成機器語言指令,hello.s -> hello.o
- 連結階段:連結器(ld),合併不同的*.o檔案,生成可執行目標檔案,hello.o + printf.o -> hello
-
瞭解編譯系統,有助於:
- 優化程式效能
- 理解連結時出現的錯誤
- 避免安全漏洞
-
系統的硬體組成:
- 匯流排:攜帶資訊位元組並負責在各個部件間傳遞
- 字:匯流排上傳送的定長位元組塊
- I/O裝置:系統與外部世界的而聯絡通道
- 控制器:I/O裝置本身或者系統的主機板上的晶片組
- 介面卡:插在主機板插槽上的卡
- 主存:臨時儲存裝置,在處理器執行程式時,用來存放程式和程式處理的資料
- 處理器:解釋(或執行)儲存在主存中指令的引擎
- 核心:程式計數器,大小為一個字
- 指令集架構:描述每條機器程式碼指令的效果
- 微體系結構:描述處理器實際上是如何實現的
- 匯流排:攜帶資訊位元組並負責在各個部件間傳遞
-
快取記憶體儲存器(cache):資料暫時的集結區域,存放處理器近期可能會需要的資訊
- L1快取記憶體:容量可達數萬位元組,訪問速度幾乎和訪問暫存器檔案一樣快
- L2快取記憶體:容量為數十萬到數百萬位元組,訪問時間比訪問L1快取記憶體長5倍,但仍比訪問主存快5~10倍
-
儲存器層次結構:從上至下,裝置的訪問速度越來越慢,容量越來越大,並且每位元組的造價也越來越便宜
- 主要思想:上一層的儲存器作為低一層儲存器的快取記憶體
-
作業系統:應用程式與硬體之間插入的一層軟體,所有應用程式對硬體的操作嘗試都必須通過作業系統
- 主要功能:
- 防止硬體被失控的應用程式濫用
- 嚮應用程式提供簡單一致的機制來控制複雜而又通常大不相同的低階硬體裝置
- 基本抽象概念:
- 程式:對處理器、主存和I/O裝置的抽象表示
- 虛擬記憶體:對主存和磁碟I/O裝置的抽象表示
- 檔案:對I/O裝置的抽象表示
- 主要功能:
-
程式:作業系統對一個正在執行的程式的一種抽象,製造一種假象,即某個程式的程式碼和資料是系統記憶體中唯一的物件
- 併發執行:一個程式的指令和另一個程式的指令是交錯執行的
- 上下文:跟蹤程式執行所需的所有狀態資訊(PC、暫存器檔案的當前值、主存的內容等)
- 上下文切換:一種程式間交錯執行的機制,儲存當前程式的上下文,恢復新程式的上下文,將控制權傳遞到新程式
- 作業系統核心:作業系統程式碼常駐主存的部分,是系統管理全部程式所用程式碼和資料結構的集合
- 當應用程式需要作業系統的某些操作時,它就執行一條特殊的系統呼叫指令,將控制權傳遞給核心,然後核心執行被請求的操作並返回應用程式
-
執行緒:一個程式可由多個執行單元(執行緒)組成,每個執行緒都執行在程式的上下文中,並共享同樣的程式碼和全域性資料
-
虛擬記憶體:為每個程式提供一種假象,即每個程式都在獨佔地使用主存
-
記憶體地址空間
- 程式程式碼和資料:在程式一開始執行時就被指定了大小,直接按照可執行檔案的內容初始化
- 堆:可以在執行時動態地擴充套件和收縮(呼叫free、malloc等函式)
- 共享庫:用來存放像C標準庫和數學庫這樣的共享庫的程式碼和資料
- 棧:實現函式呼叫,在程式執行期間可以動態地擴充套件和收縮(呼叫函式、函式返回)
- 核心虛擬記憶體:為核心保留,不允許應用程式讀寫和直接呼叫
-
-
檔案:位元組序列,每個I/O裝置都可以看成是檔案
- 系統中所有輸入輸出都是通過使用Unix I/O系統函式呼叫讀寫檔案來實現的
-
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\):加速比
-
-
併發和並行:
-
併發:指一個同時具有多個活動的系統
-
並行:指用併發來使一個系統執行得更快
-
三個層次:
-
執行緒級併發:傳統意義上這種併發行為只是模擬出來的,是通過使一臺計算機在它正在執行的程式間快速切換來實現的
- 超執行緒:一項允許一個CPU執行多個控制流的技術
- 涉及CPU某些硬體有多個備份:如程式計數器、暫存器檔案
- 其他的硬體部分只有一份:如執行浮點算術運算的單元
- 多處理器:
- 減少了在執行多個任務時模擬併發的需要
- 可以使應用程式執行得更快
- 超執行緒:一項允許一個CPU執行多個控制流的技術
-
指令級並行:現代處理器可以同時執行多條指令的屬性
- 流水線:將執行一條指令所需要的活動劃分成不同的步驟,將處理器的硬體組織成一系列的階段,每個階段執行一個步驟。這些階段可以並行地操作,用來處理不同指令的不同部分
- 超標量:處理器達到比一個週期一條指令更快的執行速率
-
單指令、多資料並行:允許一條指令產生多個可以並行執行的操作(SIMD並行)
-
-
-
抽象: