2015-10-09 30 views
0

我想知道如果一個程序顯示頁面錯誤的高數量(或最高的系統),讓任務管理器或進程資源管理器說,這是一個內存碎片的指示。有沒有其他方法可以揭示這類問題? (內存碎片)。因此,運行時出現巨大頁面故障的程序可能來自不在RAM中的數據,但OS會使得頻繁中斷從磁盤加載。一個可能的原因可能是內存碎片?我想知道,如果這2個東西都與大量頁面錯誤與內存碎片有任何關係?

+0

請在問題中添加有關您的任務/問題的更多詳細信息。 – Ilya

回答

1

維基百科:當一個程序試圖訪問當前沒有映射到物理內存(RAM)的網頁

分頁的主要功能是進行。這種情況被稱爲頁面錯誤。然後操作系統必須以程序不可見的方式來控制和處理頁面錯誤。因此,操作系統必須:

確定數據在輔助存儲中的位置。在RAM中獲取一個空白頁框以用作數據的容器。將請求的數據加載到可用的頁面框架中。將頁面表更新爲 請參閱新的頁面框架。將控制返回到程序 ,透明地重試導致頁面錯誤的指令。

因此,我會說碎片通常與頁面錯誤無關。後者表明RAM內存已滿,並且此特定程序消耗的內存比其他內存多得多,因此他在交換區域內擁有更多內存,因此每次嘗試訪問OS已換出的頁面時故障發生,操作系統必須將此頁面加載到RAM中。

這就是如果你正在用單個進程來試驗這個錯誤。如果您在所有過程中都觀察到相同的問題,則表示Thrashing。在這種情況下,物理內存量不足以容納所有正在運行的進程,因此虛擬內存子系統花費更多時間進行分頁。因此,進程沒有進展,因爲每次發生頁面錯誤時,進程都會丟失CPU,並且必須等到RAM中的頁面準備就緒。

碎片通常發生在您的內存映射包含幾個不能滿足新預留的小塊時,因此該進程開始尋求更多內存以適應它們。因此,在這種情況下,即使程序完成了一些本應分配動態內存,執行某些操作然後釋放動態內存的特定任務,但在這種情況下,症狀仍然是內存或內存未釋放到操作系統中。

0

大量的頁面錯誤往往是由於對常駐內存的高需求造成的。內存碎片可能是對常駐內存高需求的根本原因,但這不是我的第一個猜測。

也許問題只是需要那麼多的常駐記憶。

也許這個問題需要那麼多的虛擬內存,但是算法的設計很差(訪問的地點差),所以對常駐內存的需求比它應該高。

也許程序編碼不好,所以它使用的內存比它需要的多得多。

也許任務對駐留內存的需求是完全合理的(考慮到可用物理內存),但是微軟的大腦死亡內存管理算法正在產生壓倒性的頁面錯誤,這是沒有理由的。

大多數頁面錯誤是「軟」錯誤,這意味着實際上不需要磁盤活動。操作系統已經從任務中取走了頁面,而沒有從物理內存中刪除這些頁面,作爲測試該任務真正需要的頁面的一種手段,其長期目標是保持該任務的「工作集」不增長(隨着微軟濫用長期「工作集」)。這是操作系統所有必需且正確的行爲。

但是,當任務快速反擊需要這些網頁你會得到一個軟故障,操作系統在裏面給這些網頁後面,並採取其他頁面了,而不是實現該任務需要更高的總居民RAM和有足夠的物理內存以適應它。我看到很多情況下,單線程內核CPU服務軟故障的時間是長程序運行時間的90%或更多,而機器的大部分RAM只是未使用。

+0

不要責怪微軟,頁面錯誤算法是完美的。他們分頁出最近未使用的頁面。你不能指望它們是通靈的,並預測哪些頁面將被使用。你自己的**內存管理更重要。如果將熱數據和冷數據混合在單個頁面上,則Windows無法僅將頁面的冷部分分頁。 – MSalters

+0

@Msalters,我不傻,我也不是盲目地責怪微軟。我在指責微軟,因爲我仔細研究了這個問題,仔細尋找解決辦法。我責怪微軟,因爲相同的程序源代碼重新編譯爲Linux並且運行相同的內存訪問模式並不會被內核CPU服務軟故障的時間所淹沒。 (並不是說我對Linux內存管理感到非常滿意,但是不那麼不開心)。 – JSF

+2

這就是爲什麼我說你不能指望心理操作系統。 Linux只是碰巧**猜測**您的特定程序將使用哪些頁面。但是對於Linux上更好的每種內存訪問模式,Windows上都有更好的內存訪問模式。另外,如果你想硬性聲明內存,請調用'VirtualLock',或者用'SetProcessWorkingSetSize'設置一個軟聲明。再一次,這些算法不是通靈的,所以你可以通過向他們提供關於會發生什麼的信息來幫助你。 – MSalters