第七章 鏈接
鏈接是將各種代碼和數據片段收集並組合成為一個單一文件的過程。(在軟件開發中實現分離編譯)
7.1 編譯器驅動程序
7.2 靜態鏈接
- 符號解析:將每個符號的引用與一個符號的定義關聯起來。
- 重定位:編譯器和匯編器生成從地址0開始的代碼和數據節,鏈接器通過把每個符號定義與一個內存位置關聯起來,從而重定位這些節,然后修改所有對這些符號的引用,使得它們指向這個內存位置。
7.3 目標文件
編譯器和匯編器生成可重定位目標文件,鏈接器生成可執行目標文件。
7.4 可重定位目標文件
7.5 符號和符號表
7.6 符號解析★
7.7 重定位★
重定位節和符號定義
重定位節中的符號引用-重定位條目
7.8 可執行目標文件
7.9 加載可執行目標文件
7.10 動態鏈接共享庫
7.11 從應用程序中鏈接和加載共享庫
7.12 位置無關代碼
7.13 庫打樁機制(linux鏈接器)
7.14 處理目標文件的工具
第八章 異常控制流(ECF--Exceptional Control Flow)
8.1 異常
(1)異常類別:中斷、陷阱、故障、終止
8.2 進程——一個執行中程序的實例
(1)進程提供給應用程序的關鍵抽象:
- 一個獨立的邏輯控制流,它提供一個假象,好像我們的程序獨占地使用初處理器。
- 一個私有的地址空間,它提供一個假象,好像我們的程序獨占地使用內存系統。
(2)並發流——一個邏輯流的執行時間與另一個流重疊。
(3)上下文切換——操作系統內核采用的一種較高形式的異常控制流來實現多任務。
內核為每個進程維持一個上下文,上下文就是內核重新啟動一個被搶占進程所需的狀態。它由一些對象的值組成,這些對象包括通用目的寄存器、浮點寄存器、程序計數器、用戶棧、狀態寄存器、內核棧和各種內核數據結構,比如描述地址空間的頁表、包含有關當前進程信息的進程表,以及包含進程已打開文件的信息的文件表。
(4)信號——就是一條消息,它通知進程系統發生了一個某種類型的事件,並且允許進程和內核中斷其他進程。
(5)非本地跳轉
第九章 虛擬內存
9.1 物理和虛擬內存
物理尋址和虛擬尋址
9.2 地址空間——非負整數地址的有序集合
9.3 虛擬內存作為緩存的工具★
9.4 虛擬內存作為內存管理的工具
9.5 虛擬內存作為內存保護的工具
9.6 地址翻譯★
9.7 案例研究:Intel Core i7/Linux 內存系統★
9.8 內存映射
9.9 動態內存分配★
9.10 垃圾收集
9.11 C程序中常見的與內存有關的錯誤
第十章 系統級I/O
輸入輸出(I/O)是在主存和外部設備(例如磁盤驅動器、終端和網絡)之間復制數據的過程。
10.1 Unix I/O
10.2 文件(介紹了linux的文件和目錄)
10.3 打開和關閉文件(open和close函數)
10.4 讀和寫文件(read和write函數)
10.5 用RIO包健壯地讀寫
- 無緩沖的輸入輸出函數
- 帶緩沖的輸入函數
10.6 讀取文件元數據(stat和fstat函數)
10.7 讀取目錄內容(readdir函數)
10.8 共享文件
10.9 I/O重定向
10.10 標准I/O
10.11 綜合:我該使用哪些I/O函數?
第十一章 網絡編程
11.1 客戶端-服務器編程模型
11.2 網絡
11.3 全球IP因特網
11.4 套接字接口(socket interface)
11.5 web服務器
11.6 綜合:TINY WEB服務器(實例學習)
第十二章 並發編程
三種構造並發程序的方法:
- 進程:每個邏輯控制流都是一個進程,由內核來調度和維護。因為進程都有獨立的虛擬地址空間,想要和其他流通信,控制流必須使用某種顯式的進程間通信(IPC)機制。
- I/O多路復用:一個應用程序在一個進程的上下文中顯式地調度它們自己的邏輯流。邏輯被模型化為狀態機,數據到達文件描述符后,主程序顯式地從一個狀態轉換到另一個狀態,因為程序是一個單獨的進程,所以所有的流都共享同一個地址空間。
- 線程:是一個運行在單一進程上下文中的邏輯流,由內核進行調度。可以將線程看作是其他兩種方法的混合體,像進程流一樣又內核進行調度,又像I/O多路復用流一樣共性同一個虛擬地址空間。
12.1 基於進程的並發編程
一個構造並發服務器的自然方法是,在父進程接受客戶端的連接請求后,創建一個新子進程為每個新客戶端提供服務。
12.2 基於I/O多路復用的並發編程
基本思路:使用select函數,要求內核掛起進程,只有在一個或多個I/O事件發生后,才將控制返回給應用程序。
12.3 基於線程的並發編程
12.4 多線程程序中的共享變量
12.5 用信號量同步線程
12.6 使用線程提高並行性