Как переназначить файл mmap (2) в памяти как shmget - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть массивный файл, т. Е. 1TiB, который принадлежит как 'filehandler', разрешено rwx ------.Я mmap (2) -ed его в 64-битное адресное пространство, и все работает успешно.Этот файл обрабатывается процессом, выполняющимся от имени пользователя 'filehandler'.

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

Из-за соображений безопасности весь файл не должен передаваться запрашивающим.В файле разрешен доступ только некоторым частям для запрашивающих процессов.

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

Например, shm дает ключ для доступа к сегменту для других процессов, это практическая цель для запрашивающей стороны.

Есть ли способ разделить только разрешенные части пространства mmap (2) с любымпроцессы, идентифицированные как технология shm?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Нет связи между реализациями системного вызова shmget (реализация, полученная из системы V AT & T) и mmap (реализация, полученная из системы BSD Беркли) Это правда, что в системах BSD общая память AT & T реализуется с использованием mmap редактировать частные сегменты без прикрепленного файла, но это также бесполезно, потому что вам нужно связать общий сегмент с файлом.

Как вам нужно, единственная возможность поделиться сегментами памяти, относящимися к файлусодержимое осуществляется с помощью системного вызова mmap, поскольку сегменты разделяемой памяти System V. не имеют средств для привязки файла к ним.

Все эти ресурсы (SysV или BSD) имеют набор битов разрешений, связанных сте, которые позволяют использовать их с некоторой безопасностью, но, как это происходит с файлами, только глобальным (весь ресурс) способом, что дает вам возможность получить доступ ко всему или вообще ничего.

Кстати, выможет реализовать то, что вы хотите с помощью копирования содержимого сегмента в другойivate, сегмент (только размер, который вы хотите, чтобы клиент мог видеть), только сегменты, к которым ему разрешен доступ, и таким образом вы можете лучше контролировать, кому и что разрешено делать клиентам.

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

С моей точки зрения, вы немного усложняете вещи, но вы лучше знаете, как разрабатывается ваше приложение, чем я.

0 голосов
/ 14 февраля 2019

Есть ли способ поделиться только разрешенными частями пространства mmap (2) для любых процессов, идентифицированных как технология shm?

TL; DR : Нет.


Более подробно,

Как переназначить файл mmap (2) в памяти как shmget

mmap() и shmget() на самом деле не сопоставимы.Лучшее сравнение было бы между комбинацией shm_open() / ftruncate() / mmap() с одной стороны и комбинацией shmget() / shmat() с другой.Это основные альтернативы в POSIX для создания помеченных сегментов совместно используемой памяти и отображения их в адресное пространство процесса.Вы должны признать, что аналог shmget() равен shm_open(), а аналог mmap() в этом контексте равен shmat().

Теперь вернемся к

Есть ли способ поделиться только разрешенными частями пространства mmap (2) для любых процессов, идентифицированных как технология shm?

Обратите внимание, что в обоих случаях выше, это отображаемый объект(сегмент разделяемой памяти), который обеспечивает совместное использование между несвязанными процессами, а не с самим mmap().То же самое применяется, когда mmap() отображает любой другой тип объекта, например обычный файл.Это всегда сопоставленный объект, через который передается любой общий доступ.Так должно быть, потому что отображение памяти является свойством одного процесса - оно само по себе не может использоваться совместно.

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

...