Перейти к содержанию
    

Обработка потока данных - как реализуется концептуально?

В любой операционной системе системные вызовы дорогая по времени операция.
Потому и делают буферизацию в user space.

4 hours ago, ARV said:

Вот недавно я выяснил, что современные версии винды (семерка и новее) для DLL выделяют свою память данных (раньше данные выделялись в сегменте данных главного приложения), поэтому просто так взять, и передать указатель на данные DLL нельзя,

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, GenaSPB сказал:

ни одного слова в процитированном не понял

Раньше было так: исполняемый код DLL грузился в память 1 раз при первом обращении к системной функции загрузки DLL, а затем при каждом следующем вызове этой функции просто увеличивался счетчик загрузок, а код оставался в одном экземпляре. А область данных для нужд DLL выделялась в области вызывающего приложения, т.е. для каждой загрузки DLL получала память основного приложения. Разные приложения могли загружать одну и ту же DLL, и при этом код DLL был для них в одном экземпляре, а данные DLL - разные. Поэтому какая-то экспортируемая функция DLL могла вернуть указатель на данные, и основная программа могла с данными по этому указателю работать, как будто это её собственные данные.

Сейчас и код, и данные при каждой "загрузке" DLL изолируются от памяти основного приложения, и никакие указатели без особых ухищрений передать из DLL в основной код нельзя. Так понятно объяснил?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Область данных для нужд DLL... Что-то новенькое.. свежепридуманное. Но явно не авторами виндов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 часов назад, ARV сказал:

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

Под 32-битную WinXP нет никаких проблем создать shared-секцию данных DLL, которая будет общей для всех экземпляров DLL, отображённых на память разных процессов. При этом и к памяти процесса DLL тоже имеет доступ.

Под Win7 не писал DLL, но сомневаюсь что там что-то кардинально изменилось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Я бы такое дерево фильтров с помощью обхода в глубину (или любого другого обхода которое соответствует порядку вызова фильтров у вас) превратил в линейную последовательность простых фильтров, каждый из которых читает по-байтово  (или как-то еще) данные из предыдущего фильтра и пишет в следующий. Если ему недостаточно данных, то он "ждет" поступления следующих байтов, буферизируя все внутри  себя.

Т.е сам фильтр выглядит как-то так

void filter(Stream in, Stream out) {

  while(in.hasData()) {

     int c= in.read();

     ...

     out.write(c*2);

  }

}

Если есть несколько процессоров, то можно и распараллелить ветки дерева..

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...