1. 工作集:
概念:作業系統中駐留在物理記憶體中的記憶體頁成為程序的工作集。
工作集的大小:
作業系統為每個程序定義了最小工作集(20-50mb),和最大工作集(45-345mb)(具體與系統的物理記憶體大小有關)
工作集的增長:
當執行到未被調入記憶體的**頁或資料頁時,這些頁會被調入記憶體,工作集隨之增長。
當工作集達到最大工作集,程序需要再次調入新頁到物理記憶體時,虛擬記憶體管理器會將原來工作集中某些頁置換出記憶體,把需要調入的新頁調入記憶體。
訪問記憶體的效能:
工作集中的記憶體駐留在物理記憶體中,因此對其中的記憶體訪問不涉及系統io,速度比較快;如果訪問的記憶體不在工作集中,需要額外的io,效率比較低。
基於工作集的記憶體優化:
作業系統調入需要的頁,會將該頁及其附近的頁一起調入記憶體
基於以上邏輯,**優化可考慮以下處理:
(1) 盡量編寫緊湊**:
根據locality特性,以前執行的**和訪問的資料很有可能在後面再次執行和訪問,這樣程式執行時發生的缺頁錯誤大大降低,即減少了磁碟io。
(2)盡量把需要一起訪問的資料放在一起
這樣訪問這些資料時,它們在同一頁或相鄰頁上,可以降低缺頁錯誤。
2. 記憶體對映檔案
應用:exe或dll的對映;程序間共享記憶體
優點:(1)可以方便的訪問硬碟檔案,而不用經過繁瑣的i/o,效率也會比較高;
(2)可以在多個程序間進行共享記憶體
調頁檔案:
win32中用來輔助實現虛擬記憶體的硬碟檔案稱為調頁檔案。
調頁檔案存放被虛擬記憶體管理器置換出記憶體的資料,當這些資料被再次呼叫時,虛擬記憶體管理器會將其從調頁檔案再次換入記憶體。
出於空間利用率和效能考慮,程式**(exe和dl)不會被修改,所以當它所在的頁被置換出記憶體時,不會存放到調頁檔案,而是直接拋棄;當需要再次調入,虛擬記憶體管理器會從exe或dll檔案中找到它們並重新調入。
3. 程序的記憶體布局(這是linux下的記憶體布局,win下布局有些差異,但區域的劃分差不多)
如圖,高位是系統核心使用的記憶體;剩下的記憶體從低位到高位依次是:**區,資料區,堆,棧;
**區:存放程式的機器**,**區是唯讀的,且大小固定。如果試圖修改該區域的內容,會引發錯誤;
資料區:分為兩部分data(初始化的資料),bss(未初始化的資料)。data和bss中都包含前面提到的靜態/全域性資料,常量資料。大小固定。
data和bss的區別:
已初始化的資料是指,編譯時就知道初始值的全域性和靜態變數等,這些初始值必須儲存在最終生成的二進位制檔案中,並在程式執行時會原封不動的對映到程序的初始化資料區域。未初始化的資料,並不會儲存在二進位制檔案中,而是在二進位制檔案中儲存乙個4位元組的值,表明這些資料需要的記憶體大小。這樣的好處是可以讓生成的二進位制檔案更小。
例如:乙個程式**100k, 已初始化的資料100k,未初始化資料150k,那麼生成的二進位制檔案中:最開始是100k**,接著100k已初始化資料,再接著4位元組的值,其值為1024*150。 而程式執行時,系統會讀取該值,並為其開闢150k的虛擬位址空間。
《C 應用程式效能優化》之程式記憶體
乙個程式占用的記憶體區通常分5種,如下 全域性 靜態資料區 儲存全域性變數和靜態變數 常量資料區 儲存程式中的常量 字串等,不可修改 區 儲存 資料 棧 儲存自動變數 區域性變數,傳遞引數 堆 使用者控制的儲存區,儲存動態產生的資料 程式在分配記憶體時為了加快訪問速度,採取的一種分配策略。每個特定平...
C 應用程式效能優化
本文選自c 應用程式效能優化 第2版 一書 總 序 去國離家十六載後,2006年,當我再次歸來凝視上海這座不夜城時,不由地感慨世界真的變小了 變平了,中國作為地球村的一員,正以驚人的速度發展變化著。世界正改變著中國,中國也不斷影響著世界。在備感欣喜振奮之餘,我亦常常思索,在乙個越來越小 越來越平的世...
C 應用程式效能優化
本文選自一書 總 序 去國離家十六載後,2006年,當我再次歸來凝視上海這座不夜城時,不由地感慨世界真的變小了 變平了,中國作為地球村的一員,正以驚人的速度發展變化著。世界正改變著中國,中國也不斷影響著世界。在備感欣喜振奮之餘,我亦常常思索,在乙個越來越小 越來越平的世界裡,中國會面對怎樣的挑戰和機...