Bezdepbonusu7Программирование: статьи и ответы

Вопрос

(Win32) Куча, разделенная между процессами

Автор вопроса: SemMikeОтветов: 1

Можно ли создать общий пул памяти между процессами (например, из CreateFileMapping с INVALID_HANDLE_VALUE в Win32), а затем использовать этот кусок памяти как кучу?

Я хотел бы, чтобы операторы new/delete (или malloc/free) выделяли/освобождали память из этого фрагмента (и выполняли на нем свое обычное управление кучей).

Спасибо.

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

Для этого я бы создал кусок общей памяти с CreateFileMapping во вспомогательном процессе, а в основном процессе сказал бы тем new/delete, которые используются для выделения структур, использовать этот кусок вместо кучи процесса.

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

  • Да, если вы реализуете свой собственный менеджер кучи поверх сопоставления файлов. Roman R. 06.10.2012
  • Не забывайте про синхронизацию. Raymond Chen 06.10.2012
  • @Roman, мой вопрос заключался именно в том, как использовать существующую логику управления кучей в malloc/new, а не реализовывать ее с нуля :) SemMike 06.10.2012
  • @Raymond, если вы имеете в виду использование простой логической переменной семафора, разделяемой между процессами, то я не забуду! SemMike 06.10.2012
  • Простая логическая переменная может оказаться недостаточно хорошей. Raymond Chen 06.10.2012
  • Параллельный доступ, сопоставление с разными адресами в разных процессах, фиксированный размер базового сопоставления - это то, о чем я сразу подумал, с чем вам придется иметь дело. Конечно, все это можно реализовать, просто я сомневаюсь, что вы сможете применить к этому какое-либо стандартное управление кучей. Roman R. 06.10.2012

shared-memorywinapiheap

Ответы

Ответ 1 · рейтинг 1 · SemMike

Спасибо людям, которые прокомментировали.

Отвечая на мой собственный вопрос:

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы