Подтвердить что ты не робот

Файл с памятью С# не занимает физическую память

Я пытаюсь кэшировать большое количество данных в физической памяти и делиться ими для других процессов в локальной среде. Поэтому я придумал MMF и прочитал документ Microsoft MMF, увидел несколько примеров и начал настраивать подобный код.

MemoryMappedFile MMF = MemoryMappedFile.CreateNew("Features", MaxSize);
.
.
.
using (MemoryMappedViewStream stream = MMF.CreateViewStream())
{
     BinaryWriter write = new BinaryWriter(stream);
     .
     .
     .
     // Fetched the data from database and store it into Rowdata variable.
     while (Rowdata.Read())
     {
          byte[] data = Rowdata.GetFieldValue<byte[]>(0);
          write.Write(data);
     }
}

Он не хранит данные в памяти

IVSSharedMemory - это то, над чем я работаю, но объем памяти должен быть намного выше этого.

enter image description here

Есть ли что-то, что я забыл сделать, когда создал файл отображения памяти? пожалуйста, скажите мне, если есть. Я погуглил это сразу после того, как заметил это неожиданное поведение, и некоторые сказали, что это виртуальная память. Но я не могу не думать, что это неправда, потому что в документе это объясняется в разделе ниже.

Непостоянные файлы с отображением в памяти

Методы CreateNew и CreateOrOpen создают файл с отображением в памяти, который не сопоставляется с существующим файлом на диске.

Заранее спасибо. Только что подтвердил, что это то, для чего предназначен MMF.

ОБНОВИТЬ


Кажется, это действительно виртуальная память. Как прокомментировал Майк З, я проверил воспоминания о том, что мое приложение хранит в инструменте VMMAP, и в результате я получил именно то, что хотел.

enter image description here

Но взгляните на это, количество выделенной памяти изменилось. Это происходит, когда мое приложение загружает все данные полностью. Я могу предположить, что предыдущий размер просто указывает на MaxSize который я назначил при создании MMF.

enter image description here

Это ушло на физическое дисковое пространство или что-то?

Я много читал о MemoryMappedFile и пытался увидеть, что под землей. Но я до сих пор не понимаю, почему это происходит. Серьезно, где находятся данные? где я могу это проверить?

4b9b3361

Ответ 1

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

Чтобы быть более точным, современные ОС используют механизм разбиения на страницы, который использует MMU-компьютер компьютера для сопоставления виртуального адресного пространства с физической памятью или файлом подкачки на диске. Так реализована виртуальная память. Идея состоит в том, что MMU преобразует доступ к памяти из ЦП в ОЗУ, используя отображение, поддерживаемое ядром, или если страница отсутствует (либо она была перенесена на диск, либо не отображается вообще), а затем создает аппаратное прерывание, которое вызовет ядро для устранения ошибки кэша. В случае файла с отображением в памяти это разрешение берет на себя загрузку отсутствующей страницы в основную память и прозрачное возобновление выполнения программы.