Повышение адресов отображения совместно используемой памяти - PullRequest
0 голосов
/ 21 февраля 2020

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

Это выдержки из документации повышения:

Чтобы использовать разделяемую память, мы должны выполнить 2 основных шага c:

  1. Запрос операционная система - сегмент памяти, который может быть разделен между процессами. Пользователь может создать / уничтожить / открыть эту память, используя объект общей памяти: объект, представляющий память, которая может быть одновременно отображена в адресное пространство более чем одного процесса.
  2. Ассоциировать часть этой памяти или вся память с адресным пространством вызывающего процесса. Операционная система ищет достаточно большой диапазон адресов памяти в адресном пространстве вызывающего процесса и отмечает этот диапазон адресов как специальный диапазон. Изменения в этом диапазоне адресов автоматически видны другим процессам, которые также сопоставили один и тот же объект совместно используемой памяти.

Если несколько процессов отображают один и тот же файл / совместно используемую память, адрес сопоставления, несомненно, будет отличаться в каждом обработать. Поскольку каждый процесс мог использовать свое адресное пространство по-своему (например, выделение более или менее динамической c памяти), нет никакой гарантии, что файл / общая память будет отображаться в один и тот же адрес.

Если два процесса отображают один и тот же объект по разным адресам, это делает недействительным использование указателей в этой памяти, поскольку указатель (который является абсолютным адресом) будет иметь смысл только для процесса, который его написал. Решением для этого является использование смещений (расстояния) между объектами вместо указателей: если два процесса размещаются в одном сегменте общей памяти одним процессом, адрес каждого объекта будет отличаться в другом процессе, но расстояние между ними (в байт) будет одинаковым.

Вопрос в том, что давайте предположим, что записываемые и затем считываемые данные должны быть выровнены по n байтов (для лучшей производительности ЦП), тогда как этого можно достичь, если каждый процесс видит разные адреса, которые на самом деле указывают на одни и те же данные? Процесс записи может правильно поместить данные в определенное выравнивание, но процесс получения не увидит их как выровненный адрес.

...