Windows 程式啟動效能最佳化(先載入EXE,後載入DLL,只取有限的代碼載入記憶體,將CPU的IP指向程式的進入點)

來源:互聯網
上載者:User

標籤:windows   引用   取出   循序檔   建立   lib   很多   lock   就是   

一、重定位
連結時重定位:
目標檔案一般由多個節組成,編譯器在編譯每個目標檔案時一般都是從0地址開始產生代碼。當多個代碼節合成一個程式碼片段時,需要根據其在最終程式碼片段中的位置做出調整。同時,連結器需要對已經解析的符號分配運行時地址。這個過程就是重定位。

載入時重定位:
程式中可能調用了DLL,由於EXE是最先被載入的,所以一般都能載入到其想要的記憶體位址上;而DLL的載入一般在EXE之後,就需要對DLL中的地址進行重定位了。

二、程式的啟動過程
WIN32程式啟動過程包括:

(1)作業系統把程式載入到記憶體,並建立相應的運行環境
(2)應用程式自身的初始化過程

備忘:應用程式必須符合PE格式,主要包含:data(資料區段),.text(程式碼片段)。資料和代碼載入到記憶體中後(記憶體中,應用程式的代碼錶現為一系列有序的指令集),CPU從程式入口處按順序取出每一條指令並執行。

 

載入器:作業系統載入器的任務是,把磁碟中可執行程式的物理檔案讀入記憶體,並轉換成程式在記憶體中的表示。

三、編譯連結和啟動
編譯連結:

(1)先行編譯展開宏
(2)為每個.cxx檔案產生一個.obj檔案,目標檔案至少包含資料區段和程式碼片段;目標檔案還包含一個符號表,用於記錄自己引用          的符號,以及提供給外部參考的符號。
(3)編譯器合成這些目標檔案成一個庫檔案(.lib),同時解析可以找到的符號引用
(4)連結器把目標庫檔案和所有需要引用的靜態、動態庫進行連結,產生最終的可執行檔。(首先需要把依賴的靜態庫合            成到可執行檔中,其次要保證依賴的動態庫檔案的符號都存在)可執行檔的符號表只需要記錄匯入符號表。


啟動:
不依賴DLL的程式:

(1)作業系統建立進程並分配私人的進程空間;
(2)載入器把可執行檔的資料區段和程式碼片段映射到進程虛擬記憶體中;
(3)預取有限的程式碼片段進入實際記憶體,把CPU的IP指向程式進入點,即可開始執行


依賴DLL的程式:

(1)同上,建立進程、映射虛擬記憶體;
(2)載入器讀取可執行檔的匯入符號表,由此找到依賴的DLL
(3)載入器對依賴的每個DLL調用LoadLibrary,LoadLibrary中處理的事情如下:
a,載入器為該DLL確定一個合適的基地址(地址重定位)
b,讀取匯入和匯出符號表,比較應用程式的匯入符號與DLL的匯出符號是否匹配
c,通過DLL匯入符號表確定該DLL所依賴的其他DLL,同樣載入起來
d,調用DLL的初始化函數
(4)初始化應用程式的全域變數
(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時間很少。

 

 

70676563

Windows 程式啟動效能最佳化(先載入EXE,後載入DLL,只取有限的代碼載入記憶體,將CPU的IP指向程式的進入點)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.