2016-04-25 4 views
1

Если процесс вызывает mmap(...,MAP_ANONYMOUS | MAP_SHARED,...) и forks N детей, возможно ли для любого из этих процессов (родителя или потомков) до munmap() памяти для всех процессов за один раз, таким образом, освобождая физической памяти или каждый из этих процессов должен munmap() индивидуально? (Я знаю, что память будет отключена при выходе процесса, но дети еще не выйдут).linux: munmap shared memory in on one call

В качестве альтернативы, есть способ переместить память из другого процесса? Я думаю о вызове что-то вроде munmap(pid,...).

Или есть способ достичь того, что я ищу, используя неанонимные сопоставления и выполнение операции над связанным файловым дескриптором (например, закрытие файла)?

Мои процессы чувствительны к производительности, и я хотел бы избежать выполнения множества IPC, когда станет известно, что общая память больше не будет использоваться кем-либо.

+0

Я не думаю, что можно «unmap» отображать другие процессы. –

ответ

1
  1. Нет, нет возможности разархивировать память за один раз.
  2. Если вам не нужна сопоставленная память в дочерних процессах, вы можете пометить сопоставления с madvise(MADV_DONTFORK) перед форкировкой.
  3. В чрезвычайных ситуациях, вы можете вызывать системные вызовы внутри внешних процессов с помощью GDB:

    1. Рисунок из PID целевого процесса
    2. Список отображенной памяти с cat /proc/<PID>/maps
    3. Приложить обрабатывать с помощью GDB: gdb -p <PID> (он приостановит выполнение целевого процесса)
    4. Запуск из gdb: call munmap(0x<address>, 0x<size>) для каждого региона, который необходимо размонтировать
    5. Выход из gdb (выполнение процесса возобновляется)

    Должно быть очевидно, что если ваш процесс попытается получить доступ к несмонтированной памяти, он получит SIGSEGV. Итак, вы должны быть на 100% уверены, что делаете.

+0

1) Думаю, это ответ. не тот, который я хотел, но ответ. 2) В моем случае процессы действительно используют память некоторое время. В противном случае я бы не стал делиться этим с самого начала. 3) здесь не имеет значения. Это не был отладочный вопрос. Спасибо за информацию в любом случае – user1159290

+0

Если 'gdb' может вызывать' munmap' с помощью интерфейса 'ptrace()', то вы можете написать программу для этого - отладчики не имеют особой привилегии. Вероятно, это не будет тривиально, поскольку вам нужно будет переопределить большую часть кода GDB ... –