2011-01-13 17 views
10

我想知道是否有可能阻止對象(類或結構)的內存交換到磁盤?你能阻止內存交換到磁盤嗎?

編輯:至於爲什麼我已經告訴了一些我將與不能寫入到磁盤是工作數據。
我不希望它留下足夠長的時間來換出數據,但認爲它值得檢查。

+4

爲什麼要防止這種情況? =) – Jens 2011-01-13 16:11:36

+2

你的意思是除了使用它?通常擔心這種事情是由操作系統決定的。只需使用它,您就可以減少它被放入交換空間的機會。如果你最近沒有使用它,很可能將它放在磁盤上。你看到經常使用的對象被放置在磁盤上嗎? – Crisfole 2011-01-13 16:14:11

+2

我聞到一個微觀優化。你怎麼知道這對你來說是個問題? – 2011-01-13 16:16:22

回答

0

不是真的,這是一個操作系統的東西。

就放心Windows的分頁策略將優先在內存中保存最經常訪問的網頁,因此,如果某個頁面是你的應用程序非常重要,它會在那裏儘可能多地。

0

嗯,很好的問題..你可以完全禁用Windows交換(大小= 0),但IDK的如果多數民衆贊成足以防止.NET的交換。

3

這只是技術上可行的。使用VirtualLock()API函數可以將內存頁鎖定在RAM中。問題是,這需要提供您想要鎖定的頁面的地址。您無法以垃圾收集器的任何記錄方式獲取此地址。它也沒有任何承諾,例如gen#0堆的地址是可重複的。首先,堆的大小是動態的,通常在2到8兆之間,取決於程序的分配模式。

只是隨機鎖定一個大範圍,希望你會趕上他們大多也不起作用。一個進程獲取可鎖定頁面的配額。首先它不是很大,因爲它對機器的操作非常不穩定。龍住在這裏。

8

我仍然不是你爲什麼要做這一點。在C#的上下文中,你必須做兩件事:「固定」內存,使其無法通過垃圾回收進行重定位,然後鎖定它,使其不會被換出。

這裏是一個很好的博客文章,描述瞭如何做的第一部分(釘):

http://www.matthew-long.com/2005/10/18/memory-pinning/

現在你需要的對象的地址和範圍,能夠調用VirtualLock

http://msdn.microsoft.com/en-us/library/Aa366895

注意VirtualLock只鎖定頁(4K的單位),所以你的內存區必須至少是大,對齊到頁面的開始。我假設它需要在unsafe環境中調用,但我不確定。

的話題上發帖: Prevent an object from being paged out (VirtualLock equivalent)

另一個相關的博客文章: http://geekswithblogs.net/robp/archive/2008/08/13/speedy-c-part-3-understanding-memory-references-pinned-objects-and.aspx

4

我會做完全不同的東西:

與營造良好的本地包裝C++ DLL您所需的功能/分配/任何這也將確保數據不會被交換(VirtualLock如有人在這裏說的)。在C#中使用它。

畢竟,它本來就是可能的,它只是你現在綁定到C#。所以,繞過它!