Я знаю, что возможно использовать отображенные в память файлы, то есть реальные файлы на диске, которые прозрачно отображаются в память. Насколько я понимаю (я еще не использовал их), отображение происходит немедленно, файл частично читается при первом обращении к памяти, в то время как ОС начинает «кэшировать» весь файл в фоновом режиме.
Теперь: возможно ли несколько злоупотребить этой концепцией и отобразить карту памяти в другом блоке памяти? Предполагая, что ОС обеспечивает такое перенаправление, можно создать compressed_malloc()
который возвращает отображение из памяти в память. Память, возвращаемая вызывающей стороне, является простым отображаемым диапазоном памяти, который прозрачно сжимается в памяти и также в конечном итоге сохраняется в памяти. Таким образом, для больших буферов может быть возможно, что только часть из них будет распакована на лету (при доступе), в то время как остальные блоки будут сжаты.
Эта концепция технически возможна на данный момент или — если она уже реализована (в программном обеспечении) — на что стоит обратить внимание?
Обновление 1: я более или менее ищу что-то, что технически достижимо без изменения самого ядра ОС или для которого требуется платформа виртуализации.
Обновление 2: я надеюсь на что-то, что позволит мне реализовать сжатие и связанную логику в моем собственном коде пользовательского пространства. Я бы просто использовал возможности операционной системы для создания отображения памяти.
Даже очень. Система VM (Virtual Memory) предназначена для работы с различными видами объектов, которые могут быть отображены. На самом деле есть вызов файловой системы Cramfs это делает нечто похожее в том смысле, что он сохраняет сжатые данные в хранилище, но обеспечивает прозрачный несжатый доступ.
Вы не будете изменять ядро как таковое, но вам придется работать в пространстве ядра, реализуя обработчики виртуальных машин для этого нового типа объекта отображения в памяти.
Это возможно, например.
http://pubs.vmware.com/vsphere-4-esx-vcenter/index.jsp?topic=/com.vmware.vsphere.resourcemanagement.doc_41/managing_memory_resources/c_memory_compression.html
Это неправильно реализовано в пространстве ядра в Linux, но что-то подобное может быть реализовано в пространстве пользователя.