Q:源代碼是怎么變成可執(zhí)行文件的朴爬,每一步的作用是什么?
(預(yù)編譯橡淆,詞法分析召噩,語法分析,語義分析逸爵,中間語言生成目標(biāo)代碼生成具滴,匯編,鏈接)
步驟如下:
1师倔、驅(qū)動程序首先調(diào)用C預(yù)處理器(CPP)把源文件翻譯成一個ASCII中間文件mian.i构韵,預(yù)處理器會把#include所包含的內(nèi)容都插入到聲明的位置,并且做宏替換趋艘,把main.c 文件的第3行 的SIZE替換成2(注意這里只是做簡單的文本替換)疲恢。
2、接下來驅(qū)動程序的C編譯器將main.i翻譯成匯編語言程序main.s
3瓷胧、然后驅(qū)動程序的匯編器將匯編語言程序main.s 翻譯成可重定位的二進(jìn)制文件main.o
4显拳、最后運行鏈接器將main.o 與swap.o 以及一些必要的系統(tǒng)目標(biāo)文件(比如你將調(diào)用的printf函數(shù)就是printf.o)連接起來變成一個可執(zhí)行的二進(jìn)制文件。
Q:虛擬內(nèi)存空間是什么抖单,為什么要有虛擬內(nèi)存空間萎攒。
所謂的虛擬地址空間,是指應(yīng)用程序自己認(rèn)為矛绘,自己所處的地址空間。它區(qū)別于物理地址空間刃永。后者是真實存在的货矮,比如電腦有一根8G的內(nèi)存條,物理地址空間就是0~8Gb斯够。CPU的MMU負(fù)責(zé)把虛擬地址轉(zhuǎn)換成物理地址囚玫。
因為 虛擬地址空間可以大于物理地址空間喧锦,進(jìn)行分頁交換,彌補了進(jìn)程太多時抓督,物理地址空間不夠用燃少。
Q:靜態(tài)鏈接和動態(tài)鏈接分別表示什么
靜態(tài)鏈接:在生成可執(zhí)行文件的時候(鏈接階段),把所有需要的函數(shù)的二進(jìn)制代碼都包含到可執(zhí)行文件中去铃在。
缺點:程序體積會相對大一些阵具。
動態(tài)鏈接:在編譯的時候不直接拷貝可執(zhí)行代碼,而是通過記錄一系列符號和參數(shù)定铜,在程序運行或加載時將這些信息傳遞給操作系統(tǒng)阳液,操作系統(tǒng)負(fù)責(zé)將需要的動態(tài)庫加載到內(nèi)存中,然后程序在運行到指定的代碼時揣炕,去共享執(zhí)行內(nèi)存中已經(jīng)加載的動態(tài)庫可執(zhí)行代碼帘皿,最終達(dá)到運行時連接的目的。
缺點: 由于是運行時加載畸陡,可能會影響程序的前期執(zhí)行性能鹰溜。
Q:進(jìn)程的內(nèi)存格局是怎樣的?(堆丁恭、棧奉狈、全局/靜態(tài)區(qū),代碼區(qū)涩惑,常量區(qū))
Q:堆和棧的區(qū)別仁期,函數(shù)調(diào)用和棧的關(guān)系
一個由C/C++編譯的程序占用的內(nèi)存分為以下幾個部分
1、棧區(qū)(stack)— 由編譯器自動分配釋放 竭恬,存放函數(shù)的參數(shù)值跛蛋,局部變量的值等。其
操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧痊硕。
2赊级、堆區(qū)(heap) — 一般由程序員分配釋放, 若程序員不釋放岔绸,程序結(jié)束時可能由OS回
收 理逊。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式倒是類似于鏈表盒揉,呵呵晋被。
3、全局區(qū)(靜態(tài)區(qū))(static)—刚盈,全局變量和靜態(tài)變量的存儲是放在一塊的羡洛,初始化的
全局變量和靜態(tài)變量在一塊區(qū)域, 未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另
一塊區(qū)域藕漱。 - 程序結(jié)束后由系統(tǒng)釋放欲侮。
4崭闲、文字常量區(qū) —常量字符串就是放在這里的。 程序結(jié)束后由系統(tǒng)釋放
5威蕉、程序代碼區(qū)—存放函數(shù)體的二進(jìn)制代碼刁俭。
棧和堆的區(qū)別:
棧由系統(tǒng)自動分配,堆由程序員自己申請管理
申請大小的限制:iOS棧為一塊連續(xù)的內(nèi)存韧涨,最大為1M,堆是不連續(xù)的牍戚,受限于計算機(jī)的虛擬內(nèi)存,由此可見氓奈,堆獲取的空間比較靈活翘魄。
申請效率,棧由系統(tǒng)分配,速度較快舀奶。堆由malloc分配暑竟,速度慢,容易產(chǎn)生內(nèi)存碎片育勺。
堆和棧的存貯內(nèi)容:
棧:在函數(shù)調(diào)用的時候但荤,第一個進(jìn)棧的是執(zhí)行函數(shù)后的笑一個指令,然后是函數(shù)的參數(shù),然后是函數(shù)里面的局部變量.出棧和這個相反.
堆:堆的頭部用一個字節(jié)存放堆的大小.
Q:進(jìn)程和線程的區(qū)別
進(jìn)程:是程序運行的實例涧至,是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個獨立單位腹躁,它包括獨立的地址空間,資源以及1個或多個線程南蓬。
線程:可以看成是輕量級的進(jìn)程纺非,是CPU調(diào)度和分派的基本單位。
區(qū)別:
1.調(diào)度 :從上面的定義可以看出一個是調(diào)度和分派的基本單位赘方,一個是擁有資源的基本單位
2.共享地址空間烧颖,資源:進(jìn)程擁有各自獨立的地址空間,資源窄陡,所以共享復(fù)雜炕淮,需要用IPC,同步簡單跳夭; 線程共享所屬進(jìn)程的資源涂圆,共享簡單,但同步復(fù)雜币叹,要通過加鎖等措施润歉。
3.占用內(nèi)存,cpu: 進(jìn)程占用內(nèi)存多套硼,切換復(fù)雜卡辰,CPU利用率低; 線程占用內(nèi)存少邪意,切換簡單九妈,CPU利用率高。
4.相互影響: 進(jìn)程間不會相互影響雾鬼; 一個線程掛掉會導(dǎo)致整個進(jìn)程掛掉萌朱。