GenaSPB 11 16 октября, 2020 Опубликовано 16 октября, 2020 · Жалоба В любой операционной системе системные вызовы дорогая по времени операция. Потому и делают буферизацию в user space. 4 hours ago, ARV said: Вот недавно я выяснил, что современные версии винды (семерка и новее) для DLL выделяют свою память данных (раньше данные выделялись в сегменте данных главного приложения), поэтому просто так взять, и передать указатель на данные DLL нельзя, Если речь о передаче указателя между оазными процессами - этого недьзя было делать и раньше (с оговоркаи и некоторыми спц условиями можно). А вообще ни одного слова в процитированном не понял и не могу первести на язык используемый при программировании. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 0 16 октября, 2020 Опубликовано 16 октября, 2020 · Жалоба 6 минут назад, GenaSPB сказал: ни одного слова в процитированном не понял Раньше было так: исполняемый код DLL грузился в память 1 раз при первом обращении к системной функции загрузки DLL, а затем при каждом следующем вызове этой функции просто увеличивался счетчик загрузок, а код оставался в одном экземпляре. А область данных для нужд DLL выделялась в области вызывающего приложения, т.е. для каждой загрузки DLL получала память основного приложения. Разные приложения могли загружать одну и ту же DLL, и при этом код DLL был для них в одном экземпляре, а данные DLL - разные. Поэтому какая-то экспортируемая функция DLL могла вернуть указатель на данные, и основная программа могла с данными по этому указателю работать, как будто это её собственные данные. Сейчас и код, и данные при каждой "загрузке" DLL изолируются от памяти основного приложения, и никакие указатели без особых ухищрений передать из DLL в основной код нельзя. Так понятно объяснил? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 16 октября, 2020 Опубликовано 16 октября, 2020 · Жалоба Область данных для нужд DLL... Что-то новенькое.. свежепридуманное. Но явно не авторами виндов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 17 октября, 2020 Опубликовано 17 октября, 2020 · Жалоба 7 часов назад, ARV сказал: DLL получала память основного приложения. Разные приложения могли загружать одну и ту же DLL, и при этом код DLL был для них в одном экземпляре, а данные DLL - разные. Под 32-битную WinXP нет никаких проблем создать shared-секцию данных DLL, которая будет общей для всех экземпляров DLL, отображённых на память разных процессов. При этом и к памяти процесса DLL тоже имеет доступ. Под Win7 не писал DLL, но сомневаюсь что там что-то кардинально изменилось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
oxid 0 30 марта, 2021 Опубликовано 30 марта, 2021 · Жалоба Мне кажется что подход с деревом какой-то сложный. Сходу не понятно как ждать завершения фильтров, что делать после того как он вернул управление предыдущему, когда управление опять к нему попадет.. Может быть эта логика проста. Я бы такое дерево фильтров с помощью обхода в глубину (или любого другого обхода которое соответствует порядку вызова фильтров у вас) превратил в линейную последовательность простых фильтров, каждый из которых читает по-байтово (или как-то еще) данные из предыдущего фильтра и пишет в следующий. Если ему недостаточно данных, то он "ждет" поступления следующих байтов, буферизируя все внутри себя. Т.е сам фильтр выглядит как-то так void filter(Stream in, Stream out) { while(in.hasData()) { int c= in.read(); ... out.write(c*2); } } Если есть несколько процессоров, то можно и распараллелить ветки дерева.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться