Я считаю полезным думать об этом так: память - это дисковое пространство. RAM - это быстрый кеш. Вместо того, чтобы думать «когда у меня закончится ОЗУ, система переместит ее на диск», я думаю, «когда у меня будет доступная оперативная память, система переместит в нее мою дисковую память».
Это отстает от того, как думает об этом большинство людей, но я считаю, что это помогает. ОЗУ - это просто оптимизация производительности; реальный предел того, сколько памяти вы можете выделить, - это доступное дисковое пространство.
Конечно, это сложнее. В 32-битных операционных системах каждый процесс получает 2 миллиарда байт адресного пространства пользователя. (То же самое и с адресным пространством ядра, но давайте проигнорируем это.) Каждая страница памяти, к которой вы можете получить доступ, будь то в ОЗУ или на диске, должна находиться в этом адресном пространстве. Вы можете выделить более 2 миллиардов байтов, без проблем. Но вы можете адресовать только 2 ГБ за раз. Если у вас выделено 10 ГБ, то по крайней мере 8 ГБ из них не будут отображены в адресное пространство. В этом случае вам нужно отменить отображение чего-то еще, а затем отобразить то, что вы хотите, в адресное пространство, чтобы получить это.
Более того, многие объекты должны находиться в непрерывном адресном пространстве. Например, если у вас стек размером 1 МБ, в адресном пространстве должен быть миллион непрерывных байтов.
Когда у людей «заканчивается память», у них не заканчивается оперативная память; ОЗУ - это просто быстрый кеш на диске. И им не хватает места на диске; этого много. Они почти всегда находятся в ситуации, когда непрерывного адресного пространства недостаточно для удовлетворения спроса.
Диспетчер памяти CLR не реализует эти причудливые стратегии отображения и отмены отображения; По сути, вы получаете адресное пространство размером 2 ГБ и все. Если вы хотите сделать что-то необычное, скажем, с файлами с отображением памяти, вам нужно написать код для управления памятью самостоятельно.
person
Eric Lippert
schedule
14.05.2011