2015-09-08 10 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は最終的には使用されなかったもの(以前のフォーク)をディスクにスワップし、他のプログラム用にメモリを解放したままにします。唯一の問題は、メモリを埋めるのではなく、単にシステムが応答しなくなることです。

  2. 仮想メモリは、Marshal.AllocHGlobalまたは同様の機能を使用して巨大なオブジェクトを割り当てることで、メモリをいっぱいにしていると思うかもしれませんが、メモリを割り当てるだけで、 OSは再びそれらをディスクに戻し、まだすべてのメモリを占有しません。これはまだ仮想メモリであり、OSは.netのガイドラインで与えられたMAXのメモリを許可します。そして、実際にはすべてのメモリを消費することなく、メモリをそれ以上スローしません。

  3. 物理メモリこれは難しいことですが、まず、アプリケーションの通常の状況で、Windowsの物理メモリにアクセスできなくなります。実際にメモリ(物理メモリ)を埋めるには、カーネルモードドライバを作成しなければなりません。

  4. AllocateUserPhysicalPages機能。これは物理メモリを割り当てることができる唯一のWindows APIです(ある意味では、メモリがいっぱいになります)ので、他のプロセスでは使用できなくなります。 https://msdn.microsoft.com/en-us/library/aa366528(VS.85).aspx SQL Serverはこれを使用しており、他のデータベースでも物理メモリを事前に割り当てるためにこのメモリが使用されていると思われます。このメモリは高速で、主にキャッシュ目的で使用されます。

1

複数のオブジェクトを作成し、それらがガベージコレクションされないようにします。

コールをkill()して楽しんでください。

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

void fill(Object o) 
{ 
    List<Object> list = new List<Object>(); 
    while(true) 
     list.Add(new Object()); 
} 
関連する問題