2013-06-10 6 views
2

Я знаю, что можно использовать файлы с отображением памяти, то есть реальные файлы на диске, которые прозрачно отображаются в память. Насколько я понимаю (я еще не использовал их), отображение происходит немедленно, файл частично считывается при первом доступе к памяти, а ОС начинает «кэшировать» весь файл в фоновом режиме.Возможно ли отображение памяти?

Теперь: Возможно ли несколько злоупотреблять этой концепцией и памятью еще одним блоком памяти? Предполагая, что ОС обеспечивает такое направление, можно создать вид compressed_malloc(), который возвращает отображение из памяти в память. Память, возвращаемая вызывающему абоненту, представляет собой простой диапазон памяти, который прозрачно сжимается в памяти и также в конечном итоге сохраняется в памяти. Таким образом, для больших буферов возможно, что только часть его распаковывается «на лету» (при доступе), в то время как остальные блоки сохраняются в сжатом состоянии.

Эта концепция технически возможна в данный момент или - если она уже реализована (в программном обеспечении) - на что обратить внимание?

Обновление 1: Я более или менее ищу что-то технически достижимое без изменения самого ядра ОС или для которого требуется платформа виртуализации.

Обновление 2: Я надеюсь на то, что позволяет мне реализовать сжатие и связанную логику в моем собственном коде пользовательского пространства. Я бы просто использовал средства операционной системы для создания карт памяти.

+0

Многие современные файловые системы поддерживают прозрачное сжатие (NTFS, ZFS, другие). Как это взаимодействует с отображением памяти, я не уверен, но это может быть то, что вы ищете. – zindorsky

+0

Нет, я не хочу создавать файл. Ни в коем случае. Я хочу сохранить всю память памяти в памяти (отсюда и название) и освободить ее после использования. – Stefan

ответ

2

Очень. Система виртуальной памяти (Virtual Memory) предназначена для обработки различных объектов, которые можно сопоставить. Фактически существует файловый вызов cramfs, который делает что-то подобное в том смысле, что он хранит сжатые данные в хранилище, но обеспечивает прозрачный, несжатый доступ.

Вы не будете изменять ядро ​​как таковое, но вам придется работать в пространстве ядра, реализуя обработчики VM для этого нового типа объекта с отображением памяти.

+0

Спасибо, это выглядит довольно интересно, но (1) кажется, что он доступен только для чтения (он не доказывает, что записи возможны) и (2) он чувствует себя довольно низкоуровневым. Я надеялся на что-то, где я реализую сжатие и логику в своем собственном коде пользовательского пространства и просто использую средства операционной системы для создания сопоставления памяти. – Stefan

+0

Справа. Cramfs - это не то, что вы хотите. Я только что упомянул об этом, потому что он использует систему VM для сжатого контента, аналогичную тому, о чем вы говорите. Я не могу придумать способ сделать все это прозрачно в пользовательском пространстве. Вам, как минимум, нужно будет написать драйвер и реализовать для него интерфейс mmap. Но писать драйверы довольно стандартно. Не то же самое, что на самом деле изменять ядро. – Ziffusion

+0

Возможно, у меня было неправильное представление: я, хотя программное обеспечение, подобное [boost :: iostreams] (http://www.boost.org/doc/libs/1_53_0/libs/iostreams/doc/classes/mapped_file.html), использует общий объект для отображения X в область памяти. Возможно, именно конкретное средство ОС отображает _file_ в диапазон памяти. – Stefan

1

Это возможно, например. 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, но что-то подобное может быть реализовано в пространстве пользователя.

+0

Уфф, ок. Я явно не знал заранее, но я думал о чем-то менее навязчивом, чем о модификации самого ядра. – Stefan

Смежные вопросы