【Android Linux內存及性能優化】(十) 進程冷啓動和熱啓動的區別

【Android Linux內存及性能優化】十 進程冷啓動和熱啓動的區別

本文接着
【Android Linux內存及性能優化】(一) 進程內存的優化 - 堆段
【Android Linux內存及性能優化】(二) 進程內存的優化 - 棧段 - 環境變量 - ELF
【Android Linux內存及性能優化】(三) 進程內存的優化 - ELF執行文件的 數據段-代碼段
【Android Linux內存及性能優化】(四) 進程內存的優化 - 動態庫- 靜態庫
【Android Linux內存及性能優化】(五) 進程內存的優化 - 線程
【Android Linux內存及性能優化】(六) 系統內存的優化
【Android Linux內存及性能優化】(七) 程序內存泄漏檢查工具
【Android Linux內存及性能優化】(八) 系統性能分析工具
【Android Linux內存及性能優化】(九) 進程啓動速度優化篇

四、進程冷啓動和熱啓動的區別

很多個會發現,在程序第一次啓動(冷啓動)退出後,接下來程序啓動(熱啓動)速度明顯要比第一次啓動快,這是爲什麼呢?

其實這和Linux 操作系統的內存 Cache 機制有關。

在程序第一次啓動、退學出後,進程雖然被銷燬了,但是進程代碼段所佔用的物理內存並沒有被銷燬,
而是被 LINUX 緩存起來了,保存在Cache 中。

這樣當程序再次被啓動時,在進程運行過程中,指令不必再從Flash 中讀取到內存中,而是直接使用LInux 內核Cache 緩存的代碼,
這樣減少了在程序啓動過程中所產生的page fault ,從而加快了進程的啓動速度。

因此,進程冷啓動和熱啓動速度上的差別,主要在於啓動進程中其所動行到的進程和動態庫的代碼段所產生的page-fault 的多少,這與代碼段的大小有關,也與該動態庫是否被其他進程加載並使用有關。


在進程啓動過程中:

  • (1)進程冷啓動時,如果運行的指令相對較多,則出現的page fault 會較多,影響進程的啓動速度。
    這時,要高度關注代碼中所用到的只讀的大數組,他們在代碼段的.rodata 節,如果啓動過程中要用這些數據較多,
    則會產生較多的page fault 而降低進程的啓動速度。

  • (2)進程所依賴的某些動態庫可能已經被 一些守護進程所加載,其代碼段已經在內存中,故這種動態庫對進程的冷啓和熱起的影響不大。

  • (3)某些動態庫只是被該進程所加載,那麼在冷啓動之前,這個動態庫的代碼不會被 加載到內存,故這些動態庫的代碼如果在進程啓動過程中用到,則會產生page fault 影響進程的啓動速度。 對於這類動態庫,可以考慮將其改爲靜態庫,減少加載動態庫的數量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章