URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID13
Нить номер: 1001
[ Назад ]

Исходное сообщение
"Можно ли создавать множество контекстов для библиотеки?"

Отправлено alexraynepe196 , 12-Окт-20 12:50 
для native библиотеки в жав-приложении надо делать множество "инстансов" - запускать библиотечный код в наборе контекстов.
Поясню что происходит: библиотека эмулирует некий объект. Жава-приложение хочет работать с мнодеством независимых одинаковых объектов.
В настоящее время для переключения контекста тупо из внешнего буфера облавсть данных библиотеки копируется  целиком, и обратно сохраняется.

Есть ли знатоки, знающие как можно создать множество контекстов, и переключать их без копирования?

Насколько я понимаю, в норме разделяемые библиотеки линкуются в контексте приложения. Множество раз прилинковать одну библиотеку с разными контекстами в рдно приложение нельзя?


Содержание

Сообщения в этом обсуждении
"Можно ли создавать множество контекстов для библиотеки?"
Отправлено Аноним , 14-Окт-20 19:08 
Слова вроде бы знакомые, а о чем речь вообще непонятно

"Можно ли создавать множество контекстов для библиотеки?"
Отправлено alexrayne , 14-Ноя-20 13:21 
> Слова вроде бы знакомые, а о чем речь вообще непонятно

да, действительно неясно.
1) есть некая библиотека моделирующая некое устройство - дллка, или sharedobject
2) в среде эмулятора надо загрузить и смоделировать множество экземпляров устройств - больше 100 или 1000 скажем.
3) в текущей реализации загружается библиотека, а для каждого экземпляра хранится копия области данных используемая библиотекой. Исполняемый код остается общим. Для выполнения кода над конкретным экземпляром - область данных библиотеки перезаписывается из контейнера экземпляра.

Сейчас переключение экземпляра очень затратно - скопировать 30-60кБ данных надо, чтобы выполнить кода на сотню тактов. более 95% времени занимает это копирование.

Единственное решение обойти это место, я пока нашел - скопировать файл библиотеки в несколько независимых, и загружать эти библиотеки как независимые, получится одна библиотека/одоно устройство.

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


"Можно ли создавать множество контекстов для библиотеки?"
Отправлено Брат Анон , 19-Ноя-20 09:20 
>[оверквотинг удален]
> да, действительно неясно.

Если либа оперирует синглетоном -- тогда непонятно зачем вообще что-либо копировать. Если либа предоставляет конструктор индивидуальных объектов -- тогда пробуйте ссылку на объект создавать. Если жаба это умеет (спойлер: убейте жабу).


"Можно ли создавать множество контекстов для библиотеки?"
Отправлено Андрюша , 14-Мрт-22 16:19 
> для native библиотеки в жав-приложении надо делать множество "инстансов" - запускать библиотечный
> код в наборе контекстов.
> Поясню что происходит: библиотека эмулирует некий объект. Жава-приложение хочет работать
> с мнодеством независимых одинаковых объектов.
> В настоящее время для переключения контекста тупо из внешнего буфера облавсть данных
> библиотеки копируется  целиком, и обратно сохраняется.
> Есть ли знатоки, знающие как можно создать множество контекстов, и переключать их
> без копирования?
> Насколько я понимаю, в норме разделяемые библиотеки линкуются в контексте приложения. Множество
> раз прилинковать одну библиотеку с разными контекстами в рдно приложение нельзя?

Сделайте класс инкапсулирующий контекст "устройства". В библиотеке переделайте, чтобы её функции принимали этот контекст.

Типо С++.

В библиотеке:
void* InitDevice();
...
void CloseDevice(void *ctx);

В программе:
class Device {
private:
  void *ctx;
public:
  void Init() { this->ctx = InitDevice(); }
  ...
  void Close() { CloseDevice(this->ctx); }
}