Управление буферным пулом с использованием C # - PullRequest
6 голосов
/ 11 ноября 2008

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

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

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

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

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

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

Ответы [ 5 ]

4 голосов
/ 11 ноября 2008

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

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

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

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

2 голосов
/ 11 сентября 2011

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

2 голосов
/ 05 декабря 2009

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

2 голосов
/ 11 ноября 2008

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

1 голос
/ 12 ноября 2008

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

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

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

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

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

...