Как заполнить память как можно быстрее в С#

Интервьюер просто задал мне особый вопрос, о котором я раньше не думал.

"Как вы могли бы как можно быстрее заполнить память компьютера на С#?

Я ответил, что, вероятно, буду использовать какую-то рекурсивную функцию, однако он указал, что я, вероятно, получаю переполнение стека перед заполнением памяти.

Мой вопрос просто: как я могу как можно быстрее заполнить память компьютера с помощью С#?

4 ответа

Я бы пошел с вилкой-бомбой:

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

Концепция знакома, программа бесконечно запускает новые экземпляры самой себя.


  • Fork-Bomb, это в конечном итоге сделает процессор очень занятым, но не обязательно заполняет память. Если у вас есть ГБ памяти и небольшая программа, Windows MMU может в конечном итоге заменить не используемые (предыдущие вилки) на диск и по-прежнему держать память свободной для другой программы. Единственная проблема заключается в том, что это не заполняет память, а просто делает систему невосприимчивой.

  • Виртуальная память, выделяя огромные объекты с помощью Marshal.AllocHGlobal или аналогичных функций, вы можете подумать, что вы заполняете память, но еще раз, но ОС умнее, если вы просто выделяете память и не используете ее для чтения опять же ОС снова вернет их обратно на диск, все еще не занимая всю память. Это по-прежнему виртуальная память, и ОС позволит вам получить MAX-память, заданную директивами .net, тогда она начнет бросать больше памяти, не потребляя всю память.

  • Физическая память. Теперь это сложно, прежде всего, вы не можете получить доступ к физической памяти в Windows при нормальных обстоятельствах в любом приложении. Если вы действительно хотите заполнить память (физическая память), вам нужно написать драйвер режима ядра, чтобы сделать это.

  • AllocateUserPhysicalPages. Это единственный Windows API, который позволяет вам выделять физическую память (что в свою очередь ускоряет память), что делает ее недоступной для других процессов. https://msdn.microsoft.com/en-us/library/aa366528(VS.85).aspx SQL Server использует это, и я считаю, что даже другие базы данных будут использовать его для предварительного выделения физической памяти, эта память быстрее и в основном используется для цели кэширования.


Я не пробовал, но я бы пошел с чем-то вроде:

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


Создайте кучу объектов и избегайте их сбора мусора.

вызовите kill() и наслаждайтесь.

void kill()
{
 while(true)
 ThreadPool.QueueUserWorkItem(fill));
}
void fill(Object o)
{
 List<object> list = new List<object>();
 while(true)
 list.Add(new Object());
}
</object></object>

licensed under cc by-sa 3.0 with attribution.