應用程式與系統記憶體管理

2021-07-25 12:48:56 字數 1115 閱讀 3133

1、虛擬記憶體管理器:

windows提供了虛擬記憶體管理器,管理物理記憶體與硬碟之間的資料交換,以讓應用程式執行時,只有必須的**段和資料段進入物理記憶體,提高物理記憶體使用效率,並為並行程式提供執行環境。 

理論上win32虛擬記憶體管理器為每個win32程序提供私有4gb大小的線性虛擬位址空間,按頁來管理。程序在呼叫dll時,這些dll所用的記憶體空間是程序私有的,dll中全部資料所用的記憶體都在該程序的虛擬位址空間上。虛擬記憶體管理器以4kb為頁面大小處理記憶體,使用的是低區2gb空間,高區2gb留給系統使用。

我們經常看到的缺頁錯誤是程序執行某段**時或訪問資料時,這些**或資料沒有在物理記憶體,系統會透明地將所需要的**或資料置換進物理記憶體。

2、使用虛擬記憶體過程:

虛擬位址空間中的頁有三種狀態:自由、預留、提交。前兩項沒有涉及到真正的物理記憶體,後一項則是希望獲取物理記憶體。提交只是從磁碟的調頁檔案中開闢空間,為置換物理記憶體做準備,直到程序**第一次訪問這段提交記憶體時,系統才分配記憶體,如果沒有真正的物理記憶體,系統將報缺頁錯誤,然後再分配物理記憶體。

對於執行緒而言,系統缺省會分配1mb的預留虛擬位址區域,執行緒使用達到上限時,系統提交最後一頁後丟擲棧溢位異常,此時程式仍可正常執行,如果再需要空間,則會導致退出程序。為了防止這種空難,應該控制棧的使用大小,如減少巢狀呼叫、遞迴呼叫,不要定義大的區域性變數(可在堆上申請大的空間),同時加上異常處理。

這種頁面交換機制會造成指標、陣列越界訪問呈現不同的現象,有時程式直接崩潰,有時則不會。前者可能的情況是:指標、陣列越界後的區域不在同乙個頁,而是乙個沒有提交的虛擬記憶體頁,則會崩潰。後者是指標、陣列越界後在同乙個頁或是其鄰近頁,則不會崩潰。

3、程式的效率:

因為頻繁的調頁操作引起的i/o會降低程式執行效率,因此虛擬記憶體管理器會將每個程序一定量的記憶體頁駐留在物理記憶體中,這種記憶體頁稱為「工作集」,可由任務管理器中看到「工作集」是不斷變動的。「工作集」常駐物理記憶體,不存在i/o,相對較快,如果執行的**或訪問的資料不在工作集中,則會引發額外的i/o,導致程式執行效率降低。乙個極端的情況就是所謂的顛簸或抖動,程式大部分時間用在調頁上。

為了提高效率,在程式設計中最好寫緊湊**,此處緊湊有兩層含意:一是經常用到的**放在一塊。二是運算中使用效率高的運算子操作,如:前置單目運算子、復合運算子。對於資料,盡量將會同時訪問的資料放到一起。

C 應用程式效能優化 作業系統記憶體管理

1.工作集 概念 作業系統中駐留在物理記憶體中的記憶體頁成為程序的工作集。工作集的大小 作業系統為每個程序定義了最小工作集 20 50mb 和最大工作集 45 345mb 具體與系統的物理記憶體大小有關 工作集的增長 當執行到未被調入記憶體的 頁或資料頁時,這些頁會被調入記憶體,工作集隨之增長。當工...

應用程式常駐系統

增加以下兩個屬性 1.必須有系統許可權,即有shareduserid android.uid.system 屬性 2.必須有android persistent true 屬性,也就該程序常駐系統,永遠不會被殺掉。在系統預設啟動後,我們看到可能就是u0 a10,新增使用者下,啟動後看到的就是u10 ...

linux應用程式記憶體布局

對向高記憶體位址生長,棧想低記憶體位址生長 linux中所有的應用程式都是這個布局,每個應用程式都是從0x80480000這個位址開始的,這樣衝突嗎?不衝突,因為這個位址是乙個虛擬位址,linux中每個應用程式都有自己的虛擬位址空間。第二行是資料段的記憶體位址範圍。第三行是堆的記憶體位址範圍。最後一...