1. 程式人生 > 其它 >第一章計算機系統漫遊_CSAPP學習筆記

第一章計算機系統漫遊_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 瞭解編譯系統如何工作是大有益處的

有什麼益處?

  1. 優化程式效能(例如:一個switch語句是否總比一系列的if -else 更有效)
  2. 理解連結時出現的錯誤(即與連結器操作有關的一些程式錯誤)
  3. 避免安全漏洞 (要限制從不受信任的源接收資料的數量和格式,理解資料和控制資訊儲存在程式棧上的方式會引起的後果)

疑問

第二個益處:理解連結時出現的疑問,我對這方面的知識嚴重缺乏。

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. 程式程式碼和資料
  2. 共享庫
  3. 核心虛擬記憶體

1.7.4 檔案

什麼是檔案?有哪些計算機元件可以看成是檔案?

1.8 系統之間利用網路通訊

從一個單獨的系統來看,網路可以視為一個I/O裝置

1.9 重要主題

1.9.1 Amdahl定律

Amdahl定律的主要觀點是什麼?

1.9.2 併發和並行

這部分感覺全是概述,很難寫筆記,以後再補上

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

為什麼要使用 抽象 來理解計算機系統呢?

個人看法: 如果要對底層硬體進行描述,太過複雜精細, 但如果能將底層硬體上 抽象出 一個簡單的模型,而後我們來使用這個模型, 程式的書寫和執行過程將會簡單非常多。

本書目前提到過哪些抽象?

檔案是對I/O裝置的抽象
虛擬記憶體是對程式儲存器的抽象
程序是對一個正在執行的程式的抽象
虛擬機器是對 整個計算機的抽象

1.10 小結