一、重定位
鏈結時重定位:
目標檔案一般由多個節組成,編譯器在編譯每個目標檔案時一般都是從0位址開始生成**。當多個**節合成乙個**段時,需要根據其在最終**段中的位置做出調整。同時,鏈結器需要對已經解析的符號分配執行時位址。這個過程就是重定位。
載入時重定位:
程式中可能呼叫了dll,由於exe是最先被載入的,所以一般都能載入到其想要的記憶體位址上;而dll的載入一般在exe之後,就需要對dll中的位址進行重定位了。
二、程式的啟動過程
win32程式啟動過程包括:
(1)作業系統把程式載入到記憶體,並建立相應的執行環境
(2)應用程式自身的初始化過程
備註:應用程式必須符合pe格式,主要包含:data(資料段)和 .text(**段)。資料和**載入到記憶體中後,(記憶體中,應用程式的**表現為一系列有序的指令集。)cpu從程式入口處按順序取出每一條指令並執行。
載入器:作業系統載入器的任務是,把磁碟中可執行程式的物理檔案讀入記憶體,並轉換成程式在記憶體中的表示。
三、編譯鏈結和啟動
(3)編譯器合成這些目標檔案成乙個庫檔案(.lib),同時解析可以找到的符號引用。(lib檔案的實質就是這些目標檔案集合
)(4)鏈結器把目標庫檔案和所有需要引用的靜態、動態庫進行鏈結,生成最終的可執行檔案。(首先需要把依賴的靜態庫合成到可執行檔案中,其次要保證依賴的動態庫檔案的符號都存在)可執行檔案的符號表只需要記錄匯入符號表。
啟動:不依賴dll的程式:
(1)作業系統建立程序並分配私有的程序空間;
(2)載入器把可執行檔案的資料段和**段對映到程序虛擬記憶體中;
(3)預取有限的**段進入實際記憶體,把cpu的ip指向程式入口點,即可開始執行
依賴dll的程式:
(1)同上,建立程序、對映虛擬記憶體;
(2)載入器讀取可執行檔案的匯入符號表,由此找到依賴的dll
(3)載入器對依賴的每個dll呼叫loadlibrary,loadlibrary負責處理的事情如下:
(a)載入器為該dll確定乙個合適的基位址(位址重定位)(4)初始化應用程式的全域性變數(b)讀取匯入和匯出符號表,比較應用程式的匯入符號與dll的匯出符號是否匹配
(c)通過dll匯入符號表確定該dll所依賴的其他dll,同樣載入起來
(d)呼叫dll的初始化函式
(5)進入應用程式入口點函式開始執行
四、影響啟動效能的因素:
(1) 程式冷啟動的效能大部分取決於io操作消耗的時間;
(2) dll匯出過多符號,會引起載入器耗費過多的cpu事件和io來處理這個符號表;
(3) 磁碟碎片問題:理想狀態下,順序讀取乙個檔案,不需要磁頭尋道操作。但作業系統的檔案系統,以塊為單位管理物理磁碟空間,當磁碟經過不斷的增刪改操作後,可能不再具有連續的儲存空間。導致乙個邏輯上連續的檔案,在磁碟上由很多不連續的碎片組成,導致執行io時需要過多的尋道時間。
五、優化啟動過程的方法:
(1) 減少動態庫數量;
(2) 減小動態庫的尺寸:可以通過編譯優化選項,清除冗餘**;
(3) 優化可執行檔案和庫檔案的**布局:把庫檔案中的函式排的更緊密,從而達到減少io的目的;
步驟:獲得函式呼叫的順序檔案(.prf);把這些prf傳給鏈結器,鏈結器會自動按照prf檔案把檔案在動態庫中的位置重新排序(可以嘗試一下)(4)延遲初始化:可以把一些啟動初期不需要的初始化工作延遲到啟動後,增強啟動體驗;
延遲的時機:可以在程式空閒時進行處理,在訊息迴圈空閒時處理。(5) 多執行緒化啟動:具有以下特點,適合多執行緒化啟動
啟動時需要載入大量動態庫,引發大量io操作;同時這些動態庫初始化函式需要執行密集型操作,占用cpu時間。這時候可以將io等待時間和cpu執行時間交錯處理,縮短啟動時間。備註:io的實現,是cpu發出命令後,由主機板dmp完成,完成後觸發中斷,然後cpu繼續處理,所以io占用的cpu時間很少。
程式啟動效能優化checklist
效能優化系列文章導航 新的職業目標,以及c 效能優化 程式啟動效能優化checklist 1 減少全域性變數,尤其是類物件的數量。2 減少dll數量和dll大小。3 較少匯出符號表和匯入符號表的數量。4 刪減舊 或移動舊 到其他地方。5 將啟動時的配置檔案集中化。6 整理記憶體碎片和硬碟碎片。7 優...
Android 效能優化 啟動優化
1.3啟動優化工具 1.3.1 traceview 1.3.2 systrace 2.啟動優化 啟動優化的第一步就是要獲取啟動的時間,整個啟動邏輯的所需要的精確時長。根據各個方法的時長去定位哪些邏輯需要優化。首先我們如何獲取 的執行時間。如下 檢視啟動時間。適合線下模式 注意 使用命令前,adb需要...
Windows啟動原理及啟動優化
為什麼開機進入系統慢?各種開機啟動故障讓你頭疼?了解啟動的奧妙,對於windows系統管理者來說十分重要,對於啟動時的故障排查 啟動優化有很大幫助 本文將概述計算機啟動的原理並提供多種啟動優化的解決方案。先明確一點,windows7 10和windowsxp的啟動過程是有區別的,如果有人和你講啟動過...