Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / new&delete for Unix shared memory / 11 сообщений из 11, страница 1 из 1
19.09.2006, 14:54
    #33996977
onstat-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
new&delete for Unix shared memory
Привет.

Я тут на досуге занялся
размещением экзекмляров класса(ов) в разделяемой памяти Unix.

Исходя из этого вопросы:

1. Есть класс, в параметрах конструктору передаются
значения из которых можно посчитать объем необходимой для
выделения памяти для экземпляра класса.
У него переопределены операторы new & delete.
Как из new добраться до параметров с которыми
вызывается конструктор.
И возможно ли это в приципе?


Вопрос 2.
Как запретить создане экзепляра класса в стеке, чтобы компиллер(GCC) ругался сразу при компиляции либо линковке.


ps Ссылки по теме приветстуются.
...
Рейтинг: 0 / 0
19.09.2006, 15:26
    #33997067
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
new&delete for Unix shared memory
1) залась в стек
2) ишь ты чего!
...
Рейтинг: 0 / 0
19.09.2006, 17:07
    #33997519
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
new&delete for Unix shared memory
Круто, ты еще класс с виртуальными функциями туда запхай
...
Рейтинг: 0 / 0
19.09.2006, 17:57
    #33997733
onstat-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
new&delete for Unix shared memory
blindedКруто, ты еще класс с виртуальными функциями туда запхай

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

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

Или Вам извесны другие проблемы в этой области?


Меня пока интересует принцип применения данного подхода и
какими уже извесными граблями можно получить по лбу :)
...
Рейтинг: 0 / 0
19.09.2006, 21:06
    #33998123
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
new&delete for Unix shared memory
ты понимаешь прелесть разделяемой памяти как раз в том что к ней могут полключатся не только процессы порожденные каким-то одним процессом. это могут быть процессы порожденные в разное время разными пользователями, более того она может существовать когда к ней не подключен ни один процесс... в общем случае в разделяемую память можно помещать только обекты конкретных классов, никаких таблиц виртуальных функций...
Тепер, что касается выделения памяти. со вторым вопросом надеюсь все ясно, без хаков понять где расположен обект на хипе, стэке и тп понять нельзя.
что касается вопроса 1 то непонятно зачем вам это - добираться до параметров конструктора. вам же передадут в new кол-во байтов. а ежели требуется внутри конструктора выделить память так и обращайтесь в своему распределителю. Ежеди требуется STL контейнеры разместить - ну так переписывайтк allocator
...
Рейтинг: 0 / 0
20.09.2006, 10:47
    #33998804
onstat-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
new&delete for Unix shared memory
blindedты понимаешь прелесть разделяемой памяти как раз в том что к ней могут полключатся не только процессы порожденные каким-то одним процессом. это могут быть процессы порожденные в разное время разными пользователями, более того она может существовать когда к ней не подключен ни один процесс... в общем случае в разделяемую память можно помещать только обекты конкретных классов, никаких таблиц виртуальных функций...


С этим мне все ясно, спасибо.
С виртуальными функциями действительно будут некоторые пробемы.

blinded
Тепер, что касается выделения памяти. со вторым вопросом надеюсь все ясно, без хаков понять где расположен обект на хипе, стэке и тп понять нельзя.
что касается вопроса 1 то непонятно зачем вам это - добираться до параметров конструктора. вам же передадут в new кол-во байтов. а ежели требуется внутри конструктора выделить память так и обращайтесь в своему распределителю. Ежеди требуется STL контейнеры разместить - ну так переписывайтк allocator

Если смотреть на сами классы то они будут выглядеть приблизительно так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class sh_someclass
{
shmid_ds  s_desc;
unsigned long s_objcnt;
another_some_class    s_object[];
public:
sh_someclass(unsigned long f_howmany):s_objcnt(f_howmany)
{........}
~sh_someclass(){....};
};

Так как количество элементов массива будет извесно только
на этапе выполнения и их будет достаточно много
( несколько сотен тысяч), то хочется разделяемую память выделить один раз и сразу под все одним оператором new.

Похоже ничего из этого не выйдет.

Идея была в том чтобы в хипе не хранить кучу указателей на разделяемую память(сэкономить).
...
Рейтинг: 0 / 0
20.09.2006, 17:33
    #34000806
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
new&delete for Unix shared memory
можно проднлать следю трюк - спрятать конструктор в private, на всеющее обозрение вытащить производящую фенкцию (статчкский метод класса, все равно у нас классы конкретные) А эту статическую функцию реализовать след. образом
1) отдельно выделение памяти в shared memory рамер обекта + размер массива
2) вызов оператора new с явным размещением по указанному адресу
Этим решается и первая и вторая проблемы
1)объект кроме как в разделяемой памяти не создашь
2)ну и размещаем его одним куском
Ps ежели полкчится поделись... А то тут жаба на грудь упала и продыха нет
PPS Колобок, прости, видишь пригодилось...
...
Рейтинг: 0 / 0
20.09.2006, 21:29
    #34001422
onstat-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
new&delete for Unix shared memory
blindedможно проднлать следю трюк - спрятать конструктор в private, на всеющее обозрение вытащить производящую фенкцию (статчкский метод класса, все равно у нас классы конкретные) А эту статическую функцию реализовать след. образом
1) отдельно выделение памяти в shared memory рамер обекта + размер массива
2) вызов оператора new с явным размещением по указанному адресу
Этим решается и первая и вторая проблемы
1)объект кроме как в разделяемой памяти не создашь
2)ну и размещаем его одним куском
Ps ежели полкчится поделись... А то тут жаба на грудь упала и продыха нет
PPS Колобок, прости, видишь пригодилось...

Огромное СПАСИБО за совет.

Что из этого вышло(см аттач):

1. Конструктор спрятать не удалось.

2. Объекты массива размещаются правильно(см. shm.dmp) и там где нужно.

3. Для обьектов массива не вызываются конструкторы и деструкторы
по умолчанию,
хотя сами обьекты якобы живые, обращение к медодам не приводит к
падению. Им нужно тоже писать оператор new или
new [] и инициализировать явно.
Как зделать автоматический вызов я пока не знаю.

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

Разделение доступа между процессами там пока нет.

з.ы. Конструктиваная критика приветствуется.
...
Рейтинг: 0 / 0
20.09.2006, 21:30
    #34001426
onstat-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
new&delete for Unix shared memory
...
Рейтинг: 0 / 0
21.12.2006, 21:09
    #34217275
onstat-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
new&delete for Unix shared memory
blindedКруто, ты еще класс с виртуальными функциями туда запхай

Кстате оцените идею.

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

По идее таблицы виртуальных методов будут находиться во всех процессах
по одним адресам.

Будет ли библиотека будет разруливать правильность адресов?
Насклько технологичным будет такой подход?
На какие подводные камни можно при этом налететь?
...
Рейтинг: 0 / 0
22.12.2006, 11:42
    #34218228
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
new&delete for Unix shared memory
библиотека может загрузиться не по одному адресу
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / new&delete for Unix shared memory / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]