-
問:程序鏈接過程是把不同的程序段鏈接起來,是不是因?yàn)橛械暮瘮?shù)是用單獨(dú)的頭文件寫著,所以需要include,鏈接的過程就是找到這些include文件然后把函數(shù)復(fù)制到代碼中呀
答:首先第一句話,程序鏈接過程是將多個(gè)目標(biāo)文件、庫拼合成最終的可執(zhí)行文件,程序生成可執(zhí)行文件的過程如下:
image.png
事實(shí)上處理#include是在預(yù)處理階段就完成了,怎么完成?將被包含的文件插進(jìn)到該指令的位置。
這時(shí)問題又來了,上圖所示的幾個(gè)過程分別是什么意思?
預(yù)處理:主要是做一些代碼文本的替換工作。刪除所有的注釋//與/* */、將所有的#define刪除,并展開所有的宏定義、處理#include預(yù)編譯指令,將被包含的文件插進(jìn)到該指令的位置。
編譯:把預(yù)處理完的文件進(jìn)行一系列詞法分析、語法分析、語義分析及優(yōu)化后生成匯編代碼。
匯編:匯編代碼->機(jī)器指令。
鏈接:這里講的鏈接,嚴(yán)格說應(yīng)該叫靜態(tài)鏈接。多個(gè)目標(biāo)文件、庫->最終的可執(zhí)行文件(拼合的過程)。 問:那每次鏈接的時(shí)候如果調(diào)用了很多外部函數(shù),那鏈接的時(shí)候不是要浪費(fèi)很多時(shí)間在復(fù)制這些函數(shù)上?
答:靜態(tài)鏈接確實(shí)是將函數(shù)的代碼從其所在地(目標(biāo)文件或靜態(tài)鏈接庫中)拷貝到最終的可執(zhí)行程序中。動(dòng)態(tài)鏈接不是的。問:動(dòng)態(tài)鏈接和靜態(tài)鏈接我還是沒弄明白,靜態(tài)鏈接是有幾個(gè)代碼調(diào)用這個(gè)函數(shù),那這個(gè)函數(shù)就要復(fù)制幾份;動(dòng)態(tài)鏈接就是用到這個(gè)函數(shù)的時(shí)候調(diào)用這個(gè)函數(shù),這個(gè)時(shí)候難道不復(fù)制?那是怎么用的,要是多個(gè)程序都要?jiǎng)討B(tài)鏈接這個(gè)函數(shù)那怎么弄?
答:動(dòng)態(tài)鏈接庫只提供符號(hào)表和其他少量信息用于保證所有符號(hào)引用都有定義,保證編譯順利通過。動(dòng)態(tài)鏈接器(ld-linux.so)鏈接程序在運(yùn)行過程中根據(jù)記錄的共享對(duì)象的符號(hào)定義來動(dòng)態(tài)加載共享庫,然后完成重定位。在此可執(zhí)行文件被執(zhí)行時(shí),動(dòng)態(tài)鏈接庫的全部?jī)?nèi)容將被映射到運(yùn)行時(shí)相應(yīng)進(jìn)程的虛地址空間。動(dòng)態(tài)鏈接程序?qū)⒏鶕?jù)可執(zhí)行程序中記錄的信息找到相應(yīng)的函數(shù)代碼,函數(shù)代碼并沒有復(fù)制到可執(zhí)行文件中來。 而靜態(tài)鏈接在執(zhí)行前進(jìn)行了拷貝。多個(gè)程序要鏈接一個(gè)函數(shù)?因?yàn)榇a段在內(nèi)存中的權(quán)限都是為只讀的,所以當(dāng)多個(gè)應(yīng)用程序加載同一個(gè)代碼段的時(shí)候,不用擔(dān)心應(yīng)用程序會(huì)修改代碼段。多個(gè)程序調(diào)用一個(gè)函數(shù)時(shí),先把變量和函數(shù)拿到,然后保存在自己的線程棧中,相互不影響。-
問:給我解釋下虛擬內(nèi)存到底咋回事兒,看書看不懂
答:虛擬內(nèi)存是計(jì)算機(jī)系統(tǒng)內(nèi)存管理的一種技術(shù)。它使得應(yīng)用程序認(rèn)為它擁有連續(xù)的可用的內(nèi)存(一個(gè)連續(xù)完整的地址空間),而實(shí)際上,它通常是被分隔成多個(gè)物理內(nèi)存碎片,還有部分暫時(shí)存儲(chǔ)在外部磁盤存儲(chǔ)器上,在需要時(shí)進(jìn)行數(shù)據(jù)交換。目前,大多數(shù)操作系統(tǒng)都使用了虛擬內(nèi)存,如Windows家族的“虛擬內(nèi)存”;Linux的“交換空間”等。
什么情況下硬盤會(huì)拿來當(dāng)內(nèi)存使用?當(dāng)內(nèi)存耗盡時(shí),電腦就會(huì)自動(dòng)調(diào)用硬盤來充當(dāng)內(nèi)存,以緩解內(nèi)存的緊張。它將計(jì)算機(jī)的內(nèi)存和硬盤上的臨時(shí)空間組合。當(dāng)RAM運(yùn)行速率緩慢時(shí),它便將數(shù)據(jù)從內(nèi)存移動(dòng)到稱為“分頁文件”的空間中。
虛擬內(nèi)存跟物理內(nèi)存有啥區(qū)別和聯(lián)系?
虛擬內(nèi)存地址到實(shí)際的物理內(nèi)存會(huì)有一個(gè)翻譯的過程,虛擬內(nèi)存中連續(xù)的地址在物理內(nèi)存中就不一定連續(xù)。所有進(jìn)程共享同一物理內(nèi)存,每個(gè)進(jìn)程只把自己目前需要的虛擬內(nèi)存空間映射并存儲(chǔ)到物理內(nèi)存上。進(jìn)程要知道哪些內(nèi)存地址上的數(shù)據(jù)在物理內(nèi)存上,哪些不在,還有在物理內(nèi)存上的哪里,需要用頁表來記錄。頁表的每一個(gè)表項(xiàng)分兩部分,第一部分記錄此頁是否在物理內(nèi)存上,第二部分記錄物理內(nèi)存頁的地址。
Paste_Image.png
程序編譯鏈接
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
- 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
- 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
- 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
- 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- 2016年國慶假期終于把此書過完,整理筆記和體會(huì)于此。 關(guān)于書名 書名源于俄羅斯的演員斯坦尼斯拉夫斯基創(chuàng)作的《演員...
- 一、溫故而知新 1. 內(nèi)存不夠怎么辦 內(nèi)存簡(jiǎn)單分配策略的問題地址空間不隔離內(nèi)存使用效率低程序運(yùn)行的地址不確定 關(guān)于...
- 蕭條寒冬 天氣越來越寒冷,最近的新聞也讓人不斷地體會(huì)到眼花繚亂的政治亂世,先是最不被看好的曾經(jīng)的陪跑業(yè)余政治選手“...
- 水深深, 渡柳天地間。 身穿柳穿花覓信音。 君子心負(fù)臣妾心。 怨鳴扶琴供之心。 恨孤衾綿綿。 鈿誓釵盟何處尋。 當(dāng)...