Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> использования памяти несколькими процессами? 
:(
    Опции темы
victor79
Дата 13.1.2015, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 15.5.2008

Репутация: нет
Всего: нет



как сделать в ubuntu обращение к выделенной памяти несколькими процессами? Есть объемный статистический расчет, который хотлось бы сохранить отдельно, и после использовать множество раз прилинковывая его к компилируемой программе. Расчет содержит множество структур и указателей, т.е. сохранение нужно вместе с сохранением адресов. Программа под 64 битный линукс.
PM MAIL WWW   Вверх
tzirechnoy
Дата 13.1.2015, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



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

Либо сериализуйте этот рассчёт (что, скорее всего, лучшэ всего -- поскольку скорость хорошо написанной сериализацыи сопоставима со скоростью доступа к памяти и несопоставима со скоростью записи на диск), либо сделайте свой аналог линковщика (все поля-указатели -- перевести в смещение от начала выделенной области).
PM MAIL   Вверх
Ihost
Дата 13.1.2015, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 14.9.2012

Репутация: нет
Всего: нет



Цитата(victor79 @  13.1.2015,  10:05 Найти цитируемый пост)
Как сделать в ubuntu обращение к выделенной памяти несколькими процессами? 
Есть несколько способов сделать это, и ничего сериализовать конечно же не нужно
Наиболее простой способ сделать файл, отражаемый в память, и осуществлять взаимодействие через него, но значительно лучше воспользоваться механизмами Hugepage, под управлением к примеру Inter DPDK, в таком случае в RTE вы сможете выделять именованные участки памяти заданного размера и использовать их во всех своих приложениях из проекта
Да конечно в таком случае необходимо запускать приложения в виде sudo setarch `uname -m` -R path/to/application , чтобы отключить для них действие ASLR, с которым очевидно не заработает
PM MAIL   Вверх
baldina
Дата 13.1.2015, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



"объемный статистический расчет" - сервер, программы, к которым хочется "прилинковать" - клиенты. взаимодействие - любыми механизмами IPC. memory-mapped file будет наиболее простым решением, если результаты расчета уложены в памяти последовательно. в противном случае "указатели в структурах" превращаются в умные указатели, обращение к которым приводит к взаимодействию с сервером.

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

Добавлено через 1 минуту и 51 секунду
Цитата(Ihost @  13.1.2015,  13:29 Найти цитируемый пост)
именованные участки памяти

доступ к которым опять же через перегрузку -> а не нативными указателями.
PM MAIL   Вверх
tzirechnoy
Дата 13.1.2015, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Цитата
противном случае "указатели в структурах" превращаются в умные указатели, обращение к которым приводит к взаимодействию с сервером.


До благородного безумия выдавать рута рассчётной задаче на CPU эта идея всё равно не дотягивает, как ни старайся.

Это сообщение отредактировал(а) tzirechnoy - 13.1.2015, 17:20
PM MAIL   Вверх
baldina
Дата 13.1.2015, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



человек хочет использовать "объемные результаты" без копирований и с минимальными переделками программы. первый блин... рутом)))

но таки да, процессор и ос специально предотвращают взаимное влияние процессов, обратное разрушительно...
PM MAIL   Вверх
feodorv
Дата 14.1.2015, 07:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 1
Всего: 45



Цитата(victor79 @  13.1.2015,  10:05 Найти цитируемый пост)
Расчет содержит множество структур и указателей, т.е. сохранение нужно вместе с сохранением адресов. 

Нужно создать специальный формат файла под ваши расчеты, в котором бы Вы компактно (без пропусков) могли бы хранить данные расчета. Естественно, ни о каких абсолютных значениях указателей речи быть не может, но вполне возможно заменить указатели на  относительные смещения, например, от начала файла или начала записи (какой уж Вы там её задумаете). В зависимости от характера Ваших расчетов отдельные записи файла можно упаковать с помощью библиотек zlib или bz2, если файл выходит уж слишком большим. А далее
Цитата(baldina @  13.1.2015,  14:04 Найти цитируемый пост)
memory-mapped file будет наиболее простым решением




--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
tzirechnoy
Дата 14.1.2015, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Цитата
человек хочет использовать "объемные результаты" без копирований 


Я по словам "прилинковать" и "при компилировании" -- как раз понял, что это будет  подключаться именно на этапе компиляцыи. То есть всё будет идти через диск, соответственно, с кучей копирований в процэссе.

Цитата
но таки да, процессор и ос специально предотвращают взаимное влияние процессов, обратное разрушительно...


Да там не только в этом юмор. Сейчас действительно очень сложно гарантированно разместить объект точно по тем жэ адресам, по которым он был вчера. Или, хотя бы, по которым он размещён в соседнем процэссе.
Ну, мало кому это нужно, потому и неподдержывается.

PM MAIL   Вверх
Ihost
Дата 14.1.2015, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 14.9.2012

Репутация: нет
Всего: нет



Цитата(baldina @  13.1.2015,  14:04 Найти цитируемый пост)
Доступ к которым опять же через перегрузку -> а не нативными указателями. 
Эн нет- самые что ни есть обычные указатели, с которыми можно работать самым привычным образом, конкретно
Код
// Приложение один
 const rte_memzone* my_mzone = rte_memzone_reserve(MEMZONE_NAME, MEMZONE_SIZE, 0, 0);
    if((my_mzone == NULL)||(my_mzone->len < MEMZONE_SIZE)){
        fprintf(stderr, "Can't init memzone %s", MEMZONE_NAME);
        return -1;
    }
    int8_t* base_address = (int8_t*)sh_rmq->addr;
// Приложение два
 struct rte_memzone* sh_rmq = const_cast<struct rte_memzone*>(rte_memzone_lookup(MEMZONE_NAME));
    int8_t* base_address = (int8_t*)sh_rmq->addr;
Несложно видеть, что оба приложения могут использовать в точности одни и те же адреса, начиная с base_address длиной в MEMZONE_SIZE


Цитата(baldina @  13.1.2015,  14:04 Найти цитируемый пост)
Использовать одни и те же заголовки (структуры), и физически разделять память процессами (иметь одинаковые значения указателей), не получится.
Это очень легко и органично реализуется вышеуказанным образом, и широко используется в задачах в высокими требованиями по производительности; единственный минус, как отмечалось выше- оба процесса необходимо запускать с выключенным ASLR-режимом

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0766 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.