2015-09-08 57 views
7

面試官剛問我一個我以前沒有想過的奇怪問題。如何在c中儘可能快地填充內存#

「您如何在C#中儘可能快地填充計算機的內存?」

我回答說我可能會使用某種遞歸函數,但他指出我可能會在填充內存之前得到堆棧溢出。

我的問題很簡單,我將如何儘可能快地使用C#填充計算機的內存?

+9

「嘗試訪問Oracle數據庫」。 –

+0

也許這個問題暗示了像圖像或gdi對象那樣的非託管資源。 – Jens

+1

我會與「我不會」:D – Luaan

回答

8

我用叉子炸彈去:

while (true) Process.Start(Assembly.GetExecutingAssembly().Location); 

的概念是熟悉的,程序啓動不休自身新的實例。

+1

分配多個大型緩衝區不會更快嗎? –

+2

@TheodorosChatzigiannakis是的,快得多。但是,空緩衝區不一定是從RAM中獲取的 - 爲此目的,預先調零的內存頁面 - 它們僅在您實際編寫某些數據時才分配。這是在OS級完成的,所以很難繞過。複製一些圖像可能是更好的選擇。叉式炸彈的主要「優點」不是內存使用,而是它傾向於通過高優先級的工作淹沒整個計算機。 – Luaan

+0

如何填寫,但不會導致頁面錯誤並將頁面移動到磁盤。 –

1

我還沒有嘗試過,但我喜歡的東西去:

while(true) { Marshal.AllocHGlobal(1024); } 
+0

這肯定會引發內存不足異常。感謝您的回答,我認爲這更符合我的要求,應該在我的問題上更加清楚! – BigTallJosh

+0

我的意思並不是那種消極的方式,那就是我一直在尋找的!填充內存但不會使系統崩潰! – BigTallJosh

+0

是的,直到你編輯它,看起來好像它是一件壞事。我刪除了我的評論:-) – Jcl

2
  1. 叉炸彈,這將最終使CPU非常繁忙,但不一定填充內存。如果你有GB內存和一個小程序,Windows MMU可能最終將未使用(以前的分支)交換到磁盤,並且仍然可以將內存用於其他程序。唯一的問題是,這不會填充內存,而只是使系統無響應。虛擬內存,通過使用Marshal.AllocHGlobal或類似的函數分配巨大的對象,你可能會認爲你正在填充內存,但再次,但操作系統更聰明,如果你只是分配內存,而不是使用它們再次讀取,操作系統將再次將它們重新分頁回到磁盤,仍然不佔用所有內存。這仍然是虛擬內存,操作系統將允許您使用.net指南給出的MAX內存,然後在沒有實際佔用所有內存的情況下,它將開始丟棄更多內存。物理內存,現在這很棘手,首先,在任何應用程序的正常情況下,無法訪問Windows中的物理內存。如果你真的想填充內存(物理內存),那麼你必須編寫一個內核模式驅動程序來做到這一點。

  2. AllocateUserPhysicalPages功能。這是唯一允許您分配物理內存的Windows API(以更快的速度填充內存),使其不能用於其他進程。 https://msdn.microsoft.com/en-us/library/aa366528(VS.85).aspx SQL Server使用這個,我相信即使其他數據庫將使用它來預先分配物理內存,這個內存更快,主要用於緩存目的。

1

創建一堆對象,並避免它們被垃圾收集。

致電殺()並享受。

void kill() 
{ 
    while(true) 
     ThreadPool.QueueUserWorkItem(fill)); 
} 

void fill(Object o) 
{ 
    List<Object> list = new List<Object>(); 
    while(true) 
     list.Add(new Object()); 
} 
相關問題