2010-06-13 180 views
5

docs內存頁錯誤究竟是什麼?

注:核心數據避免術語 unfaulting,因爲它是混亂的。 虛擬 內存頁面錯誤沒有「不合格」。頁面錯誤是 觸發,引起,解僱或 遇到。當然,你可以通過 多種方式(使用函數 vm_deallocate,munmap或sbrk)將內存釋放回內核。核心 數據將此描述爲「將 對象變爲故障」。

是核心數據中的錯誤本質上是內存頁錯誤?對於內存頁面的內容我只有一點點的想法。我相信這是一種「內存中的代碼片段」,它需要執行這樣的過程和類似的東西,而且當應用程序運行時,代碼片段會作爲「頁面」被吸引到內存中,因爲它們不是需要了。大概99%是錯的;)

有人嗎?

回答

7

我對存儲器頁面的內容只有一點點的想法。我相信這是一種「內存中的代碼片段」,它需要執行這樣的過程和類似的東西,而且當應用程序運行時,代碼片段會作爲「頁面」被吸引到內存中,因爲它們不是需要了。

東西(即代碼和數據)存在於內存中。

存儲器中存在的每件事物都有一個地址(一個存儲器地址)。

內存地址空間(例如,32位機器上的4GB)被分成'頁面',其中每頁是連續的內存塊(例如每頁4KB)。

地址空間被映射(由CPU和O/S)到RAM(或可能映射到I/O端口,但這是一個不同的故事)。

安裝的RAM可能比地址空間(例如4 GB)少(例如1 GB),因此可能會換出一些東西(例如最近最少使用的東西)(由O/S)從RAM到磁盤上的頁面文件。整體,整體頁面(例如4KB塊)是交換的內容(而不是單個字節)。

當應用程序嘗試訪問當前未映射到RAM的地址時,那就是所謂的頁面錯誤。爲了處理頁面故障時,O/S可能:

  • 釋放一些RAM,通過交換的東西(如最近最少使用),RAM磁盤
  • 地圖是新釋放的現在可用的RAM應用程序試圖訪問的地址
  • 從磁盤交換到RAM,無論應該在哪個地址(過去某些時候已將該地址換出到磁盤)
  • 繼續應用程序停止運行:應用程序再次嘗試訪問該內存地址,只是這次沒有其他頁面錯誤。
+1

I不要介意你對整個虛擬記憶的描述(就像我一樣),但考慮到你提供的詳細程度,你不覺得你應該提及它嗎?您描述它的方式,聽起來像每個應用程序映射到物理內存。一般來說,換出的內容不是綁定到物理地址,而是與您自己的應用程序的另一個(虛擬)頁面綁定。無需您的應用程序的內存使用特性來影響其他人的應用程序。 – tvanfosson 2010-06-13 13:01:47

+1

@tvanfosson我沒有提到它,現在你已經提出了它,我不知道如何總結它。但是,每個應用程序*都映射到物理內存:每個應用程序都可以看到整個(或大部分)地址空間,就好像地址空間僅由該應用程序擁有一樣,而O/S將地址空間映射到RAM 。多個應用程序意味着多個地址空間實例,並且不同的實例彼此競爭RAM。 – ChrisW 2010-06-13 13:11:28

+0

決定要交換的內容(例如,是否選擇由此應用程序或其他應用程序使用的頁面)是O/S特定的實現細節(我不知道iPhone的細節是什麼)。 – ChrisW 2010-06-13 13:14:30

2

當你的程序運行時並不是全部存儲在RAM中。
作爲操作系統的一部分存在分頁機制,它只將最常用的內存頁面存儲在RAM中以便更快速地訪問。
當您嘗試訪問當前未加載到RAM的內存位置時,會發生頁面錯誤,並從磁盤中讀取該頁面。
由於可用RAM僅限制存儲在RAM中的最重要的存儲器頁面。

該機制受操作系統實施的限制。
對於操作系統理論的更全面的探索,我會推薦A.S.Tenenbaum撰寫的Modern Operating Systems一書。

3

從操作系統的角度來看,內存頁面是應用程序的基本數據單元。您的所有代碼和數據均按頁面組排列。當您的程序在您的應用程序中引用合法的內存位置時 - 通過嘗試讀取或寫入數據或加載指令,該地址將轉換爲其中一個頁面中的某個位置。當持有地址的頁面實際上不存在於物理內存中時,會發生頁面錯誤。此時操作系統需要將頁面從磁盤加載到內存中,以便您的程序可以繼續。

+0

因此,當指針指向當前未加載的位置時,頁面會自動加載到內存中? – dontWatchMyProfile 2010-06-13 11:49:23

+0

是的 - 它由OS加載。當您的應用程序消耗太多內存時,例如,有很多頁面錯誤會導致控件返回內核,以便從磁盤讀取頁面,並且通常會導致程序非常慢。 – 2010-06-13 11:54:19

+0

是否與所謂的「交換文件」相關? – dontWatchMyProfile 2010-06-13 12:48:38