標籤:
源檔案:0, 1 組成每行以一個看不見的’\n’結尾,
執行一個源檔案分四個階段:預先處理, 編譯,彙編,串連
.i 檔案:.c檔案預先處理後產生
.ii檔案: .cpp檔案預先處理後產生
- 預先處理階段:前置處理器(cpp)根據以#開頭的命令修改來源程式,(如把一些標頭檔的內容,直接插入到程式文本中)
- 編譯階段。編譯器(ccl)將.i 文本翻譯成 .s 文本,他包含了一個組譯工具,組合語言程式中沒儀錶語句都以一種標準的額問題本格式確切的描述了一條低級機器語言指令
- 彙編階段。彙編器(as) 將.s 檔案翻譯成機器語言指令,並將其打包成可重定位目標程式的格式。並將結構儲存在.o 檔案中,.o檔案是一個二進位檔案,他的編碼是機器語言指令而不是字元,所以當我們用文開啟.o檔案是看到的是一堆亂碼。
-連結階段。比如在剛剛的程式中調用了printf函數,他是每一個c編譯器都會提供的標準C庫的一個程式,它存在一個名為printf.o的單獨先行編譯好的目標檔案中,而這個檔案必須以某種方式合并到hello.o程式中,連接器就是負責處理這種合并的,並產生可執行檔
要想在unix上執行可執行檔,我們需要將他的檔案名稱輸入到shell的應用程式中
shell是一個命令列解譯器,它輸出一個提示符,等待命令輸入,然後執行命令,如果輸入的不是一個內建的shell命令,那麼shell就會假設這是一個可執行檔,並對其進行載入運行
系統的硬體組成
線程:一個進程實際上可以由多個稱為線程的執行單元組成,每個線程都運行在進程上下文中,並共用同樣的代碼和全域資料,
虛擬儲存空間:一個抽象概念,它為每個進程提供了一個假象,即每個進程都在獨立地使用主存。Linux中,地址空間最上面的地區是為作業系統中的代碼和資料保留的,這對素有進程來說是一樣的,地址空間的地步存放使用者進程定義的資料和代碼
- 程式碼和資料。對所有的進程來數,代碼是從同一固定地址開始的,緊接著是C全域變數,代碼和資料區是直接按照可執行檔載入的,如的hello片段。
- 堆:代碼和資料區後是運行時堆,代碼和資料區是進程在一開始運行時就被規定了大小,但是堆可以在調用malloc和free等函數式動態擴充和收縮
- 共用庫:大約在地址空間的中間部分是用來存放C標準庫等這樣共用庫的代碼和資料的地區。
- 棧:位於使用者虛擬位址空間的頂部,編譯器用它來實現函數調用,和堆一樣,在程式執行期間可以動態地擴充和收縮。(調用函數會使得棧增加,從函數返回時,棧收縮)
- 核心虛擬儲存空間:核心總是駐留在記憶體中,是作業系統的一部分,不允許程式續寫,或直接調用核心代碼定義的函數。
檔案:位元組序列。I/O裝置,磁碟,鍵盤,顯示器都可視為檔案。
並行和並發
- 並發:值一個同事具有多個活動的系統
並行:是用並發使一個系統運行得更快
線程級並發:
- 超執行緒:有時稱為同時多線程,是一項允許一個CPU執行多個控制流程的技術。
指令級並發:在較低的抽象層次上,現代處理器可以同事執行多條指令
單指令,多資料並行:允許一條指令產生多個可以並存執行的操作,這種方式稱為單指令,多資料,
深入理解電腦系統學習(1)