CSAPP-计算机漫游
一.編譯系統的工作流程:
test.cpp?
#include <iostream> using namespace std; int main() { //hahha cout<<"hello world"<<endl; return 0; }直接生成可執行程序test
g++ -o test test.cpp
深入解析生成可執行程序test的過程
1.g++ -E test.cpp > test.i
這一步生成test.i進行預處理,做了宏的替換,注釋的消除,可看見//hahha不見了
2.g++ -S test.cpp
這一步生成test.s,表示生成匯編指令
3.g++ -c test.cpp?
這一步生成test.o,將匯編語言變成二進制機器代碼,生成目標文件,也就是二進制文件
利用反匯編工具查看這個機器代碼的匯編代碼:
objdump -d test_data.o
?
4.g++ test.o -o test
鏈接目標代碼生成可執行程序test
上述編譯過程產生了下面的文件
二.CPU結構
中央處理單元(Central Processing Unit , CPU),也稱處理器,包含 PC ( 程序計數
器:Program Count )、寄存器堆(Register file)、ALU(算數/邏輯計算單元:Arithmatic/logic Unit)三個部分.
程序計數器 PC:是一個 4 字節或是 8 字節的存儲空間,里面存放的是某一條指令的地址。從系統上電的那一瞬間,直到系統斷電,處理器就不斷地在執行PC 指向的指令,然后更新 PC,使其指向下一條要執行的指令(注意:這個下一條指令與剛剛執行的指令不一定是相鄰的)。
寄存器:可以理解為一個臨時存放數據的空間。例如計算兩個變量 a+b 的和,處理器從內存中讀取 a 的值暫存在寄存器 X 中,讀取 B 的值暫存在寄存器 Y中,這個操作會覆蓋寄存器中原來的數值,處理器完成加載的操作后,ALU(Arithmatic/logic Unit)會從復制寄存器 X 和 Y 中保存的數值,然后進行算術運算,得到的結果會保存到寄存器 X 或者寄存器 Y 中,此時寄存器中原來的數值會被新的數值覆蓋。
算數/邏輯計算單元 ALU:計算速度極快,且專攻算數與邏輯的計算,計算機核心部分.
主存(Main Memory),也稱為內存、運行內存,處理器在執行程序時,內存主要存放程序指令以及數據。從物理上講,內存是由隨機動態存儲器芯片組成;從邏輯上講,內存可以看成一個從零開始的大數組,每個字節都有相應地址.
內存和處理器之間通過總線來進行數據傳遞。實際上,總線貫穿了整個計算機系統,它負責將信息從一個部件傳遞到另外一個部件。通常總線被設計成傳送固定長度的字節塊,也就是字(word),至于這個字到底是多少個字節,各個系統中是不一樣的,32 位的機器,一個字長是 4 個字節;而 64 位的機器,一個字長是 8 個字節.
三.存儲設備的層次結構
對于處理器而言,從磁盤上讀取一個字所花費的時間開銷比從內存中讀取的開銷大1000 萬倍。寄存器文件的只能存儲幾百個字節的信息,而內存的可以存放幾十億的字節信息(GB 級),從寄存器文件讀取數據比從內存讀取差不多要快 100 倍。
隨著半導體技術的發展,處理器與內存之間的差距還在持續增大,針對處理器和內存之間的差異,系統設計人員在寄存器文件和內存之間引入了高速緩存(cache),比較新的,處理能力比較強的處理器,一般有三級高速緩存,分別為 L1 cache ,L2cache 以及 L3 cache。
L1 cache 的訪問速度與訪問寄存器文件幾乎一樣快,容量大小為數萬字節(KB 級別);L2 cache 的訪問速度是 L1 cache 的五分之一,容量大小為數十萬到數百萬字節之間;L3 cache 的容量更大,同樣訪問速度與 L2 cache 相比也更慢。?
四.操作系統作用
操作系統看成是應用程序和硬件之間的中間層,所有的應用程序對硬件的操作必須通過操作系統來完成。
?這樣設計的目的主要有兩個:
1 防止硬件被失控的應用程序濫用;
2 操作系統提供統一的機制來控制這些復雜的底層硬件
為了實現上述的功能,操作系統引入了幾個抽象的概念。例如:文件是對 IO 設備的抽象;虛擬內存是對內存和磁盤 IO 的抽象;進程是對處理器、內存以及 IO 設備的抽象。?
虛擬內存
操作系統為每個進程提供了一個假象,就是每個進程都在獨自占用整個內存空間,每個進程看到的內存都是一樣的,我們稱之為虛擬地址空間 .
虛擬地址空間分布:?Linux 的虛擬地址空間,從下往上看,地址是增大的。最下面是 0 地址。
代碼區:存儲代碼的二進制, 特點是只讀 共享.
全局區: 內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量,static 變量,常量等。其生命周期由操作系統控制.
堆區由程序員控制;類實例化之前是不占用堆和棧的,當實例化以后,采用不同方式就可以占用不用內存分區.
棧區由系統控制,在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。存放函數的參數值,局部變量等。
Kernel Memory:內核保留的區域,應用程序代碼不能讀寫這個區域的數據.
?所有的 IO 設備,包括鍵盤,磁盤,顯示器,甚至網絡,這些都可以看成文件,
系統中所有的輸入和輸出都可以通過讀寫文件來完成.
五.多核處理器結構
參考:
【合集】CSAPP-深入理解計算機系統_嗶哩嗶哩_bilibili
總結
以上是生活随笔為你收集整理的CSAPP-计算机漫游的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python .py文件变为.so文件进
- 下一篇: 由二分查找算法学习算法的时间复杂度