2008-11-11 9 views
6

Нам нужно разработать какое-то управление буфером для приложения, которое мы разрабатываем с использованием C#.Управление пустым буфером с использованием C#

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

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

Таким образом, поток будет «Получить буфер» (обработать его) «Буфер освобождения» или «Оставьте его в пуле». Нам также необходимо знать, когда заполнялся буфер.

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

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

ответ

4

Управление памятью на уровне C# на самом деле неплохое, поэтому вместо того, чтобы иметь пул буферов, вы можете просто выделить именно то, что вам нужно, и вставить его в очередь. Как только вы закончите с буфером, просто разрешите сборщику мусора справиться с этим.

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

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

Надеюсь, это поможет.

+0

Неплохая идея. все, что делает что-либо с interop, приведет к фрагментации (и приведет к исключениям из памяти) из-за того, что GC должен связывать объекты. – 2009-01-22 06:13:53

+2

Взаимодействие между чем? Потоки? Приложения? Процессы? – grieve 2009-01-25 20:03:46

+0

Я думаю, что nzpcmad работает с чистым управлением без P/Invoke. – user7116 2009-12-04 22:06:24

2

Почему бы вам просто не получить сообщения, создать объект DeviceMessage (из-за отсутствия лучшего имени) и поместить этот объект в очередь? Если важна приоритизация, используйте класс PriorityQueue, который обрабатывает это автоматически (путем размещения объектов DeviceMessage в порядке приоритета, когда они вставлены в очередь). Похоже, что это более OO-подход и упростит обслуживание с течением времени в отношении приоритезации.

1

Я делаю что-то подобное. У меня есть сообщения, входящие в потоки MTA, которые необходимо обслуживать в потоках STA.

Я использовал BlockingCollection (часть параллельных расширений fx), который контролируется несколькими потоками STA (настраивается, но по умолчанию - xr * количество ядер). Каждый поток пытается вывести сообщение из очереди. Они либо тайм-аут, либо попытка повторить попытку или успешно вывести сообщение и обслуживать его.

У меня есть проводник с счетчиками perfmon, чтобы отслеживать время простоя, продолжительность работы, входящие сообщения и т. Д., Которые можно использовать для настройки настроек очереди.

Вам необходимо реализовать пользовательскую коллекцию или, возможно, расширить BC, чтобы реализовать приоритеты элементов очереди.

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

2

@grieve: Networking является родным, что означает, что, когда буферы используются для приема/отправки данных в сети, они закрепляются в памяти. см. мои комментарии ниже для уточнения.

2

Я знаю, что это старый пост, но я думаю, вам стоит взглянуть на пул памяти, реализованный в проекте ILNumerics. Я думаю, они сделали именно то, что вам нужно, и это очень хороший код. Загрузите код на http://ilnumerics.net/ и посмотрите файл ILMemoryPool.cs

Смежные вопросы