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

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

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

Спасибо.

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

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

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


person SemMike    schedule 06.10.2012    source источник
comment
Да, если вы реализуете свой собственный менеджер кучи поверх сопоставления файлов.   -  person Roman R.    schedule 06.10.2012
comment
Не забывайте про синхронизацию.   -  person Raymond Chen    schedule 06.10.2012
comment
@Roman, мой вопрос заключался именно в том, как использовать существующую логику управления кучей в malloc/new, а не реализовывать ее с нуля :)   -  person SemMike    schedule 06.10.2012
comment
@Raymond, если вы имеете в виду использование простой логической переменной семафора, разделяемой между процессами, то я не забуду!   -  person SemMike    schedule 06.10.2012
comment
Простая логическая переменная может оказаться недостаточно хорошей.   -  person Raymond Chen    schedule 06.10.2012
comment
Параллельный доступ, сопоставление с разными адресами в разных процессах, фиксированный размер базового сопоставления — это то, о чем я сразу подумал, с чем вам придется иметь дело. Конечно, все это можно реализовать, просто я сомневаюсь, что вы сможете применить к этому какое-либо стандартное управление кучей.   -  person Roman R.    schedule 06.10.2012
comment
@Roman: диспетчер кучи не должен знать, что кусок памяти будет общим. Нужно было бы только сообщить диспетчеру кучи, что это кусок памяти, с которым вы имеете дело, а затем он применяет к нему свою логику (я сам решаю проблемы с одновременным доступом). Какая разница, применяет ли он свою логику к существующему фрагменту (фиксированного размера) или выделяет свой собственный?   -  person SemMike    schedule 06.10.2012
comment
Менеджер кучи может быть разработан с учетом всего этого. Однако обратное неверно: не каждый хорошо работающий менеджер кучи легко доступен для работы поверх предоставленного фрагмента. Особенно, как я уже упоминал, если этот фрагмент отображается на другой адрес в другом процессе.   -  person Roman R.    schedule 06.10.2012
comment
Это недопустимо. Если вам нужна помощь в решении вашей реальной проблемы, расскажите нам, в чем она заключается.   -  person David Heffernan    schedule 06.10.2012
comment
@David: я отредактировал вопрос.   -  person SemMike    schedule 06.10.2012
comment
Похоже, вам нужна база данных. Или вам просто нужно сериализовать на диск при закрытии процесса, а затем десериализовать при его перезапуске. Это надежные решения.   -  person David Heffernan    schedule 06.10.2012
comment
@ Дэвид Я уже делаю, я загружаю большой кусок базы данных SQL Server в память и делаю что-то с данными, и я не хочу делать это каждый раз, когда перезапускаю процесс, поэтому я хочу сохранить память .. Это кажется быстрее, чем сериализация всех данных на диск только для сохранения памяти.   -  person SemMike    schedule 06.10.2012
comment
Вы должны найти решение вашей проблемы, которое работает. Даже если бы у вас была общая куча, которой у вас не может быть, это на самом деле не решило бы вашу проблему. Вызов new при перезапуске вашего процесса не приведет к тому, что память будет иметь те же значения, что и при закрытии процесса. Ваша проблема связана с сериализацией, а не с совместным использованием.   -  person David Heffernan    schedule 06.10.2012
comment
@David, когда процесс перезапускается, я бы не стал называть новый, я бы использовал существующую память - я бы только добавил фиксированную сумму к указателям, чтобы отразить другое происхождение отображаемого представления. И опять же, на самом деле это не разделяемая куча, она просто просит new выделить память из фиксированного куска памяти, который оказывается общим (но new не обязан об этом знать).   -  person SemMike    schedule 06.10.2012
comment
@David а, хорошо, я понимаю, что вы имеете в виду: после перезапуска процесса я не смогу снова использовать new, так как структуры данных управления кучей потеряны, поэтому он не знает, какие части существующей памяти уже выделены, и какие части свободны. Таким образом, мне пришлось бы сохранить весь пул памяти, используемый этой частной кучей, включая структуры данных кучи, но тогда структуры данных кучи будут содержать старые указатели, и я не могу добавить фиксированную сумму к этим указателям, не зная, как эти организованы структуры кучи... Поэтому сохранение моментального снимка кучи кажется сложным.   -  person SemMike    schedule 06.10.2012


Ответы (1)


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

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

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

person SemMike    schedule 17.10.2012