第一章計算機系統漫遊_CSAPP學習筆記
第一章計算機系統漫遊
注:這篇筆記並 不是為了讓你在看過書的情況下直接讀筆記就能學會CSAPP,這篇筆記並不會寫得比原書更好,筆記是對書本知識的要點的提煉,並且帶有很強的主觀性,本人也是隻初學者,如有偏頗,請多多見諒。
1.1資訊就是位 + 上下文
程式以位元組序列的方式儲存在檔案中,我們輸入的每一個字母,每一個符號,都對應這ASCII碼錶中的一個整數值,將該整數值轉換為一個二進位制位元組序列。因此我們可以說系統中的所有資訊,都是由一串位元表示的
疑問
這裡的上下文是指 int double 這樣的上下文吧
1.2 程式被其他程式翻譯成不同的格式
將.c檔案翻譯成可執行檔案的四個階段
四個階段的具體含義
預處理:將標頭檔案(stdio.h)的內容 插入程式文字中,得到另一個c程式,但是以.i 作為檔案拓展名
編譯階段: 編譯器將文字檔案hello.i 翻譯成 hello.s 檔案
彙編階段: 將hello.s 翻譯成 機器語言指令,並儲存在hello.o中
連結階段: 程式中呼叫了 printf函式,該函式存在於一個名叫printf.o的預編譯檔案中,連結器將printf.o檔案合併到我們的hello.o檔案中, 最終得到一個hello檔案,這是一個可執行檔案,被載入到記憶體中,由系統執行。
1.3 瞭解編譯系統如何工作是大有益處的
有什麼益處?
- 優化程式效能(例如:一個switch語句是否總比一系列的if -else 更有效)
- 理解連結時出現的錯誤(即與連結器操作有關的一些程式錯誤)
- 避免安全漏洞 (要限制從不受信任的源接收資料的數量和格式,理解資料和控制資訊儲存在程式棧上的方式會引起的後果)
疑問
第二個益處:理解連結時出現的疑問,我對這方面的知識嚴重缺乏。
1.4處理器讀並解釋儲存在記憶體中的指令
1.4.1系統的硬體組成
這部分知識在計組中講得非常多
系統硬體組成的四個部分是哪四個?
匯流排: 傳送定長的位元組塊,位元組塊 又名 字。
字的字長是一個基本的系統引數,現在大多數機器 要麼是 32位,要麼是 64位
I/O裝置: I/O裝置通過介面卡或控制器與匯流排通訊
主存:存放程式和程式處理的資料
處理器:在任何時候,PC都指向主存中的某條機器語言指令(即含有該條指令的地址)
1.4.2 執行hello程式
執行hello程式的流程是什麼樣的
可以分為三個階段: (以hello.c為例子)從鍵盤上讀取hello命令 --> 從磁碟載入可執行檔案到主存 --> 將輸出字串此部分儲存器寫到顯示器
從鍵盤上讀取hello命令:
從磁碟載入可執行檔案到主存:
利用DMA技術, 將儲存在磁碟上的hello可執行檔案 直接儲存到主存
將輸出字串從儲存器寫到顯示器:
疑問
這個經過簡略的過程非常簡單了
不明白hello可執行檔案從哪裡來,在1.2中翻譯的四個步驟在這個過程的哪個部分沒說清楚
1.5快取記憶體至關重要
現狀:處理器從暫存器檔案中讀取資料比從主存中讀取幾乎快100倍,且這個差距在加大
問題: 在主存中讀取一個字的 時間開銷 要比 從暫存器中讀取一個字 的 時間開銷* 大得多
解決方案: 快取記憶體, 讓快取記憶體中存放可能經常訪問的資料, 大部分記憶體操作都能在快讀的快取記憶體中完成
1.6儲存裝置形成層次機構
主要思想: 將上一層的儲存器作為低一層的儲存器
1.7作業系統管理硬體
作業系統的兩個基本功能是什麼?
1.7.1 程序
什麼是程序?
一個CPU 能在 同時 執行多個程式嗎?
什麼是併發執行?
什麼是上下文切換?
1.7.2 執行緒
什麼是執行緒?
多執行緒之間比多程序之間更容易共享資料,也因為執行緒一般比程序更高效。
1.7.3 虛擬記憶體
虛擬地址空間由哪些部分組成?
- 程式程式碼和資料
- 堆
- 共享庫
- 棧
- 核心虛擬記憶體
1.7.4 檔案
什麼是檔案?有哪些計算機元件可以看成是檔案?
1.8 系統之間利用網路通訊
從一個單獨的系統來看,網路可以視為一個I/O裝置
1.9 重要主題
1.9.1 Amdahl定律
Amdahl定律的主要觀點是什麼?
1.9.2 併發和並行
這部分感覺全是概述,很難寫筆記,以後再補上
1.9.3 計算機系統中抽象的重要性
為什麼要使用 抽象 來理解計算機系統呢?
個人看法: 如果要對底層硬體進行描述,太過複雜精細, 但如果能將底層硬體上 抽象出 一個簡單的模型,而後我們來使用這個模型, 程式的書寫和執行過程將會簡單非常多。
本書目前提到過哪些抽象?
檔案是對I/O裝置的抽象
虛擬記憶體是對程式儲存器的抽象
程序是對一個正在執行的程式的抽象
虛擬機器是對 整個計算機的抽象