標籤:重定位 ext 進程 cdc 封裝 大量 編碼 nal 組合語言
漫遊了什麼
第一章主要對電腦系統進行一個概述,我也提取每一個小點來進行簡要的記錄。
作者從一個hello.c程式講述了:
- 從儲存,編譯,執行的過程,講解了文本儲存形式,並講解了此過程所需要的硬體支撐。
- 從執行中資料的多次複製,講到了讀取的速度以及儲存空間層次架構。
- 從hello程式和shell的互動,講到了進程,線程以及並發的概念等。
對於進程,並發等我並沒做出摘要,一是因為這是老生常談的問題,作者在第一章也只是介紹了概念。二是因為在書的後面會詳細講解,故沒有記錄。
1.1 資訊就是位+上下文
通過hello.c來說明資訊是怎麼表示的:
#include <stdio.h>int main(){ printf("hello,world\n"); return 0;}
這個hello.c來源程式就是一個0和1組成組成的位元序列,8個位組成一個位元組,每個位元組又用ASCII表示:
稱為文字檔,其它檔案稱為二進位檔案。
1.2 程式被其它程式翻譯成不同的格式
在Unix系統上執行:
gcc -o hello hello.c
從來源程式hello.c到可執行檔hello裡面有四個階段的事情,這四個階段構成了編譯系統:
- 前置處理器。 根據字元#的開頭(標頭檔,宏定義等),修改原始C程式。如讀取系統標頭檔插入程式文本,得到另一個C程式。通常以.i結尾。
- 編譯器。 將.i翻譯成.s檔案,包含一個組合語言程式。
- 彙編階段。 將.s檔案翻譯成機器語言指令,把這些指令打包成可重定位目標程式。 將結果儲存在.o檔案中。所以.o檔案是一個二進位檔案,包含的是指令編碼。
- 連結階段。 比如我們的hello程式調用了printf函數,而它存在於printf.o中,我們要把這個目標檔案和hello.c合并起來。連結(ld)就是處理這種合并。
最後我們得到可執行檔hello,載入到記憶體中,由系統執行。
1.4 處理器讀並解釋儲存在記憶體中的指令
我們運行hello程式時是把檔案名稱輸入到shell應用程式中:
./hello
如果該命令列的第一個單詞不是一個內建的shell命令,那麼shell就會假設這是一個可執行檔的名字,它將載入並運行這個檔案!
為了理解是如何啟動並執行,我們還需要理解系統硬體組成。
1.4.1 系統的硬體組成
- 匯流排。 攜帶資訊位元組並在各個組件之間傳遞。通常匯流排被設計成傳送定長的位元組塊,也就是字。
- I/O裝置。 我們的hello程式用到的有鍵盤、滑鼠、顯示器、磁碟。一開始hello就放在磁碟上面。每一個I/O裝置都通過一個適配器或控制器與I/O匯流排相連。他們的不同在於封裝方式:
- 適配器:一塊插在主板插槽上的卡。
- 控制器:是I/O裝置本身或者系統的主板。
- 主存。 臨時存放裝置,在執行程式時用來存放程式和程式處理的資料。
- 處理器。 即CPU,解釋或執行儲存在主存中指令的引擎。處理器核心是一個大小為一個字的存放裝置(或寄存器),成為程式計數器(PC).處理器執行一條指令的步驟:
- 從PC指向的記憶體處讀取指令。
- 解釋指令中的位,執行指令指示的簡單操作。
- 更新PC,指向下條指令(不一定和上一條相鄰)。
1.4.2 運行hello程式讀取部分
下面這張圖顯示了hello程式在硬體上是執行的前半部分(讀取hello命令):
首先,從鍵盤上輸入hello命令,經過匯流排,存入寄存器,放到記憶體中。當我們鍵入斷行符號時,shell就知道我們結束了命令的輸入。
於是它執行一系列指令來載入可執行檔hello檔案,這些指令將hello目標檔案中的代碼和資料從磁碟複製到主存。 包括最終會輸出的字串。
輸出部分
下面這張圖顯示了輸出部分:
一旦目標檔案的代碼和資料載入到主存,處理器就開始執行hello程式的main程式中的機器語言指令。 它將“hello,world\n”字串中的位元組從主存複製到機器存起檔案,再從寄存器檔案複製到顯示裝置。
1.5 快取至關重要
以上程式執行中花費了大量時間複製資訊:
hello程式機器指令從磁碟-->主存-->處理器-->主存-->顯示裝置。
根據機械原理,大存放裝置運行比小存放裝置慢。比如磁碟可能比主存大1000倍,但是cpu從磁碟讀取一個字比從主存中讀取開銷大1000萬倍。
根據此差異,設計了快取儲存空間(簡稱cache或快取)。
它作為暫時的集結地區,存放處理器近期可能會需要的資訊。
儲存空間 |
容量 |
讀取速度 |
寄存器檔案 |
幾百個位元組 |
t |
L1 |
數萬位元組 |
t |
L2 |
數十萬到百萬位元組 |
5t |
主存 |
幾十億位元組 |
25~50t |
L1和L2是用一種靜態隨機訪問儲存空間(SRAM) 來實現的。
儲存空間階層的主要思想是上一層的儲存空間作為低一層儲存空間的快取。
1.9 重要主題1.9.1 Amdahl定律
假設某應用程式原本執行時間為T0。某部分執行時間佔總時間比例為a,若該部分效能提升比例k(即現在這部分時間為a*T0/k),則現在總執行時間為:
T = (1 - a) * T0 + a * T0 / k.
化簡得:
T0/T = 1 / [1 - a] + a / k
將之稱為加速比S。當k趨向無窮大時,S = 1 / (1 - a).
1.9.3 電腦系統中抽象的重要性
四個抽象:
- 檔案是對I/O裝置的抽象。
- 虛擬記憶體是對程式儲存空間的抽象。
- 進程是對一個正在啟動並執行程式的抽象。
- 虛擬機器是對整個電腦的抽象。
書上的1.10小結部分就是對以上的一個很簡要的概括,可以通讀一遍,這邊就不再累述。
以上就是第一章——電腦系統漫遊的學習摘要。
一、電腦系統漫遊