Content
1.1 信息就是位 + 上下文
hello 程序的生命週期是從一個源程序(或者說是源文件)開始的。源程序由 0 和 1 組成的位(bite
),8 個位爲一個字節。
hello.c
的ASCII
文本表示
# | i | n | c | l | u | d | e | SP | < | s | t | d | i | o | . | h | > |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
35 | 105 | 110 | 99 | 108 | 117 | 100 | 101 | 32 | 60 | 115 | 116 | 100 | 105 | 111 | 46 | 104 | 62 |
\n | \n | i | n | t | \n | m | a | i | n | ( | ) | \n | { | \n | SP | SP | SP |
10 | 10 | 105 | 110 | 116 | 10 | 109 | 97 | 105 | 110 | 40 | 41 | 10 | 123 | 10 | 32 | 32 | 32 |
SP | p | r | i | n | t | f | ( | “ | h | e | l | l | o | , | SP | w | o |
32 | 112 | 114 | 105 | 110 | 116 | 102 | 40 | 34 | 105 | 101 | 108 | 108 | 111 | 44 | 32 | 119 | 111 |
r | l | d | \ | n | “ | ) | ; | \n | SP | SP | SP | SP | r | e | t | u | r |
114 | 108 | 100 | 92 | 110 | 34 | 41 | 59 | 10 | 32 | 32 | 32 | 32 | 114 | 110 | 116 | 117 | 114 |
n | SP | 0 | ; | \n | } | \n | |||||||||||
110 | 32 | 48 | 59 | 10 | 125 | 10 |
1.2 程序被其他程序翻譯成不同版本
在Unix系統上,從源文件到目標文件的轉化是由 編譯器驅動程序 完成的。
Linux$ gcc hello.c -o hello
編譯執行四個階段
預處理
讀取頭文件,修改源程序。
編譯階段
翻譯成文本hello.s,其中包含彙編語言程序。main函數如下:
1 main:
2 subq $8, %rsp
3 movl $.LC0, %edi
4 call puts
5 movl $0, %eax
6 addq $8, %rsp
7 ret
彙編階段
翻譯成機器語言hello.o
文件。
鏈接階段
合併其他庫函數文件到hello
文件中(這裏指printf.o
文件)。
1.4 處理器讀並解釋儲存在內存中的指令
linux$ ./hello
hello, world
linux$
1.4.1 系統的硬件組成
1. 總線
貫穿整個系統的是一組電子管道,稱作總線。
2. I/O 設備
I/O (輸入/輸出)設備是系統與外部世界的聯繫通道。
3. 主存
主存是一個臨時存儲設備(動態隨機存取存儲器DRAM
芯片組成),在CPU
執行程序時,用來存放程序和程序處理的數據。
4. 處理器
中央處理單元(CPU
),簡稱處理器,是解釋(或者執行)存儲在主存中指令的引擎。
1.4.2 運行 hello 程序
1.5 高速緩存至關重要
1.6 存儲設備形成層次結構
1.7 操作系統管理硬件
操作系統有兩個基本功能:
(1)防止硬件被失控的應用程序濫用;
(2)嚮應用程序提供簡單一致的機制來控制複雜而又通常大不相同的低級硬件設備。
1.7.1 進程
進程是操作系統一個正在運行的程序的抽象。而併發運行,則是說一個進程的指令和另一個進程的指令是交錯執行的。
操作系統保持跟蹤進程運行所需的所有狀態信息。這種狀態稱爲上下文。
1.7.2 線程
一個進程可以由多個線程的執行單元組成。
1.7.3 虛擬內存
虛擬內存是一個抽象概念,其爲每個進程提供一個假象,即每個進程都在獨佔地使用主存。
每個進程看到的內存都是一致的,稱爲虛擬地址空間。
幾個概念:
程序代碼和數據。
堆。
共享庫。
棧。
內核虛擬內存。
1.7.4 文件
文件就是字節序列。
1.9 重要主題
1.9.1 Amdahl 定律
若系統執行某應用程序需要時間爲Told
。 假設系統某部分所需執行時間與該時間的比例爲a
, 而該部分性能提升比例爲k
。即該部分初始所需時間爲a * Told
, 現在所需時間爲(a * Told)/ k
。因此,總的執行時間應爲:
Tnew = (1 - a) * Told + (a * Told) / k = Told * [(1 - a) + a / k ]
由此,可以計算加速比 S = Told / Tnew
爲
S = 1 / [(1 - a) + a / k ]
1.9.2 併發和並行
併發指一個同時具有多個活動的系統。
並行指用併發來使一個系統運行的更快。
超線程有時稱爲同時多線程(simultaneous multi-threading
),是一項允許一個CPU執行多個控制流的技術。
指令級並行在較低的抽象層次上,現代處理器可以同時執行多條指令的屬性。
超標量(super-scalar
)處理器是指處理器可以達到比一個週期一條指令更快的執行速率。
單指令、多數據(SIMD
並行)指在最低層次上,擁有特殊的硬件的處理器,允許一條指令產生多個可以並行執行的操作。
1.9.3 計算機系統中抽象的重要性
抽象的使用是計算機科學中最爲重要的概念之一。
例如: 應用程序接口(API
)。
例如:指令集架構提供了對實際處理器硬件的抽象。
1.10 小結
計算機系統是由硬件和系統軟件組成的,他們共同協作以運行應用程序。計算機內部的信息被表示爲一組組的位(bite),他們依據上下文有不同的解釋方式。程序被其他程序翻譯成不同的形式,開始時是ASCII文本,然後被編譯器和鏈接器翻譯成二進制的可執行文件。
處理器讀取並解釋存放在主存裏的二進制指令。因爲計算機花費了大量的時間在內存、I/O 設備和CPU寄存器之間複製數字,所以將系統中的存儲設備劃分爲層次結構——CPU寄存器在頂部,接着是多層的硬件高速緩存存儲器、DRAM主存和硬盤存儲器。在層次模型中,位於更高層的存儲設備比底層的存儲設備要更快,單位比特造價也更高。層次結構中較高層次的存儲設備可以作爲較低層次設備的高速緩存。通過理解和運用這種存儲層次結構的知識,程序員可以優化C程序的性能。
操作系統內核是應用程序和硬件之間的媒介。它提供三個抽象: 1)文件是對 I/O 設備的抽象; 2) 虛擬內存是對主存和硬盤的抽象; 3) 進程是處理器、主存和 I/O 設備的抽象。
最後,網絡提供了計算機系統間通信的手段。從特殊系統的角度來看,網絡是一種 I/O 設備。