深入理解計算機系統
Capture One: A Tour of Computer Systems
理解hello.c的執行過程:
編譯過程
C語言hello world程序的編譯過程:
命令:Unix>gcc -o hello hello.c
生成hello
可執行文件
分爲四個階段 預處理
-》 編譯
-》裝配
-》鏈接
#
開頭的指令,修改C源程序,結果爲以.i
爲後綴的C源程序; hello.i
翻譯(translate)成hello.s
,其中包含了彙編語言程序(assembly-language program)。其中的每一條語句代表了一個低級的機器語言指令。 hello.s
翻譯成機器語言指令,打包成可定位目標程序(relacatable object program)並將其存儲在hello.o
文件中,這是一個二進制文件,而不是文本文件。 printf
函數保存在由C編譯器提供的printf.o
文件中,鏈接器(ld)將它與我們的hello.o
文件鏈接起來,結果是hello
可執行文件。執行過程
執行命令unix> ./hello
計算機系統的硬件結構:
1,讀取`hello`命令
2,將可執行文件拷貝到主存中
3,將`hello, world`字符串輸出到屏幕上
計算機系統的cache和分層存儲結構:
緩存的原理:局部性(locality)
分層結構中,寄存器爲最上層,L0層,三級緩存分別爲L1, L2, L3層。主存爲L4層,等等。
主要idea是上層存儲器作爲其下層的緩存。
操作系統
兩個目的:
操作系統通過基本的抽象做到這一點。
Process (進程)
進程是操作系統對一個運行的程序的抽象。處理器通過在不同的進程間切換(上下文切換 context switching)使得多個進程併發的執行;
進程虛地址空間
malloc
和free
分配和釋放;