Как сделать программу нетерпеливой?



    Программы, которые были написаны в прошлых лекциях курса «Сетевое программирование в UNIX», обладали бесконечным запасом терпения, то есть беспрекословно ждали, пока не поступят данные для обработки. В новой лекции вы узнаете, как ограничить терпение программы определенными временными рамками.

    Автор курса Александр Патраков рассказывает, как обрабатывать в сетевой программе события, привязанные ко времени, например, таймауты на прием и передачу данных. В случае с блокирующими сокетами все очень просто, с неблокирующими – чуть сложнее.

    В случае с неблокирующими сокетами для эффективного вычисления значения таймаута, которое надо передать в функцию select() или ее аналоги, можно применить структуру данных, которая называется «двоичная куча». Другое ее название — «пирамида».

    Чтобы узнать, как она работает, смотрите видео.



    Слайды доступны здесь

    Предыдущие лекции:
    1. Курс для тех, кто не боится UNIX и C
    2. Каждому клиенту по процессу
    3. Реализуем протокол или как работают астрологи
    4. О том, как читать до конца
    5. Программы в автоматном стиле — трудности перевода
    6. Как делать несколько дел одновременно и в то же время по очереди?
    7. Эффективное чтение
    • +16
    • 10,9k
    • 6

    Айдеко

    34,00

    Компания

    Поделиться публикацией
    Комментарии 6
      +4
      >В случае с неблокирующими сокетами для эффективного вычисления значения таймаута, которое надо передать в функцию select() или ее аналоги, можно применить структуру данных, которая называется «двоичная куча». Другое ее название — «пирамида».
      Типичная ошибка, которую наблюдаем в таких библиотеках как libev.
      Нужно разделять два типа таймеров: первые будем называть таймаутами, вторые таймерами.
      Таймауты — это такие таймеры, которые почти всегда будут удалены и добавлены заново, вероятность того что нам придётся его исполнить мала. Например отслеживаем когда пришёл последний пакет и если втечении 30секунд больше не прилетало пакетов, то принудительно дисконнектим.
      Таймеры же наоборот, практически всегда будут исполняться и очень редко удаляться для передобавления.

      Если у нас простое сетевое приложение и все клиенты должны обрубаться по таймауту в 30секунд, то мы можем воспользоваться обычной FIFO очередью, в которую будем добавлять таймауты, а чтобы определить сколько секунд осталось до последнего таймаут, то достаточно просто посмотреть на первый элемент в очереди, а потом передать это значение в select/etc.
      В случае если у нас множество различных таймаутов, то можем воспользоваться алгоритмом Timing Wheel.

      Ну а для таймеров отлично подойдёт Heap, rb-tree итд.
        0
        Быстро пробежался по видео, хорошее видео, про таймауты на списках там рассказывается :) Но всё же Timing Wheel для таймаутов лучше подходит.
        Если кому-то вдруг понадобится реализация Timing Wheel, то можно без особых проблем вытащить из исходников Linux ядра, либо из исходников Erlang'а.
          0
          И замечательное объяснение почему timer wheel, а не какая-то другая структура используется в линукс ядре: lwn.net/Articles/156329/
        0
        Спасибо за конструктивную критику. По поводу ссылки на LWN — действительно, в 2005 году использование Timer Wheel в качестве структуры данных было оправдано, поскольку эта структура естественным образом поддерживает «округление» времени срабатывания таймера до ближайшей jiffie, а таймеров высокого разрешения в то время не существовало.

        Современные ядра linux имеют две системы обработки событий, связанных со временем. Одна, о которой уже было сказано, основана на Timer Wheel, а другая — на rb-tree. Действительно, если следовать Вашей терминологии, первая в основном используется для таймаутов (где округление времени срабатывания допустимо и иногда даже желательно), вторая — для таймеров.
          0
          Девятая лекция курса:
          Как решить проблему 10 000 соединений?
            0
            Заключительная лекция курса:
            О производительности сетевых программ

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

            Самое читаемое