Что происходит, когда ОЗУ заканчивается в C #? - PullRequest
6 голосов
/ 14 мая 2011

Я не специалист по компьютерам, поэтому позвольте мне постараться поставить этот вопрос немного более конкретно:

Я делаю некоторые научные вычисления, и вычисления иногда требуют много памяти для хранения их результатов. Несколько дней назад у меня был выходной файл, который занимал 4 ГБ на жестком диске, но у меня было такое количество оперативной памяти. Итак:

  • Как CLR (или это что-то еще?) Взаимодействует с памятью, когда выполняемая программа выделяет больше памяти, чем доступно на компьютере? Это создает некоторый обмен в HD? (Я знаю, что это может замедлить мою программу, но меня интересует только проблема с памятью)
  • Это зависит от ОС, скажем, если я работаю с MONO в Linux или с VS в Windows?

Заранее спасибо!

Ответы [ 3 ]

11 голосов
/ 14 мая 2011

Я считаю полезным подумать об этом: память - это дисковое пространство. RAM - быстрый кеш. Вместо того, чтобы думать «когда у меня не хватает ОЗУ, система подкачает ее на диск», я думаю «когда у меня будет доступная ОЗУ, система переместит в нее мою дисковую память».

Это отстает от того, как большинство людей думают об этом, но я считаю, что это помогает. RAM - это просто оптимизация производительности; реальный предел того, сколько памяти вы можете выделить, - это доступное дисковое пространство.

Конечно, это сложнее, чем это. В 32-разрядных операционных системах каждый процесс получает 2 миллиарда байт адресного пространства пользователя . (И то же самое для адресного пространства ядра, но давайте проигнорируем это.) Каждая страница памяти, к которой вы можете обращаться, находится ли она в ОЗУ или на диске, должна быть в этом адресном пространстве. Вы можете выделить более 2 миллиардов байтов, нет проблем. Но вы можете использовать только 2 ГБ за раз. Если у вас выделено 10 ГБ, то по крайней мере 8 ГБ не будут отображаться в адресное пространство. В этом случае вам нужно unmap что-то еще, а затем отобразить то, что вы хотите, в адресное пространство, чтобы добраться до него.

Более того, многие вещи должны находиться в непрерывном адресном пространстве. Например, если у вас есть стек размером 1 МБ, то в адресном пространстве должен быть миллион непрерывных байтов.

Когда людям «не хватает памяти», им не хватает ОЗУ; ОЗУ - это просто быстрый кеш на диске. И им не хватает места на диске; есть много этого. Они почти всегда находятся в ситуации, когда смежного адресного пространства недостаточно для удовлетворения спроса.

Менеджер памяти CLR не реализует эти причудливые стратегии map-and-unmap для вас; в основном, вы получаете 2 ГБ адресного пространства и все. Если вы хотите сделать что-то причудливое, скажем, с отображенными в память файлами, вы сами должны написать код для управления памятью.

3 голосов
/ 14 мая 2011

Время выполнения просто запрашивает у операционной системы больше памяти. Операционная система выполняет разбиение существующего содержимого памяти на диск и, в случае необходимости, обменивается информацией, чтобы создать больше свободной физической памяти. Здесь происходит то же самое для управляемых программ на C # / .NET, как и для обычных неуправляемых программ.

Единственное отличие в мире управляемых приложений состоит в том, что среда выполнения .NET накладывает некоторые накладные расходы на память, ограничивая тем самым общий объем памяти, фактически доступный для вашего приложения. Например, сборщик мусора требует некоторого пространства памяти для своей работы.

Так что да, это зависит от ОС, по крайней мере, до некоторой степени. Однако большинство современных операционных систем имеют довольно похожие подходы к управлению памятью.

3 голосов
/ 14 мая 2011

Если вы выделите больше памяти, чем физически существует, да, будет использовано пространство подкачки.

Если вы выделили больше памяти, чем может быть адресовано, произойдет OutOfMemoryException.

НеКонечно, в Mono, но я думаю, что это зависит от времени выполнения и будет вести себя примерно так же (недостаточно физической памяти приведет к перестановке, слишком большое выделение приведет к исключению).

...