информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsСетевые кракеры и правда о деле Левина
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Мысли по поводу 15.12.03 12:10  Число просмотров: 1498
Автор: Ktirf <Æ Rusakov> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
> 1.1 Потоки клиентов.
> Зная свою слабость к большому числу ошибок в коде, решил не
> оставлять потоки клиентов «безнадзорными». Кое-что здесь
> уже сделано. Кое-что не стал делать (для «спортивного
> интереса» было б слишком). Есть пул потоков, который можно
> контролировать из специального потока-свиппера «менеджера
> клиентских потоков».
Хм, насколько я знаю, для надежной работы пула потоков (в том числе в системах реального времени) нонче модно использовать так называемый watchdog, который регулярно извещается самим потоками о том, что эти потоки живы. И я, чесговоря, не вижу, почему это может быть плохо. Порядок действий в этом случае такой: рабочий поток произвольным образом (например, через UDP) извещает следящий процесс о том, что этот рабочий поток жив. Если следящий процесс в течение определенного времени не получает сигнала от рабочего потока, он прибивает рабочий поток (скажем, через kill(SIGKILL)), и перезапускает новый поток - преемника убитого. Такой способ быстрее, чем предложенный, и не требует взаимной синхронизации за исключением механизма посылания сообщения.

> Здесь было сказано о буфере ввода/вывода клиентского
> потока, см. stream_buf в структуре CLIENTINFO выше. Вообще,
> на мой взгляд, это вопрос – как выделять память потоку для
> буфера ввода/вывода? В той реализации, которая сделана из
> «спортивного интереса» – сделано дубово. Память выделяется
> в одной, общей куче процесса. Какие идеи в части памяти,
> господа?
Ну а какие тут могут быть идеи... Не использовать же thread local storage. А раз не использовать, то из многочисленных соображений (фрагментация памяти, производительность выдачи и освобождения памяти и проч.) лучше написать свой менеджер памяти, который и будет заниматься организацией всего этого безобразия. Алгоритм работы менеджера целиком и полностью зависит от конкретного приложения и даже от конкретных условий работы этого приложения.

> тем, как выделяется? Проще и быстрее всего, с точки зрения
> доступа – realloc (поэтому-то и realloc).
Не могу сказать, что realloc - это самое быстрое, что можно использовать в нашем случае. См. выше.

> 1.3 Клиент.
> В работе клиента есть одна особенность – возможно большие
> таймауты, когда пользователь пошёл покурить...
> ...
> Таким образом, мне кажется, что в любом мало-мальски
> нормальном прикладном протоколе, рассчитанном на длительные
> соединения (имеется ввиду только TCP, а не соединения с
> DBMS) обрабатывать длительные таймауты следует
> самостоятельно. Не проблема это включить в обсуждаемый
> протокол. Не очень ясно другое, как это сделать в
> реализации сервера и клиента. Например, на клиенте
> придётся или делать это в отдельном потоке (все данные и
> получаем и отсылаем в отдельном потоке) – изврат, или
> использовать асинхронные сокеты Windows в сочетании с
> таймерами (для организации обычных таймаутов чтения/записи
> в сокет).
> Какие идеи, господа?
В отдельном-то потоке зачем? Ставим select, а для keep-alive-сигналов либо создаем специальный формат сообщения, который будет отлавливаться еще до передачи в рабочие потоки, либо открываем дополнительное соединение, по которому только кипалайвы и шлются.

> 2.1 Сетевой порядок байт.
> ООО!!! Неоднократно встречал на форумах, в том числе и в
> faq-ах от гуру, что, дескать, не забывайте, ламеры, про
> сетевой порядок байт. Зачем?!!! Наивные. Да у них (у гуру)
> крыша поехала. Это ж прикладной протокол. Какая здесь
> разница. Всё равно клиентов под разные платформы придётся
> компилировать отдельно. Там (на платформах отличных от
> Intel) и учесть можно – делать htons, или нет. Другие
> мнения есть?
Есть. Зачем выбирать, делать или не делать htons, если можно всегда его делать?

> 2.2 Выравнивание заголовка по границе слова.
> ...
> Заголовок вычитывается из сокета «первым». Здесь не так
> важно сколько читать – 11 байт, или 12. Другое дело,
> насколько эффективным будет следующий шаг – вычитывание
> «невыровненных» данных (что за заголовком) из буфера
> сокета.
> Какие будут мнения, товарищи?
По-моему, это не имеет большого значения. А поле reserved лучше иметь всегда.

> 2.3 Выравнивание полей в заголовке.
> Похоже на предыдущий пункт. И здесь логики больше. Хотя,
> тоже с учётом возможностей современных компиллеров,
> сомнительно. Речь идёт о том, что слово выравниваем по
> границе слова, а двойное слово – по границе двойного слова.
> Придерживаюсь пока правил. А по правде – насколько это
> актуально сейчас (чай не 80-е годы на дворе)?
Актуально, но не в нашем случае. Это интересно для выжимания производительности на локальной машине, а когда появляется сеть и/или доступ к БД... Характерные времена уже не те, чтобы это было заметно. ИМХО.

> 2.4 Контрольная сумма.
> ...
> Вставляется эта проверка движением руки. Потери
> производительности – никакой. А сомнения здесь такого рода
> – хорошо «вылизанный» код не требует проверки checksum.
Требует. "Нам не дано предугадать", в каком месте наш софт слетит. И не стоит уповать на вылизанность кода, тем более что потери производительности действительно никакой.
<programming> Поиск 






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 1 s   Design: Vadim Derkach