Bip Buffer – Circular Buffer

    • #76520
      Николай
      Ключник

      cheblin

      13 авг 2022, 16:16
      The Bip Buffer – The Circular Buffer with a Twist
      откровенно не понимаю для чего это. ну да функции принимают аргуменом обычные неразрывные области памяти…
      так что мешает передать в функцию указатель не самого буфера, а места с которого в буфере начинаются данные и их длинну? это ж С/С++ а не JAVA какая нибудь… даже С# уже научился передавать указатель на элемент в массиве…
      ну да, если данные в конце, на стыке придется сначала передавать хвост, а следующим вызовом с начала..
      там ещё патенты упоминаются
      US20110320733A1 – Cache management and acceleration of storage media
      US9323659B2 – Cache management including solid state device virtualization
      чувствую себя тупым.
      объясните дураку пользу.
      PS там он говорит типа пользовал это в UDP, всеравно не прокатывает, UDP сокету нужно сразу передавать буфер с размером максимально возможных данных, иначе будет потеря.

      First, to my knowledge, I invented this algorithm as presented here before anyone else, and independently from anyone else (I needed it to accelerate some UDP networking I was doing for control programs for a mass spectrometer I was helping to prototype software for). I’m not presenting anyone else’s invention. And everything is obvious after it’s published, with 20/20 hindsight.

      короче караул…
      кто, чего, понялб чего не понял я ?
      обратите внимание, всё это от 20 Jul 2020 года.
      у этой истории активное продолжение в Rust,
      форум ниман ру
      в виде BBQueue собственно как и вышел на ЭТО…
      уже выкладывал видосик с его обяснениями но яснее не становится, откуда у него уверенность какой именно пакет прилетит и сколько байт в нем будет

      u37

      13 авг 2022, 17:10
      Насколько я понял, это гранулированный Circular Buffer. Если блок обработки имеет длину N, то в буфере емкость N*k на k записей (блоков обработки), условно. Один блок обработки = минимальная единица, кторая выбирается из буфера.
      Например, предполагается получать данные из UART блоками от 8 до 15 байт. Для чего выделяется буфер на 1000+14=1014 байт. При этом, под данные закладявается 1000 байт, а хвост на 14 байт (макс. длина=15 -1) для гарантированного приема последней команды до перехлеста. Работает как обычный цикл. буфер на 1000 байт, но с монотонной выборкой всей_команды. Модификация не сложная, если заранее известна макс. длина единичной записи, зато нет нужды что-то копировать и проверять границы при работе функций.
      /IMHO

      amaora

      13 авг 2022, 17:37
      cheblin писал(а):
      ну да, если данные в конце, на стыке придется сначала передавать хвост, а следующим вызовом с начала..

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

      cheblin

      13 авг 2022, 17:43
      спасибо, понятно.
      естественно в сетевых протоколах существуют кванты(атомы) получение который должно быть целостным(неделимым), например получение примитива или получение UTF8, однако, это квантование не может быть видно на таком низком уровне и принимать решение на нем невозможно.
      да, это конечно непростая задача… при приёме данных нужно быть готовым, что прилетит как 1 байт так и 1000500 и передавать на обработку на другой уровень нужно вне зависимости от того сколько прилетело. даже если это 1 байт(!) вдруг это как раз тот самый последний байт уже полученного огромного пакета, которого так не хватает завершения получения и передачи его на обработку.
      да, в итоге это гигантсткая стэйт машина с хулиардом case в switch
      да, вручную такое решать – просто застрелиться, поэтому кодогенерация рулит.
      так вот с учётом выше сказанного… попрежнему не вижу ценности по ссылкам. тем более патентование..

      cheblin

      13 авг 2022, 17:46
      Цитата:
      Два раза вызвать функцию с одним и вторым куском это не всегда то же самое, что и один раз вызвать.

      если подобное происходит с функцией в конетксте сетевого приложения, то это функция негодная.
      точка.
      переписывать всё нафиг.
      уже проходили.

Viewing 0 reply threads
  • Вы должны войти в систему, чтобы ответить в этой теме.
Интepecнoe нa фopумe:
Авторизация
*
*
Регистрация
*
*
*
Генерация пароля
×