![]() |
Модераторы: xvr |
![]() ![]() ![]() |
|
victor79 |
|
|||
программист ![]() Профиль Группа: Участник Сообщений: 211 Регистрация: 15.5.2008 Репутация: нет Всего: нет |
как сделать в ubuntu обращение к выделенной памяти несколькими процессами? Есть объемный статистический расчет, который хотлось бы сохранить отдельно, и после использовать множество раз прилинковывая его к компилируемой программе. Расчет содержит множество структур и указателей, т.е. сохранение нужно вместе с сохранением адресов. Программа под 64 битный линукс.
|
|||
|
||||
tzirechnoy |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 3 Всего: 16 |
В таком виде, как Вы описали задачу -- никак, просто забудьте. Современные ОС для обычных приложэний не гарантируют размещение данных по одним и тем жэ дажэ виртуальным адресам.
Либо сериализуйте этот рассчёт (что, скорее всего, лучшэ всего -- поскольку скорость хорошо написанной сериализацыи сопоставима со скоростью доступа к памяти и несопоставима со скоростью записи на диск), либо сделайте свой аналог линковщика (все поля-указатели -- перевести в смещение от начала выделенной области). |
|||
|
||||
Ihost |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 14.9.2012 Репутация: нет Всего: нет |
Наиболее простой способ сделать файл, отражаемый в память, и осуществлять взаимодействие через него, но значительно лучше воспользоваться механизмами Hugepage, под управлением к примеру Inter DPDK, в таком случае в RTE вы сможете выделять именованные участки памяти заданного размера и использовать их во всех своих приложениях из проекта Да конечно в таком случае необходимо запускать приложения в виде sudo setarch `uname -m` -R path/to/application , чтобы отключить для них действие ASLR, с которым очевидно не заработает |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
"объемный статистический расчет" - сервер, программы, к которым хочется "прилинковать" - клиенты. взаимодействие - любыми механизмами IPC. memory-mapped file будет наиболее простым решением, если результаты расчета уложены в памяти последовательно. в противном случае "указатели в структурах" превращаются в умные указатели, обращение к которым приводит к взаимодействию с сервером.
без переделки, т.е. использовать одни и те же заголовки (структуры), и физически разделять память процессами (иметь одинаковые значения указателей), не получится. Добавлено через 1 минуту и 51 секунду доступ к которым опять же через перегрузку -> а не нативными указателями. |
|||
|
||||
tzirechnoy |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 3 Всего: 16 |
До благородного безумия выдавать рута рассчётной задаче на CPU эта идея всё равно не дотягивает, как ни старайся. Это сообщение отредактировал(а) tzirechnoy - 13.1.2015, 17:20 |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
человек хочет использовать "объемные результаты" без копирований и с минимальными переделками программы. первый блин... рутом)))
но таки да, процессор и ос специально предотвращают взаимное влияние процессов, обратное разрушительно... |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 1 Всего: 45 |
Нужно создать специальный формат файла под ваши расчеты, в котором бы Вы компактно (без пропусков) могли бы хранить данные расчета. Естественно, ни о каких абсолютных значениях указателей речи быть не может, но вполне возможно заменить указатели на относительные смещения, например, от начала файла или начала записи (какой уж Вы там её задумаете). В зависимости от характера Ваших расчетов отдельные записи файла можно упаковать с помощью библиотек zlib или bz2, если файл выходит уж слишком большим. А далее -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
tzirechnoy |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 3 Всего: 16 |
Я по словам "прилинковать" и "при компилировании" -- как раз понял, что это будет подключаться именно на этапе компиляцыи. То есть всё будет идти через диск, соответственно, с кучей копирований в процэссе.
Да там не только в этом юмор. Сейчас действительно очень сложно гарантированно разместить объект точно по тем жэ адресам, по которым он был вчера. Или, хотя бы, по которым он размещён в соседнем процэссе. Ну, мало кому это нужно, потому и неподдержывается. |
||||
|
|||||
Ihost |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 14.9.2012 Репутация: нет Всего: нет |
|
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "С/С++: Программирование под Unix/Linux" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |