Как я могу разделить память между родительским и дочерним процессами, которые автоматически освобождают память, когда они умирают - PullRequest
1 голос
/ 25 августа 2009

Я знаю о «mmap», но насколько я знаю, хочу ли я разделить память, выделенную родительским процессом, и получить к ней доступ клиентским процессом, мне нужно создать временный файл.

Но этот файл будет продолжать существовать, если процессы умирают.

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

Решение должно работать на Linux, FreeBSD и Solaris.

Ответы [ 6 ]

2 голосов
/ 25 августа 2009

Эта статья является очень хорошей отправной точкой для совместной памяти.

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

1 голос
/ 25 августа 2009

Mmap обычно поддерживает «анонимный» режим, который не создает никакого мусора. Он работает на LInux, согласно справочной странице по Solaris, я не уверен насчет FreeBSD - посмотрите на страницу man и найдите MAP_ANON или MAP_ANONYMOUS.

0 голосов
/ 06 октября 2009

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

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

0 голосов
/ 25 августа 2009

Именованные каналы должны делать для вас, как указано выше. Вы можете использовать две трубы (если это возможно):

  1. parentpid_childpid - Родитель пишет, а ребенок читает
  2. childpid_parentpid - ребенок пишет и читает parebt.

Это работает для меня. Пожалуйста, укажите, есть ли у вас какие-то особые сенарио.

0 голосов
/ 25 августа 2009

Используйте POSIX shm_open (3) и связанные функции, чтобы отобразить память, не сохраненную файлом. Дескриптор файла, возвращаемый shm_open (), должен автоматически закрываться, если родитель и потомок перестают существовать, но я не уверен на 100%, так ли это всегда. Может быть, кто-то еще может пролить свет на это?

0 голосов
/ 25 августа 2009

выделить память в родительском. Используйте эту память как в родительской, так и в детской. Дайте ответственность за освобождение памяти родителю. Заставьте родителя ждать (ждать системного вызова) ребенка. Родитель освобождает память перед выходом.

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...