本博客由個人對於 深入理解計算機系統(第三版) 一書的學習筆記整理而成
挺亂的,也挺簡略,畢竟整理筆記也挺麻煩的(
計算機系統漫游
先看一段代碼:
#include<stdio.h>
int main()
{
printf("Hello, world\n");
return 0;
}
讓我們看看這段程序的組成,以及它是如何運行的
程序組成
可以看到,這段程序是以字節序列的方式存儲在文件中的,每個字節都有一個整數值,對應某些字符,這就是ASCII碼
只由ASCII碼組成的文件稱為文本文件,其余文件稱為二進制文件
程序編譯過程
像hello.c這樣的高級語言寫出來的程序,雖然能讓人看懂,但卻無法在系統上直接運行。為了能讓系統也讀懂這段代碼,需要對該代碼進行多次轉換
-
預處理階段
預處理器(cpp)根據以字符#開頭的命令,修改原始的C程序,主要是將讀取的系統頭文件stdio.h中的內容插入到程序文本中。所得的另一個C程序以.i作為文件擴展名
-
編譯階段
編譯器(cll)將hello.i程序翻譯為匯編語言,翻譯后的文件以.s作為文件擴展名。這里只放出main函數的匯編語言:
匯編語言為不同的高級語言的不同編譯器提供了通用的輸出語言
-
匯編階段
匯編器(as)將hello.s程序翻譯為機器語言指令,並將其打包成可重定位目標程序的格式,並將結果保存在hello.o中。這是一個二進制文件
-
鏈接階段
因為hello程序中調用了printf函數,這是標准C語言庫中的一個函數,存在與一個名為printf.o的單獨的預編譯好了的文件中。為了調用此函數,就必須將這個文件以某種方式合並到我們的程序中,鏈接器(ld)就負責處理這種合並。最終得到的hello文件,就是一個可執行文件,可以被加載到內存中,由系統使用
系統的硬件組成
-
總線
貫穿整個系統的一組點句子管道,攜帶信息字節並負責在各個部位間傳遞。通常被設計為傳送定長的字節塊
-
I/O 設備
I/O(輸入/輸出)設備時系統與外部世界的聯系通道,如作為輸入設備的鍵盤鼠標,作為輸出設備的顯示器等。通過控制器與適配器與I/O總線相連
-
主存
一個臨時存儲設備,用於存放程序和程序處理的數據
-
處理器
中央處理單元(CPU)簡稱處理器,是解釋(或執行)存儲在主存中指令的引擎
處理器的核心是一個大小為一個字的存儲設備(或寄存器),稱為程序計數器(PC)。PC會一直指向主存中的某條機器語言指令,並進行執行
CPU執行指令的過程圍繞着主存,寄存器文件(register file)和算術/邏輯單元(ALU)進行。寄存器文件是一個小的存儲設備,由一些單個字長的寄存器組成,且每個寄存器都有唯一的名字。ALU則計算新的數據和地址值
CPU大致能夠執行以下一些操作:
- 加載:從主存復制一個字節或者一個字到寄存器,覆蓋寄存器原來的內容
- 存儲:從寄存器復制一個字節或者一個字到主存中的某個位置,覆蓋該位置上原本的內容
- 操作:把兩個寄存器的內容復制到ALU,ALU對這兩個字做算術運算 ,並將結果存放到一個寄存器中
- 跳轉:從指令本身中抽取一個字,將這個字輔助到PC中,覆蓋PC原本的值
等等
程序運行過程
接下來我們看看hello程序在運行過程中都發生了什么:
若我們要在Unix系統中執行hello程序,就需要將程序的文件名輸入到一個名為shell的應用程序中
我們在鍵盤上輸入"./hello"字符串后,shell程序將字符逐一讀入寄存器,再將其存放到內存中
當我們敲下回車鍵時,shell程序就知道我們已經結束了命令的輸入,shell會執行一系列指令加載可執行的hello文件。這些指令將hello目標文件中的代碼和數據從磁盤復制到主存。這里利用了直接存儲器存取(DMA)技術,讓數據可以不通過處理器而直接從磁盤到主存
目標文件hello中的代碼和數據被加載到主存后,處理器就開始執行hello程序的main函數中的機器語言指令。這些指令將"hello, world\n"字符串中的字節從主存復制到寄存器文件,再從寄存器文件中復制到顯示設備,最終顯示在屏幕上
抽象
文件是對I/O設備的抽象,虛擬內存是對主存和I/O設備的抽象,進程是對處理器,主存和I/O設備的抽象
進程
程序運行時系統看上去總是只有這個程序在運行,就好像這個程序獨占了CPU,主存和I/O設備。但運行程序的數量總比CPU數量多,這是由上下文切換實現的
在任何一個時刻,單處理器系統都只能執行一個進程的代碼。當操作系統決定要吧控制權從當前進程轉移到新進程時,就會發生上下文切換。CPU會不斷切換正在執行的進程,給人CPU在並發地執行多個進程的感覺
線程
現代系統中,一個進程可以由多個稱為線程的執行單元組成。每個線程都運行在進程的上下文中,並共享代碼和全局數據
虛擬內存
虛擬內存提供了一個假象:每個進程都在獨占地使用主存。每個進程看到的內存都是一致的,稱為虛擬地址空間
每個進程看到的虛擬地址空間都由大量准確定義的區構成,每個區都有專門的功能。
文件
文件就是字節序列,每個I/O設備,包括磁盤,鍵盤,顯示器,甚至網絡,都可以看成是文件。
文件向應用程序提供了一個統一的視圖,來讓程序可以在使用不同磁盤技術的不同系統上運行