Shm_open фиксирует фиксированный объем физической памяти? - PullRequest
0 голосов
/ 31 августа 2018

Мой друг работает над библиотекой для систем Linux с ограниченным объемом памяти. Он предлагает использовать shm_open для выделения нескольких объемов памяти разумного размера (16 МБ) для межпроцессного взаимодействия между различными программами на компьютере пользователя.

Проблема, которая возникла, заключается в том, что если выделено много буферов (скажем, 128), то 128 & times; 16 МБ может быть нетривиальной долей доступной системной памяти, и есть большая вероятность того, что не так много зарезервированной памяти будет фактически использовано. Например, если бы, скажем, только 128 КБ этой памяти в каждом буфере фактически использовалось для чего-либо, этот подход использовал бы около 1/128 зарезервированной памяти. Из-за ожидаемых схем доступа, вероятно, что в любой момент времени «горячие» только «маленькие» области каждого буфера будут

Я сверился с man-страницами для shm_open, в которых упоминалось, что конкретно в Linux реализация использует tmpfs для выделенной памяти. Страница man для tmpfs, в свою очередь, говорит, что выделенная память может быть выгружена из памяти, если на машине присутствует давление физической памяти. В нем также говорится, что будет выделено только место, необходимое для хранения используемого содержимого файловой системы.

Читая это, я предполагаю, что верно следующее:

  1. Использование shm_open для выделения 16 МБ пространства не обязательно сразу потребляет 16 МБ физической памяти на машине, поскольку большая часть файловой системы будет иметь нулевые страницы, которые ОС будет лениво распределять. Используемое пространство будет пропорционально количеству записанных данных.

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

Являются ли эти предположения разумными? Это то, что в принципе может быть проверено эмпирически, но проблема в том, что мы столкнемся с вопросами типа «да, это работает в вашей системе, но в целом это не так для других установок Linux».

1 Ответ

0 голосов
/ 31 августа 2018

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

Общая память может быть заблокирована в ОЗУ с помощью mlock(), но это не делается автоматически, и нет никаких причин, почему это необходимо. Это просто виртуальная память.

...