2012-04-06 38 views

回答

3

如果我們談論x86或類似的(在頁面轉換方面)體系結構,在任何給定的時間都有一個虛擬地址空間,通常一部分是爲內核保留的,另一部分是爲用戶模式流程。

在兩個進程之間的上下文切換中,只有虛擬地址空間的用戶模式部分發生更改。

對於這樣的組織,內核始終可以完全訪問當前的用戶模式進程,因爲同樣,內核和用戶模式進程在任何時刻都只有一個當前的虛擬地址空間,而不是兩個,這是一個。所以,內核並不一定要爲用戶模式頁面提供另外的額外映射。但這不是主要觀點。

重點是內核爲每個頁面保留一些統計信息,如果需要的話可以保存到磁盤並在別處重新使用。 CPU在第一次讀取或寫入頁面時將每個頁面的page table entry (PTE)標記爲accessed,並在第一次寫入頁面時將其標記爲dirty

內核將掃描的PTE定期讀取accesseddirty標記更新所述統計,並清除accesseddirty因此它可以(如果有的話,當然)後檢測它們的變化。根據這些統計數據,它可以確定哪些頁面很少被使用或長時間未被使用,並且可以重新使用。

如果「swapper」在當前進程的上下文中運行,並且它在內核中運行,那麼理論上它有足夠的來自內核的信息(很少使用或長未使用頁的列表來保存和取消映射if dirty或只是取消映射,如果不是dirty)以及對感興趣頁面的訪問權限。

如果「swapper」本身作爲用戶模式進程運行,事情會變得更加複雜,因爲默認情況下,它無法訪問另一個進程的頁面,必須創建映射或要求內核做一些額外的在感興趣的過程中爲它工作。

因此,在內核中發現很少使用和長未使用的頁面及其地址。 CPU幫助將PTE自動標記爲accesseddirty。如果它們被保存到磁盤而不是在擁有它們的進程的上下文中,則可能需要額外映射到dirty頁面。

+0

你是說內核(letz說linux)會始終運行在進程上下文中(在x86架構中)?如果那樣,你是否有任何關於Linux內核如何訪問需要被換出的頁面(對於不在上下文中的過程)的想法?還有,如果沒有進程正在運行(理論上)呢?\ – viji 2012-04-06 14:13:00

+0

它可以切換到該進程的上下文,也可以在不切換的情況下創建映射。我不知道它的兩個中的哪一個。 – 2012-04-06 14:18:44

+0

那麼爲什麼有3種類型的上下文? (內核上下文,中斷上下文,進程上下文)[http://www.learninglinuxkernel.com/Introduction_03.html](http://www.learninglinuxkernel.com/Introduction_03.html) – viji 2012-04-06 14:25:50

相關問題